VBAプログラミング(関数と引数)

VBA実践

このページでは

VBAの引数についての説明と、引数(ひきすう)を使ったプログラミングをします。
同じ関数でも、引数の値を変えることによって様々な働きをすることを体験します。

ポイント

引数とは

関数やプロシジャー(Sub、Function)を利用する際に、値をやりとりするための変数、式、または値のことを引数(ひきすう)といいます。
VBA以外のプログラミング言語や、数学における関数でも、引数は同様の意味合いで使われます。

Sample01では、MsgBox関数を使っていましたが、MsgBox関数の記述で書いた”ハロー”の部分が引数です。

Sub sample01()

  MsgBox "ハロー"

End Sub

実行結果
cap_20160909092830_1005

引数に関する知識

仮引数と実引数

利用する側(呼び出す側)の引数を「実引数(argument(アーギュメント))」、利用される側(呼び出される側)の引数を「仮引数(parameter(パラメーター))」と呼びます。
一般的には、仮引数、実引数の定義を呼び分ける必要はなく、仮引数と実引数ともに、引数と呼んで構いません。
VBAでは、引数に、やりとりの方法(値渡し、参照渡し)や属性(Integer、String、・・・)、Optional指定(省略可・不可)を指定することが出来ます。

値渡しと参照渡し

引数には、値渡しと参照渡しの2つのやりとりの方法があり、通常は参照渡しで行われます。
参照渡しは、引数のアドレスがやりとりされるため、値渡しよりも効率的なので、一般的に処理も早いです。
値渡しは、引数の値がコピーされるため、参照渡しよりも性能面で劣るが、意図しない引数の値の変化から発生するバグは発生しません。
 こちらには参照渡しと値渡しの違いを実際のプログラミングで示した例があります。
 参照:VBAの参照渡しと値渡しの違い(VBA実験室)

Optional指定

関数やプロシジャー(利用される側、呼び出される側)でOptionalを指定すると、その引数を省略して定義することが出来ます。例えば、MsgBox関数は、複数の仮引数を持つ関数ですが、例題では1つしか引数を指定していません。これは省略可能の定義になっているからです。

引数の理解を深めるためのサンプルプログラム

MsgBox関数を使った簡単なサンプルプログラムを通して、引数について体験してみましょう。
6つのサンプルプログラムを用意しました。

表の”prompt”,”button”,”title”はMsgBox関数の引数です。
○印が付いているのは、例の中で使用している引数です。

サンプル内容promptbuttontitle備考
メッセージのみを指定
例1と同様(メッセージのみ)で値を変更
アイコンも指定
タイトルも指定
問いかけ型のボタンを指定

例1 メッセージのみを指定

メッセージ(引数:prompt)のみを使った例です。
第一章「誰にでも出来るはじめてのVBAプログラミング」で使ったサンプルプログラムと同じ内容です。
MsgBox関数に、”ハロー”と表示させます。

サンプルプログラムソース sample01

Sub sample01()

' ハローと言う
  MsgBox "ハロー"

End Sub

sample01の実行結果

cap_20160923112650_1001

sample01の解説

MsgBox関数の引数promptに、”ハロー”という値を渡して呼び出すと、上記の実行結果のように、引数で渡した”ハロー”が表示されます。

例2 例1と同様(メッセージのみ)で値を変更

例1と同様(メッセージ(prompt)のみ)で、渡す値を変えた例です。
例1では”ハロー”でしたが、今度は”こんにちは”と表示させます。

サンプルプログラムソース sample02

Sub sample02()

' こんにちはと言う
  MsgBox "こんにちは"

End Sub

sample02の実行結果

cap_20160923112650_1002

sample02の解説

MsgBox関数の引数promptに、”こんにちは”という値を渡して呼び出すと、上記の実行結果のように、引数で渡した”こんにちは”が表示されます。

このように、引数のメッセージ(prompt)に渡した値が、MsgBox関数に表示されます。
これで、どんなメッセージでも、MsgBox関数で表示出来るようになりました。

例3 アイコンも指定

引数にメッセージ(prompt)だけでなく、アイコン(button)も指定した例です。
MsgBox関数のボタン(botton)の値に、vbinformationを指定して、情報アイコンを表示させました。
この先で説明する例5では、vbCriticalを指定して、警告アイコンを表示しています。

サンプルプログラムソース sample03

Sub sample03()

' こんにちはと言いながら、情報アイコンも付ける
  MsgBox "こんにちは", vbInformation

End Sub

sample03の実行結果

cap_20160923112650_1003

sample03の解説

アイコン(button)には、様々な値を指定することが出来ます。(MsgBox関数のリファレンス参照)
指定しないと、アイコンなしでOKボタンのみ表示するvbOKOnlyになりますが、今回はvbInformationを指定することで、情報メッセージ アイコンを表示させました。

例4 タイトルも指定

引数にメッセージ(prompt)やアイコン(button)だけでなく、タイトル(title)も指定した例です。
MsgBox関数のタイトル(title)の値に、”デザインポケット”という値を渡してタイトルに表示させています。

サンプルプログラムソース sample04


Sub sample04()

' こんにちはと言いながら、情報アイコンも付ける、タイトルも付ける
  MsgBox "こんにちは", vbInformation, "デザインポケット"

End Sub

sample04の実行結果

cap_20160923112650_1004

sample04の解説

