[Excel で VBA] 引数のある Sub プロシージャ



引数が一つあるプロシージャ

前ページで「プログラムをまとまった機能をもった部品に分割すること」が
プロシージャの役割だと述べた。

ある Sub プロシージャが「まとまった機能をもった部品」であるとき、
その Sub プロシージャは「何らかの目的で便利に使えるもの」であるべきだろう。

しかし、前ページの「subtestプロシージャを実行しました」と表示するだけの subtest プロシージャは、
「便利に使えるもの」とは言いがたい。

そこで、皆さんが知っている命令である MsgBox を例に、「便利に使えるもの」とはどういうものかを考えてみよう。
これまで使ってきてわかるように、MsgBox は文字の集まりである「文字列」を与えられたときに、それが書かれたウインドウを表示するのだった。
その様子が下図に示されている。



与える文字列を変更することで、これまで様々な場面で MsgBox を使って来た。
このとき、MsgBox に与えるデータ (ここでは文字列) を引数 (ひきすう) という。

別の言い方をすると、引数により表示する文字列を変更できることで、MsgBox を様々な場面で用いることができるのである。
このように、「様々な場面で用いることができる」ことを「汎用性 (はんようせい) が高い」という。

以上の議論を踏まえ、先程作成した subtest プロシージャに引数を追加し、(少しだけ) 汎用性を高めてみよう。
それが以下のプログラムである。

Sub prog()
	subtest "金丸隆志"

	MsgBox "メインのプロシージャを終了します"
End Sub

Sub subtest(name As String)
	MsgBox name & "さんがsubtestプロシージャを実行しました"
End Sub

まず、prog プロシージャ内からのsubtest プロシージャの呼び出しが下記のようになっており、
文字列 "金丸隆志" が引数として subtest に渡されていることがわかる。

	subtest "金丸隆志"

ただし、これが実現されるためには、subtest が引数を受け取るようにあらかじめ定義されていなければならない。

それを行っているのが、subtest の1行目である下記の部分である。
カッコの中に、受け取る引数の名前と型を記すことで、その型の引数を受け取れるようになる。

これは、これまで行って来た変数の定義から「Dim」を除いたものと思えば良い。
なお、String は第二回で紹介した、文字列を格納できる型である。

Sub subtest(name As String)

subtest に引数 "金丸隆志" を与えたときのイメージを示したのが下図である。
「Sub subtest(name As String)」により、subtest プロシージャ内部で String 型の変数 name が使え、そこに "金丸隆志" が格納されるのである。
そして、変数 name を用いた MsgBox 命令により、"金丸隆志" という文字列を含む MsgBox が現れるのである。



それでは、このプログラムを実行してみよう。

このプログラムを VBA で実行するには、まず先程のプログラムを下記のように「Option Explicit」を残して削除し、



下記のように新しいプログラムを貼り付ければよい。



実行すると、下記のような MsgBox が現れる。



そして、OKボタンをクリックすると、先程と同じく「メインのプロシージャを終了します」という MsgBox が現れる。



プログラム中の引数である「"金丸隆志"」部を別の名前に変更すると、1番目の MsgBox の内容が変化する。確かめてみるとよい。


引数が二つあるプロシージャ

それでは、今週の課題に進むため subtest に渡す引数を二つにしてみよう。

例えば「"金丸隆志"」という人名と、「70」のようなテストの点数の二つを引数として渡すと、
「金丸隆志さんのさんのテストの点数は70点です」と MsgBox で表示するプログラムが下図である。

Sub prog()
	subtest "金丸隆志", 70
End Sub

Sub subtest(name As String, score As Integer)
	MsgBox name & "さんのテストの点数は" & score & "点です"
End Sub

subtest の呼び出し部が以下のようになっており、二つの引数「"金丸隆志"」と「70」が、
コンマ「, 」で区切って subtest に渡されていることがわかる。

	subtest "金丸隆志", 70

subtest の定義部の冒頭は下記のようになっており、「String 型の変数 name」と「Integer 型の変数 score」が、
やはりコンマ「, 」で区切って引数として定義されていることがわかる。

Sub subtest(name As String, score As Integer)

以上のプログラムが行うことのイメージを下図に示す。
渡された二つの引数「"金丸隆志"」と「70」が subtest 内部ではそれぞれ name、score という変数に格納され、
subtest 内の MsgBox で利用されている。
それにより、「金丸隆志さんのテストの点数は70点です」と書かれた MsgBox が表示されるのである。



それでは、このプログラムを実行してみよう。

このプログラムを VBA で実行するには、まず先程のプログラムを下記のように「Option Explicit」を残して削除し、



下記のように新しいプログラムを貼り付ければよい。



実行すると、下記の MsgBox が表示される。
なお、これまでのプログラムで表示して来た「メインのプロシージャを終了します」という MsgBox は表示しないようにした。





←Sub プロシージャFunction プロシージャ→

Excel で学ぶ Visual Basic for Applications (VBA)に戻る