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
|
オブジェクトは、このプロパティまたはメソッドをサポートしていません。 型が一致しません。 |
- 2012.06.15 Friday
- VB・VBA
- 20:56
- comments(0)
- trackbacks(0)
- -
- -