VB6・VBA関数メモ:CallByName関数

CallByName関数についてメモしておきます。

オブジェクトのメソッドやプロパティを名前から参照する際に使用します。


概要

CallByName(Object As Object, ProcName As String, CallType As VbCallType, [Args() As Variant])
機能 指定オブジェクトのメソッドの実行、またはプロパティ値の取得・設定
引数 Object 実行対象オブジェクト Object型
ProcName オブジェクトのメソッド名またはプロパティ名 String型
CallType 呼び出される内容の種類 VbCallType型
Args() メソッドに渡す引数 Variant型
戻り値 値を返すメソッドやGetプロパティの場合は値を返す
値を返さない内容の場合はEmptyを返す


VbCallType型

定数名 説明
VbMethod 1 メソッド
VbGet 2 Getプロパティ
(読み込み用プロパティ)
VbLet
(書き込み用プロパティ)
4 Letプロパティ
VbSet 8 Setプロパティ
(オブジェクト用プロパティ)


使用例

説明 記述例 出力
サンプルクラス
Private mNum As Long
Private mObj As Object

Property Get num() As Long
    num = mNum
End Property

Property Let num(val As Long)
    mNum = val
End Property

Property Get obj() As Object
    Set obj = mObj
End Property

Property Set obj(val As Object)
    Set mObj = val
End Property

Sub setNum()
    mNum = 111
End Sub

Sub setSumNum(ByVal arg1 As Long, ByVal arg2 As Long)
    num = arg1 + arg2
End Sub

Function calc(ByVal arg1 As Long, ByVal arg2 As Long) As Long
    calc = arg1 * arg2
End Function

Getプロパティ名から値を取得
(例ではnumプロパティから値を取得)
Dim obj As New MyClass
obj.num = 100
Debug.Print CallByName(obj, "num", VbGet)
Set obj = Nothing
100
Letプロパティ名から値を設定
(例ではnumプロパティに値を設定)
Dim obj As New MyClass
Call CallByName(obj, "num", VbLet, 200)
Debug.Print obj.num
Set obj = Nothing
200
Setプロパティ名から値を設定
(例ではobjプロパティにオブジェクトを設定)
Dim obj1 As New MyClass
Dim obj2 As New MyClass
obj2.num = 300
Call CallByName(obj1, "obj", VbSet, obj2)
Debug.Print obj1.obj.num
Set obj2 = Nothing
Set obj1 = Nothing
300
メソッド名から処理を実行
(例ではsetNumメソッドを実行)
Dim obj As New MyClass
Call CallByName(obj, "setNum", VbMethod)
Debug.Print obj.num
Set obj = Nothing
111
メソッド名から処理を実行
(引数あり)
(例ではsetSumNumメソッドを実行)
Dim obj As New MyClass
Call CallByName(obj, "setSumNum", VbMethod, 111, 222)
Debug.Print obj.num
Set obj = Nothing
333
メソッド名から処理を実行
(戻り値あり)
(例ではcalcメソッドを実行し戻り値を取得)
Dim obj As New MyClass
Debug.Print CallByName(obj, "calc", VbMethod, 111, 10)
1110


動作検証

説明 記述例 出力
値を返さないメソッドやLet・Setプロパティの場合はEmptyを返す
Dim obj As New MyClass
Dim val
val = CallByName(obj, "num", VbLet, 100)
Debug.Print TypeName(val)
Set obj = Nothing
Empty
存在しない名前を指定するとエラー
Dim obj As New MyClass
    
On Error GoTo ERROR_HANDLER

Call CallByName(obj, "NoExists", VbGet)

ERROR_HANDLER:

If Err > 0 Then Debug.Print Error

Set obj = Nothing
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
メソッドの引数が不足している場合はエラー
Dim obj As New MyClass
    
On Error GoTo ERROR_HANDLER

Call CallByName(obj, "setSumNum", VbMethod, 1)

ERROR_HANDLER:

If Err > 0 Then Debug.Print Error

Set obj = Nothing
引数は省略できません。
メソッドの引数が多い場合はエラー
Dim obj As New MyClass
    
On Error GoTo ERROR_HANDLER

Call CallByName(obj, "setSumNum", VbLet, 1, 2, 3)

ERROR_HANDLER:

If Err > 0 Then Debug.Print Error

Set obj = Nothing
引数の数が一致していません。または不正なプロパティを指定しています。
引数のデータ型が一致しない場合はエラー
Dim obj As New MyClass
    
On Error GoTo ERROR_HANDLER

Call CallByName(obj, "setSumNum", VbLet, "a", "b")

ERROR_HANDLER:

If Err > 0 Then Debug.Print Error

Set obj = Nothing
オブジェクトは、このプロパティまたはメソッドをサポートしていません。 型が一致しません。


コメント
コメントする








    
この記事のトラックバックURL
トラックバック