VBA(Excel)

プロシージャを呼び出せるVBAのCALL文

スポンサーリンク

こんにちは。システム担当の父親、KATSUです。Excel歴20年、Access歴10年の社内SEです。

1年3ヶ月前の2019年10月からブログを書き始め、今回で70記事目になります。


VBAでのプログラミングに慣れてくると、メンテナンス(保守・運用)にうんざりすることってありませんか?

VBAを学習し初めた頃は、「業務を自動化して楽になるぞ」という意気込みで学習してきましたよね。

実際に使い始めると、「修正や運用などを考えると、プログラミングって結構大変じゃない?」と、今まで気づかなかった欠点が見えてきます。

このような問題を解決するためには、プロシージャを呼び出せるCALL文(CALLステートメント)を使いましょう

この記事を書いている私は、約10年間VBAを使って社内業務の改善をすすめてきましたが、学びたての頃はプログラムコードの保守運用に悩まされました。

試行錯誤を重ねて自分自身のVBAのスタイルを確立できました。

そんな時に役に立ったのが、プログラムコードを部品化する「オブジェクト指向」の考え方です。

CALL文はオブジェクト指向というほどの高度なテクニックではありませんが、プログラムを分割することで、マクロの運用を楽にしてくれます

「プログラミングの基本は習得したけど、更に今よりスキルアップしたい」という方の役に立てればうれしいです。

CALL文を使うと便利な2つの理由

CALL文は別のプロシージャを呼び出すことが出来る命令文です。

CALL文を使うと便利な理由は、下の2点です。

  • 修正に手間がかからない
  • プログラム文全体のボリュームを減らせる

VBAを学びたての頃はあまり気になりませんが、習得するに従って自動化したい対象が広く、規模も大きくなってきます。

そのような時は、プログラムの可読性が問われてきます。

修正に手間がかからない

仕様変更によりマクロの修正を行う場合を例に挙げます。

プロシージャ1と2内の「命令2」が全く同じプログラム文です。

Call文を使っていない場合は、両方のプロシージャの修正を行わないといけません。

一方、CALL文を使って「命令2」をプロシージャ3にした場合、命令2の修正は1度で済みます。

このように、CALL文を上手につかうことで、プログラム文の修正回数を減らすことが出来ます。

プログラム文の全体量を減らせる

更に、Call文を活用することで、重複しているコードのボリュームも減らせます。

ボリュームが減れば、修正をしたい箇所を探す時間が少なくなるので、メンテナンスしやすくなります。

但し、何もかもCALL文を使ってしまうと、却ってコード文を解読する手間がかかってしまいます

複数のプロシージャで10行以上の命令文が同じようにつかわれていることを目安にして頂ければいいと思います。

CALL文を乱発しても、メリットよりデメリットの方が大きくなってしまいますので、注意が必要です。

CALL文を使ってみる

では、実際にCALLを使ってみましょう。

CALL文には「引数のあるもの」と「引数の無いもの」があります。

引数の無いCALL文

下のコードは引数の無いシンプルなCALL文です。

Sub Calling_Msg1()
    Call msg1 '引数のないCall文
End Sub

Sub msg1()
    MsgBox ("これはテストです。")
End Sub

Subプロシージャ「Calling_Msg1」をデバッグしてみましょう。

途中でもう一つのプロシージャ「msg1」に飛ぶのが分かります。

単純に制御が分かれるだけですので、とても分かり易いです。

引数のあるCALL文

一方、引数のあるCALL文は下のとおりです。

Sub Calling_Msg2()
    Call msg2("これはテストです。")  '引数のあるCall文
End Sub

Sub msg2(ByVal msstring As String)
    MsgBox (msstring & vbCrLf & "成功しました。")
End Sub

msg2に文字列を格納できるようになっています。

こちらは数値を引数にしたCALL文です。

Sub Calling_Msg3()
    Call msg3(100)  '引数を整数にした
End Sub

Sub msg3(ByVal n As Long)
    MsgBox (Len(CStr(n)) & "桁の整数です")
End Sub

このように、CALL文はプログラムを分割するだけでなく、データも呼び出したプロシージャに引き継ぐことが出来ます。


また、CALL自体の省略もできます。CALLを省略すると、プログラムの書き方が変わるので注意が必要です。

CALLの正しい書き方については「Office TANAKA」に載っているので、是非ご覧ください。

VBAのステートメント[Call] - Office TANAKA

今後の展開

CALL文を使いこなした後は、Functionプロシージャを習得してみましょう。

CALL文はSubプロシージャとFunctionプロシージャを呼び出せます。

SubとFunctionの違いは、「プロシージャ単独で起動できるか」と「戻り値の有無」です。

違いを一言で答えるととてもシンプルですが、「戻り値」が聞き慣れない言葉ですよね?

私も、「戻り値」をしっかりと理解できなかったためにFunctionプロシージャから遠ざかっていたのですが、最近はしっかりと意味が分かってきたので、こちらの記事で説明していきます。

Functionプロシージャの壁を乗り越えるのは大変ですが、習得出来ればプログラミングのスキルが大きく伸びます

VBAのクラスモジュールや、他言語でも使われている「オブジェクト指向」習得の足掛かりになります。

VBAにこだわらず他言語のスキルを身に付けたい人にとって、Functionプロシージャは必ず押さえておきたいテクニックです。

まとめ

今回はVBAのCALL文を紹介しました。

CALL文をほど良く使うことによって、VBAプログラムの可読性がかなり向上します。

もし、あなたが長すぎるコード文に悩んでいれば、引数の無いCALL文を作るだけでも便利さを感じて頂けると思います。

更に、多言語でも使われている「部品化」を意識したプログラミングが出来ます。

プログラミングスキルの向上を目指す方は、引数のあるCall文の習得を目指しましょう。


本日もありがとうございました。

スポンサーリンク

-VBA(Excel)