VBAのプロシージャとは

<< VBA関数とは :前の記事

前回は、VBA関数について解説しました。VBA関数はすべて覚える必要はありませんので、利用する場合は引数に何があるのか、どのような戻り値をとるのかなどをしっかり理解した上で利用するようにしましょう。今回はプロシージャについてですが、プロシージャの構造の内容を再度確認した上でこちらをご覧ください。

目次

プロシージャとは

プロシージャとは、VBAの命令文を1つにまとめたものです。VBAコードは1行ごとに命令文を記述して実行されますが、通常のマクロでは、複数の命令文を記述してまとめて実行します。そのようにまとめられた命令文がプロシージャとなります。また、プロシージャは以下の3つがあります。

  • Subプロシージャ
  • Functionプロシージャ
  • Propertyプロシージャ

プロシージャ名の命名規則

プロシージャ名は、英字以外にも日本語を利用できます。他にも以下のような規則がありますので、ご確認ください。

  • 使用できる文字は、英字、ひらがな、全角カタカナ、漢字、数字、アンダースコア(_)
  • 先頭は文字でなければならない(数字または記号以外の文字)
  • 記号やスペースは使用できない
  • プロシージャ名は半角255文字(全角127文字)以内にする
  • Excelの関数、ステートメント、オブジェクト、プロパティ、メソッドなどVBAで定義されているキーワードを使用することは出来ない
  • 同モジュール内で同じ名前のプロシージャ名を使用することはできない

Subプロシージャの使い方

Subプロシージャを通常のプログラミングで利用される一般的なプロシージャです。こちらを利用するには決まった書式に則って記述します。決まった書式とは、以下のような書式になります。

プロシージャ名は上記の命名規則に則って命名するようにしましょう。尚、SubやEndはVBAで事前に決められている予約された語句になります。これらは「キーワード」と呼ばれます。

Sub プロシージャ名()
 処理に内容
End Sub

  • ①冒頭に「Sub」を記述し半角スペースを空けます。
  • ②プロシージャ名の後に半角の「()」(カッコ)を記述します。
  • ③処理の内容を記述します。
  • ④最後に「End Sub」を記述します。

こちらは、プロシージャ名を「sample」と命名したsampleプロシージャになります。処理をするとMsgBox関数を実行しメッセージボックスが表示されます。


Sub sample()

    MsgBox "sampleプロシージャです。"

End Sub
Subプロシージャの事例1

プロシージャの命名規則の中で「同モジュール内で同じ名前のプロシージャ名を使用することはできない」とありますが、別モジュールでしたら同じ名前のプロシージャ名も利用することができます。

以下は同じモジュール内で2つのsampleプロシージャを記述した例ですが、sampleプロシージャを実行するとコンパイルエラーで「コンパイルエラー:名前が適切ではありません:sample」と表示されます。こちらは同じモジュール内で同じプロシージャ名が存在する場合のエラーになります。

Module1


Sub sample()

    MsgBox "Module1のsampleプロシージャです。"

End Sub

Sub sample()

    MsgBox "Module1のsampleプロシージャです。"

End Sub
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プロシージャの事例2

プロシージャの引数

SubプロシージャやFunctionプロシージャには、引数を渡すことができます。引数とは、プロシージャを実行するために利用される情報です。 引数を利用することでプロシージャの実行結果を制御できます。

メソッドの引数では、決まった引数が用意されていますが、プロシージャの引数は自由に設定することができます。

引数付きのプロシージャの使い方

引数付きのプロシージャを記述する場合は、以下の書式に則って記述します。引数は「()」(カッコ)に記述しますが、Dimステートメントを除いた変数宣言の形になります。また、引数を複数設定する場合は、引数間に「,(カンマ)」で区切って記述します。

Sub プロシージャ名(引数名1 As データ型, 引数名2 As データ型・・・)
 処理に内容
End Sub

  • ①冒頭に「Sub」を記述し半角スペースを空けます。
  • ②プロシージャ名の後に半角の「()」(カッコ)を記述します。
  • ③「()」(カッコ)内に引数を記述します。
  • ③処理の内容を記述します。
  • ④最後に「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が表示される。

メッセージボックスに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が表示される。

メッセージボックスにVBAを表示

解説

こちらも呼び出し先sampleAプロシージャには引数なし、呼び出し元sampleBプロシージャに引数keyWordsを設定しています。Dimステートメントを利用して変数keyWordsに文字列型(String)を宣言し、変数keyWordsに「VBA」を代入します。

次にCallステートメントを利用してsampleBプロシージャを呼び出します。その際に変数keyWordsを引数として設定します。sampleBプロシージャの引数はキーワードByValを設定していますので、引数は値渡しで渡されます。

今回は、値を渡すだけですので、sampleBプロシージャで変数keyWordsが「InternetExplorer」に代入されたとしてもsampleAプロシージャの変数keyWordsは「VBA」のままです。よって、MsgBox関数を利用してメッセージボックスには、「VBA」が表示されます。

まとめ

今回は、プロシージャについて詳しく解説しました。引数の参照渡しと値渡しで結果が異なりますので、しっかり理解しましょう。次回は、Functionプロシージャと戻り値について解説します。

次の記事: Functionプロシージャとは >>

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

近田 伸矢, 植木 悠二, 上田 寛

IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。

  • このエントリーをはてなブックマークに追加
ExcelのVBAについてのQ&A掲示板

↑ExcelのVBA全般について分からない事があればこちらの掲示板よりご質問ください^^

VBAのInternetExplorer操作入門

↑ExcelのVBAをマスターできたら、エクセルVBAのIE(InternetExplorer)操作にも挑戦してみてください^^

VBAのIE制御入門RSS

RSSフィードを登録すると最新記事を受け取ることができます。

VBAIE操作のスカイプレッスン

エクセルVBAのステートメント

こちらでは、エクセルVBAの事例で利用したステートメントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのオブジェクト

こちらでは、エクセルVBAの事例で利用したオブジェクトをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのプロパティ

こちらでは、エクセルVBAの事例で利用したオブジェクトのプロパティをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのメソッド

こちらでは、エクセルVBAの事例で利用したオブジェクトのメソッドをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのイベント

こちらでは、エクセルVBAの事例で利用したオブジェクトのイベントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。