このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】CallByName関数の使い方を解説(用途も紹介)

2024年4月17日

今回はCallByName関数の使い方を紹介します。

これはオブジェクトのメソッドやプロパティを呼び出す関数なのですが、どのように使うものなのかいまいちピンと来ていない人も多いかと思います。

そこで、CallByName関数の使い方と、使用例を紹介しようと思います。

この記事では↓の内容が分かります。

  • CallByName関数の使い方 (引数の指定方法)
  • CallByName関数の使用例

VBAが難しいと感じたら
ココナラにてマクロ(VBA)の作成代行を始めました。
ご依頼はこちらから

CallByName関数の使い方 (引数の指定方法)

CallByName (オブジェクト, プロパティ名またはメソッド名の文字列, 呼び出されるプロシージャの型, 引数)

CallByName関数はオブジェクトのメソッドやプロパティを呼び出す関数です。

そのため引数には次の4つを指定します。

  1. オブジェクト
  2. プロパティ名またはメソッド名の文字列
  3. 呼び出されるプロシージャの型
  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関数を活用することができます。

VBAが難しいと感じたら
ココナラにてマクロ(VBA)の作成代行を始めました。
ご依頼はこちらから

VBA

Posted by やろまい