プロシージャー実行中に他のプロシージャーを呼び出すことの出来るCallステートメントについてです。
エクセルVBAプログラムを簡潔に組み立てるポイントにもなります。
部品化したコードを利用する上では欠かせません。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルVBAコードでプログラムを作成する中で、
プログラムが長く大きくなればなるほど、実行コードの部品化が重要になってきます。
その中で、よく似た実行コードの重複記述も問題です。
プログラムの長大化対策として、親プロシージャーの中に子プロシージャーが部品として入っているというのもよく普通にあります。
コード組み立ての中で、プロシージャーを部品化させるために知っておく必須項目が、「Callステートメント」になります。
コンテンツ
Callステートメントの使い方
Callテートメントの使い方は、基本的には難しくありません。
Callステートメントを使えば、親プロシージャー実行中に、簡単に子プロシージャーを呼び出し実行させることが出来ます。
ただ1点だけ注意点があるとすれば、
コード記述する時の書き方(構文)についてです。
Callステートメントの構文
Call プロシージャー名 [ (引数) ] [ ]内は省略可能
Call | キーワード 省略可能です。 指定して、引数を使用するときは「(引数)」を省略できません。 |
プロシージャー名 | 呼び出すプロシージャー名 指定は必須です。 |
引数 | 使用しないときは省略可能です。 |
Callステートメント 書き方(記述方法)の注意点
呼び出すプロシージャーは、
引数なし・・・・Sub 〇〇〇実行 () ————————End Sub
引数つき・・・・Sub ▲▲▲実行 ( ◆ As ●●● ) ——–End Sub とします。
可不可 | 記述方法 | 理由 |
---|---|---|
実行可能 | Call 〇〇〇実行 | 構文通り |
実行可能 | 〇〇〇実行 | Callキーワードの省略 |
実行可能 | Call ▲▲▲実行 ( □ ) | 構文通り |
実行可能 | ▲▲▲実行 □ | Callキーワードの省略 |
実行不可 | ▲▲▲実行 ( □ ) | Call省略時に引数に()カッコが付いている |
Callキーワードを省略せずにプロシージャ名を記述すれば、
コードの点検時にも別のプロシージャを呼び出していることが分かりますので、
その意味で、そのプログラムがより分かりやすくなったと言えます。
Callキーワード表記は「出来るだけ分かりやすく記述することが望ましい。」という観点では「表記を推奨」ということです。
基本的に、Callキーワードの省略の非推奨は、プログラムコード作成は「出来るだけ分かりやすく記述することが望ましい。」という観点からの判断によるものです。
では、自分が作成したエクセルVBAプログラムは、どのような使用状況になるのか?誰がメンテナンスしていくのか?を考えてみましょう。
もし、コードメンテナンスも自分中心であれば、「要は、自分が分かればよい」が中心の考え方でいいとなるでしょう。
このサイトでも、ケースによっては一部、Callキーワードを省略しての記述となっています。
メンテナンス的に言うと、実務的には、「Call」という文字を付けるか付けないかよりも、
「呼び出したプロシージャー」がどこに記述されているかを明確にすることの方が重要だからです。
このブログでは、「Call Module3.〇〇〇実行」から「Call」を省略して「Module3.〇〇〇実行」と記述をしています。
これによって、呼び出したプロシージャー「〇〇〇実行」は「Module3」にあるということがすぐわかるようにしています。
つまり、別に「Call」がなくても「Module3」と書けば、プロシージャーを呼び出していることは普通にわかるので、Callキーワードを省略しているということです。
ユーザーフォームモジュールでは特に、
イベント発生時のコード記述で、何処にあるプロシージャーを呼び出しているかを明示しておくことにも有用です。
Callステートメントの使用例
使用例として、引数が無い場合とある場合について説明します。Callキーワードを記述する方法です。
引数を使わない場合でも、呼び出しプロシージャ内で使っている変数を利用したい場合は、
モジュール変数やグローバル変数化して利用することもできます。
Subプロシージャーを呼び出す
サンプルコードは、
セルB3にアクティブセルの「行番号+列番号」の値を表示します。
呼び出し先のSubプロシージャでは、セルB3のセルの色を「33番 スカイブルー」に指定します。
Option Explicit
Sub 呼び出しテスト1()
Dim Num As Integer
Num = ActiveCell.Row + ActiveCell.Column
Range("B3").Value = Num
Call セル着色
End Sub
Sub セル着色()
Range("B3").Interior.ColorIndex = 33
End Sub
引数付きSubプロシージャーを呼び出す
サンプルコードは、
セルB3にアクティブセルの「行番号+列番号」の値を表示して、
更にセルの色を「行番号+列番号」の値に合致するカラーインデックス色に変更します。
呼び出し先のSubプロシージャでは、セルB3のセルの色を決定するコードを実行します。
Option Explicit
Sub 呼び出しテスト2()
Dim Num As Integer
Num = ActiveCell.Row + ActiveCell.Column
Range("B3").Value = Num
If Num > 57 Then Num = 0
Call CColor(Num)
End Sub
Sub CColor(ByVal n As Integer)
Range("B3").Interior.ColorIndex = n
End Sub
Callステートメント使い方のまとめ
他の言語でも同じですが、エクセルVBAでのプログラム作成は基本的に、
重複の少ない、簡潔な、分かりやすいVBAコード組み立てを目指さないといけません。
そのための方策の1つとして、エクセルVBAのプログラムコードを部品化して利用するということがあります。
その重要な役割を果たすのがCallステートメントだということです。
エクセルVBAの中には、Callステートメントの他にも、こういった「呼び出し」に関わるステートメントやプロシージャやメソッドがあります。
VBAのスキルアップに合わせて順次それらを習得して行きましょう。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。