vba-training-09-アイキャッチ

VBAトレーニング-09 [関数操作について-④]-[変数を使った関数の呼出し方]

このページで学習出来る事

 前回は関数の[Private]と[Public]の違いについて説明しましたが、今回はちょっと変わった関数の呼出し方について説明していきます。

 関数の呼出しは、基本的に[Call 関数名]で呼び出すことが出来ますが、通常この関数名の部分は文字列になります。
 しかしある方法を使えば、この関数名の部分を変数に置き換えて呼び出すことが出来ますので、そのやり方を解説していきたいと思います。

学習内容

  • 変数を使って関数を呼び出す方法

この学習で使用するエクセルファイルはここからダウンロードできます。

  


サンプルコード

 [sample-09.xlsm]を開いて、中に書かれているコードを確認しましょう。

 今回のコードでは、二つのモジュール[Module1]と[sample]が用意されています。[Module1]には関数を呼び出す記述が書かれており、[sample]には呼び出される側の記述が書かれています。この二つを使って変数を使った関数の呼出し方を見ていきます。

 このファイルをそのまま使用しても構いませんし、新しくエクセルファイルを作って、自身でコードを記載して動かしても構いません。(直接コードを書いた方が覚えやすいので、時間がある方は書く練習もしてみましょう)

'Module1側の記述----------------------------------------------
Sub main()
    Dim moduleName As String
    Dim fncName As String
    
    moduleName = "Module1"
    fncName = "fncTest01"
    Application.Run moduleName & "." & fncName
    
    moduleName = "sample"
    fncName = "fncTest02"
    Application.Run moduleName & "." & fncName
    
    Debug.Print (tempNum)
End Sub

Private Sub fncTest01()
    Debug.Print "fncTest01-OK"
End Sub


'sample側の記述----------------------------------------------
Private Sub fncTest02()
    Debug.Print "fncTest02-OK"
End Sub

コードの解説 sub main()部分

‘呼び出したいモジュール名と関数名を設定しています。
moduleName = “Module1”
fncName = “fncTest01”

‘[Application.Run]というコマンドを使用して、先ほど設定した変数のモジュール名と関数名を呼び出しています。
Application.Run moduleName & “.” & fncName

  

コードの解説 Private Sub fncTest01()部分

‘[Private]を付けて関数[fncTest01]を宣言しています。
Private Sub fncTest01()

  

コードの解説 Private Sub fncTest02()部分

‘[Private]を付けて関数[fncTest02]を宣言しています。
Private Sub fncTest01()

  


 [Application.Run]について-1

 [Application.Run]はエクセルアプリケーション内にあるオブジェクトで、別ブックにあるマクロを実行したりするときに使用されます。
今回は、その特性を利用する事で、関数名を変数に置き換えて実行しています。

 今回のサンプルコードでは、[Module1]モジュール内の[Sub main()]から、[Module1]モジュール内の[fncTest01]と、[sample]モジュールの[fncTest02]を呼び出しています。また、両方の関数とも[Private]という事にも注目しておいてください。

 実際に[fncTest01]内の[Debug.Print]でブレークポイントを設定し、正常に呼び出せるか確認してみましょう。
 実行すると、処理が[Module1]内の[fncTest01]に移っているのが確認できます。

 この様に、関数名を変数に置き換えて呼び出さることが確認できました。

 別モジュールにある関数を呼び出す場合は「[モジュール名].[関数名]」と指定することで呼び出すことが出来ます。

  


 [Application.Run]について-2

 続けて[sample]モジュールにある[fncTest02]内の[Debug.Print]でブレークポイントを設定し、実行してみましょう。

 [Private]で設定した関数なのに、別モジュールから問題なく呼び出せたはずです。
 なぜこのような現象が起きるかと言うと、実際に関数を呼び出しているのは[Sub main()]ではなく、実行元が[Application.Run](エクセルアプリケーション)だからです。

 もっと砕けて説明すると、別のエクセルファイルを立ち上げ、そこから関数を実行しているイメージです。ですので、この場合の実行元は新規に立ち上がったエクセルファイルとなり、その中の[Private]というニュアンスで関数が実行できたという事になります。

[Application.Run]を使用すると、別モジュールの関数が[Private]でも呼び出すことが出来る。

  


最後に([Application.Run]の利用について)

 今回は、[Application.Run]を使って、変数から関数を呼び出す方法について説明をしました。
 [Application.Run]の利用用途としては、セルの値を取得し、その値を使って関数を呼び出すといったことが考えられます。
 関数名を変数に入れることが出来ますので、動的に関数を呼び出す事が出来るといった感じでしょうか。

 しかし、どこからでも自由に呼び出せるという事は、その分複雑性を増すことになります。
 また通常とは異なる形で関数を呼び出していますので、別の人が見てもメンテが出来る様、注意が必要です。

  

 関数の説明はこのくらいにして、次回からは配列について説明をしていきたいと思います。

  

前回-関連記事

このページで学習出来る事  前回は関数の[ByVal(値渡し)]と[ByRef(参照渡し)]の違いについて説明しましたが、今回は関数の呼び出し方や[Private]と[Public]の違いについて説明していきます。  関数には[Privat[…]

vba-training-08-アイキャッチ
次回-関連記事

このページで学習出来る事  前回までは関数操作を説明してきましたが、今回から配列に関して説明をしていきたいと思います。 配列に関してはどのプログラミング言語でも使用される概念ですので、その辺も含めてしっかりと配列を勉強していきましょう。 […]

vba-training-10-アイキャッチ