VBAのプロシージャについて解説しています。
<< VBA関数とは :前の記事
前回は、VBA関数について解説しました。VBA関数はすべて覚える必要はありませんので、利用する場合は引数に何があるのか、どのような戻り値をとるのかなどをしっかり理解した上で利用するようにしましょう。今回はプロシージャについてですが、プロシージャの構造の内容を再度確認した上でこちらをご覧ください。
プロシージャとは、VBAの命令文を1つにまとめたものです。VBAコードは1行ごとに命令文を記述して実行されますが、通常のマクロでは、複数の命令文を記述してまとめて実行します。そのようにまとめられた命令文がプロシージャとなります。また、プロシージャは以下の3つがあります。
プロシージャ名は、英字以外にも日本語を利用できます。他にも以下のような規則がありますので、ご確認ください。
Subプロシージャを通常のプログラミングで利用される一般的なプロシージャです。こちらを利用するには決まった書式に則って記述します。決まった書式とは、以下のような書式になります。
プロシージャ名は上記の命名規則に則って命名するようにしましょう。尚、SubやEndはVBAで事前に決められている予約された語句になります。これらは「キーワード」と呼ばれます。
Sub プロシージャ名()
処理に内容
End Sub
こちらは、プロシージャ名を「sample」と命名したsampleプロシージャになります。処理をするとMsgBox関数を実行しメッセージボックスが表示されます。
Sub sample()
MsgBox "sampleプロシージャです。"
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
プロシージャの命名規則の中で「同モジュール内で同じ名前のプロシージャ名を使用することはできない」とありますが、別モジュールでしたら同じ名前のプロシージャ名も利用することができます。
以下は同じモジュール内で2つのsampleプロシージャを記述した例ですが、sampleプロシージャを実行するとコンパイルエラーで「コンパイルエラー:名前が適切ではありません:sample」と表示されます。こちらは同じモジュール内で同じプロシージャ名が存在する場合のエラーになります。
Module1
Sub sample()
MsgBox "Module1のsampleプロシージャです。"
End Sub
Sub sample()
MsgBox "Module1のsampleプロシージャです。"
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
続いて別モジュールに同じ名前のプロシージャが存在する場合の事例です。Module1とModule2にそれぞれsampleプロシージャが存在します。Module1のsampleプロシージャでは、他のプロシージャを呼び出すCallステートメントを利用してModule2のsampleプロシージャを呼び出しています。
別モジュールの同じ名前のプロシージャを呼び出す場合は、モジュール名から記述するようにします。Module1のsampleプロシージャを実行すると実行結果のように正常に処理が完了します。
Module1
Sub sample()
MsgBox "Module1のsampleプロシージャです。"
Call Module2.sample
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
Module2
Sub sample()
MsgBox "Module2のsampleプロシージャです。"
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
SubプロシージャやFunctionプロシージャには、引数を渡すことができます。引数とは、プロシージャを実行するために利用される情報です。 引数を利用することでプロシージャの実行結果を制御できます。
メソッドの引数では、決まった引数が用意されていますが、プロシージャの引数は自由に設定することができます。
引数付きのプロシージャを記述する場合は、以下の書式に則って記述します。引数は「()」(カッコ)に記述しますが、Dimステートメントを除いた変数宣言の形になります。また、引数を複数設定する場合は、引数間に「,(カンマ)」で区切って記述します。
Sub プロシージャ名(引数名1 As データ型, 引数名2 As データ型・・・)
処理に内容
End Sub
こちらは、sampleBプロシージャに文字列型(String)で宣言した引数msgを設定しています。sampleAプロシージャでは、他のプロシージャを呼び出すCallステートメントを利用する際、引数msgに「VBA」の文字列を設定しています。
引数msgを受け取ったsampleBプロシージャは、MsgBox関数に引数msgを設定してメッセージボックスを表示しています。
Sub sampleA()
Call sampleB("VBA")
End Sub
Sub sampleB(msg As String)
MsgBox msg
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
sampleAプロシージャを実行した結果です。
また、引数付きのプロシージャの引数には規定値を設定することもできます。規定値を設定する場合は以下のように記述します。
キーワードOptionalは設定した引数を省略可能にします。キーワードOptionalを設定した引数以降はすべて省略可能な引数にする必要があります。そして「=(イコール)」の後に規定値を設定します。
Sub プロシージャ名(Optional 引数名1 As データ型 = 規定値)
処理に内容
End Sub
こちらは引数msgに規定値の文字列「VBA」を設定した事例です。Callステートメントを利用する際、引数msgを未設定で呼び出しています。引数msgは空ですので、規定値の「VBA」が利用されるため、上記と同じ結果となります。
Sub sampleA()
Call sampleB
End Sub
Sub sampleB(Optional msg As String = "VBA")
MsgBox msg
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
sampleAプロシージャを実行した結果です。
引数の設定方法は理解できたかと思いますが、プロシージャには引数の渡し方に「参照渡し」と「値渡し」の2種類があります。
参照渡しとは、プロシージャに引数として変数を渡すときに、変数に格納されている値ではなく変数そのもの渡す方法です。値をコピーする必要がないため、無駄にメモリを消費することがありません。注意点としては、変数そのものを渡すため、呼び出し先のプロシージャ内で変数の値が変更してしまいます。
参照渡しの場合は、以下のように引数名の前に「ByRef」を記述しますが、何も記述しない場合は参照渡しとして扱われるため、省略することもできます。
Sub プロシージャ名(ByRef 引数名1 As データ型, ByRef 引数名2 As データ型・・・)
処理に内容
End Sub
以下は参照渡しでメッセージボックスを表示させるサンプルコードです。
Sub sampleA()
Dim keyWords As String
keyWords = "VBA"
Call sampleB(keyWords)
'InternetExplorer(参照渡し)
MsgBox keyWords
End Sub
Sub sampleB(ByRef keyWords As String)
keyWords = "InternetExplorer"
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
メッセージボックスにInternetExplorerが表示される。
こちらは呼び出し先sampleAプロシージャには引数なし、呼び出し元sampleBプロシージャに引数keyWordsを設定しています。まず、Dimステートメントを利用して変数keyWordsに文字列型(String)を宣言し、「VBA」を代入します。
次にCallステートメントを利用してsampleBプロシージャを呼び出します。その際に変数keyWordsを引数として設定します。sampleBプロシージャの引数はキーワードByRefを設定していますので、引数は参照渡しで渡されます。
今回は、sampleBプロシージャで変数keyWordsが「InternetExplorer」に変更され変数keyWordsがsampleAプロシージャへ渡されます。よってMsgBox関数を利用してメッセージボックスには、「InternetExplorer」が表示されます。
値渡しとは、プロシージャに引数として変数を渡すときに、変数に格納されている値そのものを渡す方法です。値をコピーするため、その分メモリを消費します。値を渡していますので、呼び出し先のプローシージャ内で値が変更されることはありません。
値渡しの場合は、以下のように引数名の前に「ByVal」を記述します。処理パフォーマンスの観点から見ると無駄にメモリを消費しない参照渡しを利用することが多いですが、値の変更を行いたくない場合は、値渡しを利用しましょう。
Sub プロシージャ名(ByVal 引数名1 As データ型, ByVal 引数名2 As データ型・・・)
処理に内容
End Sub
以下は値渡しでメッセージボックスを表示させるサンプルコードです。
Sub sampleA()
Dim keyWords As String
keyWords = "VBA"
Call sampleB(keyWords)
'VBA(値渡し)
MsgBox keyWords
End Sub
Sub sampleB(ByVal keyWords As String)
keyWords = "InternetExplorer"
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
メッセージボックスにVBAが表示される。
こちらも呼び出し先sampleAプロシージャには引数なし、呼び出し元sampleBプロシージャに引数keyWordsを設定しています。Dimステートメントを利用して変数keyWordsに文字列型(String)を宣言し、変数keyWordsに「VBA」を代入します。
次にCallステートメントを利用してsampleBプロシージャを呼び出します。その際に変数keyWordsを引数として設定します。sampleBプロシージャの引数はキーワードByValを設定していますので、引数は値渡しで渡されます。
今回は、値を渡すだけですので、sampleBプロシージャで変数keyWordsが「InternetExplorer」に代入されたとしてもsampleAプロシージャの変数keyWordsは「VBA」のままです。よって、MsgBox関数を利用してメッセージボックスには、「VBA」が表示されます。
今回は、プロシージャについて詳しく解説しました。引数の参照渡しと値渡しで結果が異なりますので、しっかり理解しましょう。次回は、Functionプロシージャと戻り値について解説します。
次の記事: Functionプロシージャとは >>
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
ExcelのVBAについてのQ&A掲示板↑ExcelのVBA全般について分からない事があればこちらの掲示板よりご質問ください。
VBAのIE操作入門↑ExcelのVBAをマスターできたら、エクセルVBAのIE操作にも挑戦してみてください。
こちらでは、エクセルVBAの事例で利用したステートメントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのプロパティをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのメソッドをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのイベントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。