VBAの部品の使い方

このカテゴリにある記事を使う上での解説と注意点です

このカテゴリには、プロシージャとして作成されたコードが記載されています

これらは、いわゆるサブプロシージャと呼ばれるもので、本来の処理をサポート、または可読性向上に繋げる役割があります

ここにあるプロシージャは、広域関数なので同じプロジェクト内であればどこにあっても呼び出し可能です
ですが、どこに何があるか分からなくなると困るので1つ専用のモジュールを作成して、その中にコピペしてもらうようにした方がいいです

モジュールの作成は、VBAのメニューから簡単に行うことが出来ます
挿入メニューから標準のモジュールを追加してください
モジュールの名前は何でも構いません、参照することもありません

これで、部品を入れるモジュールが完成します
以下の記事で画像付きで解説していますので、参考にしてください

モジュールが作成出来たら、この中に記事トップにあるコードをそのまま貼り付けしてください

それで、あとは別のプロシージャで必要に応じて呼び出しを行えば利用可能です

また、記事にあるコードは一切解説コメントを付けていません
コードの意味を理解したい方は記事で解説を行っていますので、頑張ってスクロールして読んでください

おおよそはそんなんどうでもええわ、って場合が多いと思うのでそういった方々には邪魔な行になってしまうし、なによりそっちで解説しすぎるとこのサイトのこの記事はなんのために読んだらええのん?という素朴な疑問が払しょくできないからです

プロシージャについて

このカテゴリの記事には、大きく分けて2種類のプロシージャがあります

それが、SubプロシージャFunctionプロシージャです

これらの違いは戻り値を持つか持たないかと、Callステートメントを使うか使わないかの点になります

戻り値に関しては、正直引数を参照渡しにする方式であれば、処理中での計算値を返すことは出来るのでどうとでもなってしまいます

ですが、呼び出し方法に関しては対応していない方法ではエラーが出ますので注意が必要です

Subプロシージャの呼び出しについて

これには、Callステートメントを使用する必要があります
このステートメントは、他のプロシージャを実行する際に使用するものです

例えば、以下のようなSubプロシージャがあった場合で解説します

Sub zzzMsg(Optional zzString As String = "TestMsg")

MsgBox zzString

End Sub

このプロシージャは、引数を持っているSubプロシージャです
この引数は文字列型の引数になるので、処理の呼び出し時の引数に文字列を指定することで、この引数名に代入されます

処理内容としては、その引数に代入された文字列をメッセージボックスに表示するだけです

なお、引数名の前についている「Optional」キーワードは引数を省略することが出来ることを意味します
そして、省略された場合の初期値を型の後に指定することが出来ます
ここでは「”TestMsg”」が指定されていることを確認してください

引数があり、かつ省略可能なSubプロシージャとなりますのでCallステートメントの書き方は2通りあります

Call zzzMsg

この様に引数を省略して呼び出します、引数を全てを省略する場合や引数の存在しない場合はSubプロシージャの名前だけを記載するだけでいいです

引数を省略して実行した時のメッセージボックス
引数を省略したメッセージ

この場合に表示されるメッセージは画像の様に省略時の文字列になります

次に、引数を指定して実行する場合の解説です

入力時にクイックヒントが表示される

引数は「()」で囲んで入力します
「(」を入力した時点で、画像の様にクイックヒントが表示されます
ここでの表示は関数のものと同じです、「[]」で囲まれた引数は省略可能を意味しています
その際に、省略時の代入値も表示されているのが確認できます

Call zzzMsg("ProductionMsg")

そのまま引数に文字列を指定したのが、このコードになります
これを実行すると、引数に指定した文字列がメッセージボックスに表示されます

引数を指定して表示したメッセージボックス

画像の様に、引数に指定した文字列が表示されるようになります

Subプロシージャは、Callステートメントを使用して引数を利用する場合はその引数も含めてコードを記載することで処理を実行する事ができます

Functionプロシージャの呼び出しについて

こちらは関数と同じ使用方法になるので呼び出しはあまり難しくはありません
ですが、Functionプロシージャでの作り方がSubプロシージャと違う点があるので注意してください

Function zzzLoopString(zzLoopSt As String, Optional zzLoop As Long = 1) As String

zzzLoopString = String(zzLoop, zzLoopSt)

End Function

大きく違う点が2つあります
・引数の()の後に、プロシージャ自体の型宣言を行うこと
・プロシージャ名に代入することで戻り値となる

この2点に注目しながらFunctionプロシージャは読み取るようにしてください

このプロシージャでは、まず1行目後半部分で型宣言しています
String型になっていますので、この関数の戻り値は文字列であることが分かります

また、処理中でプロシージャ名に文字列を代入しています
つまりこの時点で戻り値が取得可能な状態である、ということです
このコード以降にも処理を作成することは可能です
その場合に、Exitステートメントなどでプロシージャを強制終了したとしても戻り値の取得は可能です

なおこのFunctionプロシージャは引数「zzLoopSt」に指定された文字列を引数「zzLoop」の回数繰り返して返す関数です
というか、そのためのString関数を実行しているだけです

MsgBox zzzLoopString("A", 4)

呼び出しを行う場合は、通常の関数同様、Functionプロシージャの名前を直接記載して実行します
引数に関しても関数同様で、「()」で囲んで指定を行います

ここでは、「A」を4回繰り返す文字列を取得してメッセージボックスに表示する処理になります

Functionプロシージャの返し値をメッセージボックスに表示
コードを実行した時に表示されるメッセージボックス

コードを実行すると、メッセージボックスが表示されます
その時に表示される内容は、Functionプロシージャで返された文字列です

ここで、少しわかりにくいかもしれませんが
この1行のステートメントで、Functionプロシージャの関数と、MsgBox関数の2つが実行されています
しかし、順番は先に引数のFunctionプロシージャが実行されてから、MsgBox関数が実行されていますので問題はありません

また、今回作成したFunctionプロシージャでは引数「zzLoopSt」は省略不可の設定になっています、Optionalキーワードを付けなければ省略不可となります

この設定で、引数を省略して記載した場合は実行時エラーが発生しますので注意してください

引数は都度合わせて行いますが、要はSubプロシージャはCallステートメントで呼び出す・Functionプロシージャはプロシージャ名だけで呼び出す、という形でOKです