【VBA】CallByName関数の使い方を解説(用途も紹介)
今回はCallByName関数の使い方を紹介します。
これはオブジェクトのメソッドやプロパティを呼び出す関数なのですが、どのように使うものなのかいまいちピンと来ていない人も多いかと思います。
そこで、CallByName関数の使い方と、使用例を紹介しようと思います。
この記事では↓の内容が分かります。
- CallByName関数の使い方 (引数の指定方法)
- CallByName関数の使用例
CallByName関数の使い方 (引数の指定方法)
CallByName (オブジェクト, プロパティ名またはメソッド名の文字列, 呼び出されるプロシージャの型, 引数)
CallByName関数はオブジェクトのメソッドやプロパティを呼び出す関数です。
そのため引数には次の4つを指定します。
- オブジェクト
- プロパティ名またはメソッド名の文字列
- 呼び出されるプロシージャの型
- 引数
オブジェクト+プロパティ名またはメソッド名で、やりたいことを指示するイメージになります。
基本的な使い方を学ぶため、RangeオブジェクトのValueプロパティとClearメソッドを使うサンプルコードをお見せします。
Sub Sample1()
Call CallByName(Range("A1"), "Value", VbLet, 100) 'ValueプロパティのLet(代入)
Debug.Print CallByName(Range("A1"), "Value", VbGet) 'ValueプロパティのGet(取得)
Call CallByName(Range("A1"), "Clear", VbMethod) 'Clearメソッドの実行
End Sub
ステップ実行しながらシートの変化を確認してみてください。
- 最初のCallByNameではValueプロパティによって代入(Let)をしています。
- 次のCallByNameではValueプロパティによってGet(取得)をしています。
- 最後のCallByNameではClearメソッドを呼び出して、セルをクリアしています。
CallByName関数の基本的な使い方はこのようになります。
オブジェクトとプロパティ名またはメソッド名を指定して、プロパティならVbLetかVbGet、メソッドならVbMethodを指定します。
また、プロパティやメソッドの仕様に応じて引数を渡します。
CallByName関数の使用例
ここまでCallByName関数の使い方を説明しましたが、この関数のポイントはプロパティやメソッドを文字列で指定できることです。
これがどのような効果を発揮するのか具体例で紹介しようと思います。
初めにモジュールのところで右クリックしてクラスモジュールを追加してください。モジュール名はclsRangeに変更します。
Sub Sample2()
'インスタンスを生成
Dim cls As New clsRange
cls.GetRange(Array(1, 1)) = "数値" '数値で指定
cls.GetRange("C3") = "文字列" '文字列で指定
End Sub
'clsRangeクラスモジュールを作成して貼り付ける
Function GetRange(var As Variant) As Range
'varの内容に応じたRangeを返す
Dim strType As String
strType = Left(TypeName(var), 3)
Set GetRange = CallByName(Me, "GetRangeBy" & strType, VbMethod, var)
End Function
Function GetRangeByStr(var As Variant) As Range
Set GetRangeByStr = Range(var)
End Function
Function GetRangeByVar(var As Variant) As Range
Set GetRangeByVar = Cells(var(0), var(1))
End Function
Sample2プロシージャを実行するとclsRangeのインスタンスを生成し、GetRangeメソッドを呼び出します。
このGetRangeメソッド内でCallByName関数を使用しています。
見て欲しいのが、引数varの型(String, Variant)によってCallByName関数が呼び出すメソッドが変わる点です。
メソッドをString型の名前で指定できるため、このような分岐処理が可能となります。
2つ程度であればSelectCaseで対応できるので魅力が薄いですが、無数のデータ型に対応させようとすると大きく力を発揮してくれます。
このように文字列によって呼び出すメソッドを分岐させたいときにCallByName関数を活用することができます。