今回は実行中のマクロから別のマクロを実行する方法を紹介したいと思います。
過去にVBAに関する記事を投稿していますので、是非こちらも併せてご覧ください!
別マクロを呼び出す方法
実行中のマクロから別のマクロを実行するにはCallステートメントを使います。
Sub main()
'openMsgBoxを呼び出し
Call openMsgBox
End Sub
Sub openMsgBox()
'実行した時刻を表示する
MsgBox Now
End Sub
書き方は簡単で、Callの後に半角スペースを入れ、実行したいマクロ(プロシージャ)名を書くだけです。今回の場合だとopenMsgBoxを実行したいので、「Call openMsgBox」としています。
ちなみに実行すると、実行した時刻がメッセージボックスに表示されます。
別モジュールのマクロを実行する
同じモジュール内でしか呼び出すことが出来ないわけではなく、別のモジュールに書いたマクロを呼び出すこともできます。
最初と同様に、実行したいマクロ(プロシージャ)名を書くだけです。
'Module1
Sub main()
'openMsgBoxを呼び出し
Call openMsgBox
End Sub
'Module2
Sub openMsgBox()
MsgBox Now
End Sub
ちなみにマクロ名を入力する前に「モジュール名.(ドット)」と入力すると、そのモジュール内のマクロが一覧で表示されるので、その中から選択することもできます。
私は別モジュールのマクロを呼び出す場合、「モジュール名.マクロ名」で記述するようにしています。
'Module1
Sub main()
'Module2のopenMsgBoxを呼び出し
Call Module2.openMsgBox
End Sub
こちらの方がどのモジュールのマクロを実行しているかが分かるのでおすすめです。
「名前が適切ではありません」とエラーが出る場合
別モジュールのマクロを実行時に「名前が適切ではありません」とエラーが出る場合があります。
原因をざっくり言うと、別モジュールに同じ名前のマクロが複数ある可能性があります。
このエラーがが出た場合、同じマクロ名のものがないか確認し、同じものがあれば変えておきましょう。
一応、モジュール名を付けておけば実行できないこともないですが、基本的にはマクロ名を変えておくことをお勧めします!
Callステートメント無しでも呼び出せる
実は、Callステートメントを記述しなくても別マクロを実行することが出来ます。先程と同じように実行したいマクロ(プロシージャ)名を書くだけです。
Sub main()
'openMsgBoxを呼び出し
openMsgBox
End Sub
Sub openMsgBox()
MsgBox Now
End Sub
ですが、ぱっと見た時に分かりにくいので、個人的にはあまりお勧めしません。。。
基本的には「Call マクロ名」で記述するようにしましょう!
別モジュールから呼び出せないようにしたい場合
別モジュールから呼び出せないようにしたい場合は、Subの前にPrivateを付けるとできます。
'Module2
Private Sub openMsgBox()
MsgBox Now
End Sub
Privateを付けると、同一モジュール内からでしかマクロが呼び出せなくなります。別モジュールから呼び出そうとすると「SubまたはFunctionが定義されていません。」とエラーが表示されます。
まとめ
今回は実行中のマクロから別のマクロを実行する方法を紹介しました。
もしマクロ呼び出し時にエラーが出る場合は、
- 別モジュールに同じ名前のマクロが複数ないか
- 呼び出したいマクロにPrivateが付いていないか
上記2点を確認してみましょう!
コメント