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

<< エクセルVBAのIE制御に利用したステートメント一覧(VBAのIE制御入門) :前の記事

<< エクセルVBAのプログラムの制御構文(VBAの初心者入門) :前の記事

こちらは、エクセルVBASubステートメントの解説になります。Subプロシージャを作成するために利用されるステートメントですので、しっかり覚えましょう。

また、ステートメントとは「命令文」と訳されるようにコンピュータに具体的な動作を指定する最小単位のプログラムです。主にマクロの挙動を制御する構文や文法を指します。通常は1行で完結する部分を指しますが、If~Thenなど複数行にまたがる部分を意味することもあります。

目次

Subステートメントとは

Subステートメントは、Subプロシージャの名前、引数、Subプロシージャの本体を宣言します。

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

構文 [Private | Public | Friend] [Static] Sub name [(arglist)]
・・・
End Sub
キーワード省略説明
PrivateSubプロシージャを記述したモジュールからのみ参照できるSubプロシージャを宣言するときに指定します。
Publicすべてのモジュールのすべてのプロシージャから参照できるSubプロシージャを宣言するときに指定します。
また、Public、Private、Friendを指定しない場合は、Publicで設定されます。
Friendクラスモジュール内でのみ使用できます。Friendを指定したSubプロシージャは、プロジェクト全体から参照できますが、オブジェクトのインスタンスのコントローラからは参照できません。
StaticSubプロシージャのローカル変数の値をプロシージャの呼び出し間で保存するときに指定します。
また、Staticを指定しない場合は、ローカル変数の値は、Subプロシージャの実行が終了すると破棄されます。
name×定義するSubプロシージャの名前を指定します。変数の標準的な命名規則に従って名前を付けます。
引数省略説明
arglistSubプロシージャが受け取る引数リストを指定します。複数の変数を指定する時は、カンマ (,) で区切ります。

引数arglist

構文 [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
キーワード省略説明
OptionalOptionalを付けた宣言した引数は、Subプロシージャを呼び出す際に省略することができますが、Optionalを付けた引数以降の引数にもすべてOptionalを付ける必要があります
ByValその引数が値渡しで渡されることを示します。
ByRefその引数が参照渡しで渡されることを示します。ByValまたはByRefを記述しなかった場合は、ByRefが指定されたものとして扱われます。
ParamArray引数 arglist の最後に指定する引数としてのみ使用でき、その最後の引数がバリアント型 (Variant) の要素を持つ省略可能 (Optional) な配列であることを示します。ParamArrayを利用すると任意の数の引数を渡すことができます。ParamArrayは、ByVal、ByRef、Optionalの各キーワードと共に使うことはできません。
varname×引数の名前を設定します。変数の標準的な命名規則に従って名前を付けます。
type引数のデータ型を設定します。パラメータにOptionalが指定されていない場合は、ユーザー定義型またはオブジェクトの種類を指定することもできます。
defaultvalue任意の定数または定数の式を指定します。Optionalを指定したパラメータに対してのみ有効です。データ型がオブジェクト型 (Object) の場合、明示的な既定値はNothingだけです。

参照渡し

参照渡しとは、プロシージャに引数として変数を渡すときに、変数に格納されている値ではなく変数そのもの渡す方法です。値をコピーする必要がないため、無駄にメモリを消費することがありません。注意点としては、変数そのものを渡すため、呼び出し先のプロシージャ内で変数の値が変更してしまいます。こちらを理解した上で設定しましょう。

値渡し

値渡しとは、プロシージャに引数として変数を渡すときに、変数に格納されている値そのものを渡す方法です。値をコピーするため、その分メモリを消費します。値を渡していますので、呼び出し先のプローシージャ内で値が変更されることはありません。処理パフォーマンスの観点から見ると無駄にメモリを消費しない参照渡しを利用することが多いですが、値の変更を行いたくない場合は、値渡しを利用しましょう。

引数を渡してメッセージボックスを表示するサンプルコード


Sub sample1()

    '①VBA
    Call msg
    
    '②InternetExplorer
    Call msg("InternetExplorer")

End Sub

Sub msg(Optional strMsg As String = "VBA")

    MsgBox strMsg

End Sub

実行結果

①メッセージボックスにVBAが表示される。
②メッセージボックスにInternetExplorerが表示される。

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

解説

呼び出し先sample1のSubステートメントには引数なし、呼び出し元msgには引数strMsgを設定しています。そして、Callステートメントを利用してmsgプロシージャを実行しています。

最初のmsgプロシージャ①に引数は設定していませんが、msgプロシージャ側に引数省略ができる「Optional」が設定されており、更に初期値に「VBA」を設定しています。よって引数なしの場合は、MsgBox関数を利用してメッセージボックスに「VBA」を表示させます。

2回目のmsgプロシージャ②には「InternetExplorer」が引数strMsgに代入されメッセージボックスに「InternetExplorer」を表示させます。

最後はEndステートメントを利用してsample1プロシージャを終了させます。

参照渡しでメッセージボックスを表示するサンプルコード


Sub sample2()

    Dim keyWords As String
    
    keyWords = "VBA"
    
    Call value1(keyWords)

    'InternetExplorer(参照渡し)
    MsgBox keyWords
    
    
End Sub

Sub value1(keyWords As String)
    keyWords = "InternetExplorer"
End Sub

実行結果

メッセージボックスにInternetExplorerが表示される。

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

解説

こちらは「参照渡し」のサンプルです。 呼び出し先sample2のSubステートメントには引数なし、呼び出し元value1には引数keyWordsを設定しています。まず、Dimステートメントを利用して変数keyWordsに文字列型(String)を宣言し、「VBA」を代入します。

次にCallステートメントを利用してvalue1プロシージャを呼び出します。その際に変数keyWordsを引数として設定します。value1プロシージャの引数は「ByVal/ByRef」を明示していませんので、自動的に「ByRef」が設定され、参照渡しで渡されます。

今回は、変数keyWordsを渡していますので、value1プロシージャで変数keyWordsが「InternetExplorer」に変更されます。これにより、メッセージボックスには、「InternetExplorer」が表示されます。

値渡しでメッセージボックスを表示するサンプルコード


Sub sample3()

    Dim keyWords As String
    
    keyWords = "VBA"
    
    Call value2(keyWords)
    
    'VBA(値渡し)
    MsgBox keyWords
    
    
End Sub

Sub value2(ByVal keyWords As String)
    keyWords = "InternetExplorer"
End Sub

実行結果

メッセージボックスにVBAが表示される。

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

解説

こちらは「値渡し」のサンプルです。 呼び出し先sample3のSubステートメントには引数なし、呼び出し元value2には引数keyWordsを設定しています。
まず、Dimステートメントを利用して変数keyWordsに文字列型(String)を宣言し、変数keyWordsに「VBA」を代入します。

次にCallステートメントを利用してvalue1プロシージャを呼び出します。その際に変数keyWordsを引数として設定していますが、 value2プロシージャの引数は「ByVal」を設定しているため、値渡しで渡されます。

今回は、変数keyWordsの値「VBA」を渡していますので、sample3プロシージャ側の変数keyWordsは「VBA」のままとなります。これにより、メッセージボックスには、「VBA」が表示されます。

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には様々な機能が用意されていますので一度ご確認ください。