[[20231128153636]] 『プロパティやメソッド?を追加で登録したい』(VBA超超超初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『プロパティやメソッド?を追加で登録したい』(VBA超超超初心者)

お世話になります。

検索しても情報が得られなかったので質問させてください。

いま、シート上の複数セルにひとかたまりの情報が並んでいるとします。

	A	B	C	D	E	F
1	No1	100		No2	200	
2	AAA	20		BBB	30	
3						
4						
5	No3	300		No4	400	
6	CCC	40		DDD	50	
7						

このとき、基準となるセルの1つ下の値(型番とします)を取りたいとき、

	Range("A1").Offset(1, 0).Value

というように書きますが、これを

	Range("A1").型番

というようにプロパティ?メソッド?みたいな感じで使いたいのですが、
どのように定義すればこのように使えるでしょうか。

また不可能な場合は、これに近い使い方ができる代替案等教えていただきたいと思います。

よろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 プロパティやメソッドをユーザーが追加することはできません。
 Function プロシージャを作成してください。
(xyz) 2023/11/28(火) 16:03:48

xyz さん

ありがとうございます。

では、Functionを用いて上記の様な使い方をしたいのですが、
実装方法を教えていただきたいです。
以下イメージ

Function 型番()

    型番 = (Rangeオブジェクト).Offset(1, 0).Value

End function

   Debug.Print Range("A1").型番

よろしくお願いいたします。
(VBA超超超初心者) 2023/11/28(火) 16:29:52


 Function 型番(r As Range) As Variant
     型番 = r.Offset(1, 0).Value
 End Function

 Debug.Print 型番(Range("A1"))
 です。

 # 入門テキストを復習されたほうが効率がいいかも知れませんね。 
(xyz) 2023/11/28(火) 17:08:39

xyz さん

すみません、Functionの使い方はわかるのですが、
それを用いて以下のような書き方をどのように実現できるかお聞きしたかったのです。

例 Debug.Print Range("A1").型番
レンジオブジェクト→種類の順に指定したい

よろしくお願いいたします。

(VBA超超超初心者) 2023/11/28(火) 17:23:56


 >  プロパティやメソッドをユーザーが追加することはできません。
 と書きました。
 Functionプロシージャは、そういうObject.method という使い方はできない、と言っているのです。
 関数(引数)という形式のものを使うしかありません。

 VBAは、
 ・VB6というVisual Basicというプログラム言語(これはオブジェクト指向ではないです)に、
 ・その上に、Excelのオブジェクト操作のオブジェクト指向的なものを追加したのです。

 ユーザーがFunctionプロシージャを追加できますが、これはVB6の言語仕様によるしかないのです。
 ですから、オブジェクト指向言語的なメソッドを追加することはできません。

 VBAの基本テキストを持っていますか?もう一度復習してください。

(xyz) 2023/11/28(火) 18:04:41


   せいぜいクラス使って「それっぽく」表現することくらいしか出来ないと思いますね。

    Rem [Class1]クラスモジュール------------------------------------------
    Option Explicit
    Private ancCell As Range
    Public Property Get 基準となるセル() As Range
        Set 基準となるセル = ancCell
    End Property
    Public Property Set 基準となるセル(newCell As Range)
        Set ancCell = newCell
    End Property
    Public Property Get 型番() As Range
        If Not ancCell Is Nothing Then Set 型番 = ancCell.Offset(1)
    End Property

    Rem 標準モジュール---------------------------------------------------
    Option Explicit
    Sub test()
        Dim c As New Class1
        Set c.基準となるセル = Range("A1")
        Debug.Print c.型番.Address
    End Sub

(白茶) 2023/11/28(火) 18:06:54


 VBAでもラムダ式やらデリゲートやらがサポートされる日が来れば、
 ひょっとしたらもうちょっと簡素に表現出来るのかもしれませんが、

VB ラムダ式の使用 - Action, Func
https://www.umayadia.com/VBStandard2/Standard34.htm

 今のところサポートされてないです。

(白茶) 2023/11/28(火) 18:12:22


xyz さん

回答ありがとうございました。

白茶 さん

回答ありがとうございます。
やはり、クラスを使ったやり方しかできなさそうなのですね。
ありがとうございます。
ただ、こういう書き方の方が直感的にわかりやすく、
メンテナンス性もいいと思うので、このやり方で組んでいきたいと思います。

また、ラムダ式のご紹介ありがとうございます。
VB .NETでは使用できるんですね。
VBAはベースが古いままなので、サポートされないのでしょうね

ありがとうございました!
(VBA超超超初心者) 2023/11/28(火) 18:21:48


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.