タイトル(title)は自由に指定することが出来ます。
指定しないと、アプリケーション名(=Microsoft Excel)になります。
タイトルを指定すると、ぐっと自分で作ったプログラムらしくなりますね。

例5 問いかけ型のボタンを指定

引数buttonに、問いかけ型のボタンが表示される値を指定して会話型のプログラムにします。
MsgBox関数の引数buttonは、アイコンを変えることが出来るだけでなく、表示されるボタンの内容やフォーカスを与えるボタンを指定することが出来ます。
いきなり少し長いプログラムになりましたが、ノリで読んでみてください。

サンプルプログラムソース sample05

Sub sample05()

' あいさつ(Sample04と同じ)
  MsgBox "こんにちは", vbInformation, "デザインポケット"
  
' 返事の値を保持する領域の定義
  Dim result As Integer
  
' お元気ですか?と問いかける
  result = MsgBox("お元気ですか?", vbYesNo, "デザインポケット")
  
' 返事に応じた処理
  If result = vbYes Then
'   返事がはいの場合
    MsgBox "お元気でなによりです。", vbInformation, "デザインポケット"
  Else
'   返事がいいえの場合
    MsgBox "どうなされました!?", vbCritical, "デザインポケット"
    MsgBox "お大事にしてください。", vbInformation, "デザインポケット"
  End If
  
End Sub

sample05の実行結果

4行目の実行結果

cap_20160923112650_1005

10行目の実行結果

cap_20160923112650_1006

15行目の実行結果

10行目で表示したMsgBox関数で「はい」ボタンをクリックした際に表示される内容
cap_20160923112650_1007

18行目の実行結果

10行目で表示したMsgBox関数で「いいえ」ボタンをクリックした際に表示される内容
cap_20160923112650_1008

19行目の実行結果

10行目で表示したMsgBox関数で「いいえ」ボタンをクリックした際に表示される内容
cap_20160923112650_1009

sample05の解説

[]内はサンプルプログラムの行番号

最初のあいさつ [3-4]

例4と同様

返事の値を保持する領域の定義 [5-6]

MsgBox関数で問いかけた結果を保存しておく領域を変数resultとして定義します。
ここでは数値型(Integer)になります。
※このページでは引数を経験することがテーマなので、わからないときは読み流しても大丈夫です。

お元気ですか?と問いかけ [9-10]

MsgBox関数の引数buttonにvbYesNoを指定します。
これにより、「はい」ボタンと「いいえ」ボタンが表示されるます。
また「はい」「いいえ」のどちらがクリックされたか、MsgBox関数の戻り値として取得出来るので、変数resultに保存します。

「はい」ボタンがクリックされたときの処理 [13,15]

MsgBox関数に”お元気でなによりです。”というメッセージを情報アイコンとともに表示させます。

「いいえ」ボタンがクリックされたときの処理 [13,18-19]

MsgBox関数に”どうなされました。”というメッセージを警告アイコンとともに表示させます。
続いて、MsgBox関数に”お大事にしてください。”というメッセージを情報アイコンとともに表示させます。

※ 警告アイコンよりも、注意アイコンの方がよかったかも(!)。

例6 例5を書き直した形

例5と同じ内容ですが、タイトルの指定を変数に書き直しました。
通常のプログラミングではこのような記述になると思います。

サンプルプログラムソース sample06

Sub sample06()

' タイトルの値を保持する領域の定義と値のセット
  Dim mtitle As String
  mtitle = "デザインポケット"

' あいさつ(Sample04と同じ)
  MsgBox "こんにちは", vbInformation, mtitle
  
' 返事の値を保持する領域の定義
  Dim result As Integer
  
' お元気ですか?と問いかける
  result = MsgBox("お元気ですか?", vbYesNo, mtitle)
  
' 返事に応じた処理
  If result = 6 Then
'   返事がはいの場合
    MsgBox "お元気でなによりです。", vbInformation, mtitle
  Else
'   返事がいいえの場合
    MsgBox "どうなされました!?", vbCritical, mtitle
    MsgBox "お大事にしてください。", vbInformation, mtitle
  End If
  
End Sub

sample06の実行結果

sample05の実行結果と同様です。

sample06の解説

sample05と同様のプログラムですが、引数titleの部分がmtitleになっています。
通常のプログラミング時には、このように、同じ値(ここでは”デザインポケット”という値)をあちこちで使う場合には、変数(ここではmtitle)に値を設定して使います。

このように記述しておくことで、タイトルを変更したい場合でも、変数に値を設定している部分だけの修正で済みます。
(あちこちにタイトルの値を記述していると修正したいとき、すべて修正しなければならない。)

※ 今回は変数に値を設定したが、定数として定義するのがベスト。
※ 変数resultを使用せず、いきないMsgBox関数の値をIF文で判断してもOK
  こんな感じ

' resultを使わずに条件判断
  If MsgBox("お元気ですか?", vbYesNo, mtitle) = 6 Then
'   返事がはいの場合
    MsgBox "お元気でなによりです。", vbInformation, mtitle
  Else
'   返事がいいえの場合
    MsgBox "どうなされました!?", vbCritical, mtitle
    MsgBox "お大事にしてください。", vbInformation, mtitle
  End If

まとめ

引数とはどんなものか、ということがわかれば、このページは理解した、と思っていいと思います。

タイトルとURLをコピーしました