部品化プロシージャーでCallステートメントは必須

vbacalleyecatch

プロシージャー実行中に他のプロシージャーを呼び出すことの出来るCallステートメントについてです。
エクセルVBAプログラムを簡潔に組み立てるポイントにもなります。
部品化したコードを利用する上では欠かせません。

こんにちは、じゅんぱ店長(@junpa33)です。

エクセルVBAコードでプログラムを作成する中で、

プログラムが長く大きくなればなるほど、実行コードの部品化が重要になってきます。

その中で、よく似た実行コードの重複記述も問題です。

プログラムの長大化対策として、親プロシージャーの中に子プロシージャーが部品として入っているというのもよく普通にあります。

コード組み立ての中で、プロシージャーを部品化させるために知っておく必須項目が、「Callステートメント」になります。

Callステートメントの使い方

vbacallp003

Callテートメントの使い方は、基本的には難しくありません。

Callステートメントを使えば、親プロシージャー実行中に、簡単に子プロシージャーを呼び出し実行させることが出来ます。

ただ1点だけ注意点があるとすれば、

コード記述する時の書き方(構文)についてです。

Callステートメントの構文

Callステートメントの構文

Call プロシージャー名 [ (引数) ] [ ]内は省略可能

Callキーワード 省略可能です。
指定して、引数を使用するときは「(引数)」を省略できません。
プロシージャー名呼び出すプロシージャー名 指定は必須です。
引数使用しないときは省略可能です。

Callステートメント 書き方(記述方法)の注意点

呼び出すプロシージャーは、

引数なし・・・・Sub 〇〇〇実行 () ————————End Sub
引数つき・・・・Sub ▲▲▲実行 ( ◆  As ●●● ) ——–End Sub  とします。

可不可記述方法理由
実行可能Call 〇〇〇実行構文通り
実行可能〇〇〇実行Callキーワードの省略
実行可能Call ▲▲▲実行 ( □ )構文通り
実行可能▲▲▲実行 □Callキーワードの省略
実行不可▲▲▲実行 ( □ )Call省略時に引数に()カッコが付いている

Callキーワードの省略表記の非推奨について

Callキーワードを省略せずにプロシージャ名を記述すれば、

コードの点検時にも別のプロシージャを呼び出していることが分かりますので、

その意味で、そのプログラムがより分かりやすくなったと言えます。

Callキーワード表記は「出来るだけ分かりやすく記述することが望ましい。」という観点では「表記を推奨」ということです。

Callキーワード省略時の 呼び出しプロシージャー表記について

基本的に、Callキーワードの省略の非推奨は、プログラムコード作成は「出来るだけ分かりやすく記述することが望ましい。」という観点からの判断によるものです。

では、自分が作成したエクセルVBAプログラムは、どのような使用状況になるのか?誰がメンテナンスしていくのか?を考えてみましょう。

もし、コードメンテナンスも自分中心であれば、「要は、自分が分かればよい」が中心の考え方でいいとなるでしょう。

このサイトでも、ケースによっては一部、Callキーワードを省略しての記述となっています。

メンテナンス的に言うと、実務的には、「Call」という文字を付けるか付けないかよりも、

「呼び出したプロシージャー」がどこに記述されているかを明確にすることの方が重要だからです。

このブログでは、「Call Module3.〇〇〇実行」から「Call」を省略して「Module3.〇〇〇実行」と記述をしています。

これによって、呼び出したプロシージャー「〇〇〇実行」は「Module3」にあるということがすぐわかるようにしています。

つまり、別に「Call」がなくても「Module3」と書けば、プロシージャーを呼び出していることは普通にわかるので、Callキーワードを省略しているということです。

ユーザーフォームモジュールでは特に、
イベント発生時のコード記述で、何処にあるプロシージャーを呼び出しているかを明示しておくことにも有用です。

Callステートメントの使用例

vbacallp004

使用例として、引数が無い場合とある場合について説明します。Callキーワードを記述する方法です。

引数を使わない場合でも、呼び出しプロシージャ内で使っている変数を利用したい場合は、

モジュール変数やグローバル変数化して利用することもできます。

Subプロシージャーを呼び出す

サンプルコードは、

セルB3にアクティブセルの「行番号+列番号」の値を表示します。

呼び出し先のSubプロシージャでは、セルB3のセルの色を「33番 スカイブルー」に指定します。

VBA
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
vbacall002

引数付きSubプロシージャーを呼び出す

サンプルコードは、

セルB3にアクティブセルの「行番号+列番号」の値を表示して、

更にセルの色を「行番号+列番号」の値に合致するカラーインデックス色に変更します。

呼び出し先のSubプロシージャでは、セルB3のセルの色を決定するコードを実行します。

VBA
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
vbacall001

Callステートメント使い方のまとめ

vbacallp005

他の言語でも同じですが、エクセルVBAでのプログラム作成は基本的に、

重複の少ない、簡潔な、分かりやすいVBAコード組み立てを目指さないといけません。

そのための方策の1つとして、エクセルVBAのプログラムコードを部品化して利用するということがあります。

その重要な役割を果たすのがCallステートメントだということです。

エクセルVBAの中には、Callステートメントの他にも、こういった「呼び出し」に関わるステートメントやプロシージャやメソッドがあります。

VBAのスキルアップに合わせて順次それらを習得して行きましょう。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。