他のプロシージャを呼び出す
モジュール内に存在するプロシージャを呼び出すには、callという命令を使う。
Sub Sample()
Range("A1").Value = 100
Call Sample2()End
SubSub
Sample2()
Range("B1").Value = Range("A1").Value * 2
End Sub
他のプロシージャを呼び出すCallは省略も可能である。
Sub Sample()
Range("A1").Value = 100
Sample2()End
SubSub
Sample2()
Range("B1").Value = Range("A1").Value * 2
End Sub
Functionプロシージャ
Functionプロシージャは、実行の結果を呼び出し元に返す働きをする。
Functionプロシージャの書式
Function プロシージャ名(受け取る値) As 返すデータ型
プロシージャの引数
プロシージャには引数としてデータを渡すことができる。
引数をやり取りするマクロでは、引数を受け取るプロシージャ側でどんな引数を
いくつ受け取るかを決めておき、引数を渡すプロシージャ側では決められた通り
に引数を渡す。
参照渡しと値渡し
Sub Sample()
Dim buf As String
buf = “Excel VBA”
Call Sample2(buf)
MsgBox buf
End Sub
Sub Sample2(msg As String)
msg = “VBAエキスパート”
End Sub
上記のマクロを実行すると、呼び出し元(Sample)の変数bufが変更される。
これは、SampleからSample2へ「変数そのもの」を渡したためである。
このようなデータの渡し方を参照渡しと呼ぶ。
値を参照渡しで受け取る場合は、受け取り側の引数の定義にByRefというキーワードをつけるのがルールである。
キーワードを省略した場合はByRefが指定されたものとみなす。
Sampleを下記のように書き換える
Sub Sample()
Dim buf As String
buf = “Excel VBA”
Call Sample2(buf)
MsgBox buf
End Sub
Sub Sample2(ByVal msg As String)
msg = “VBAエキスパート”
End Sub
上記のマクロを実行すると、変数bufの値は書き換わらない。
Sample2の引数の定義にByValというキーワードをつけたため、Sampleは変数そのものを渡したのではなく、「変数の値だけ」を渡したからである。
これを値渡しと呼ぶ。
省略可能な引数を定義する
省略可能な引数には、引数の前にOptionalというキーワードをつける。
Sub Sample(msg As String,Optional n As Long)
Dim i As Long,buf As String
For i = 1 To n
buf = buf & msg & vbCrLf
Next
MsgBox buf
End Sub
引数が省略されたときの対応には、2通りの考え方がある。
初期値を設定しておく
プロシージャで引数を定義するときに、その引数が省略された時の初期値を設定しておく。
Sub Sample()
Call Sample2(“Excel”)
End Sub
Sub Sample2(msg As String,Optional n As Long = 3)
Dim i As Long,buf As String
For i = 1 To n
buf = buf & msg & vbCrLf
Next
MsgBox buf
End Sub
Optionalをつけて可能にした引数nが省略された場合、引数nには初期値である
「3」が設定される。
省略されたことを調べる
Optionalをつけて省略可能にした引数が省略されたかどうかは、IsMissing関数で判定できる。
IsMissing関数は引数が省略されるとTrueを返す。
IsMissing関数で判定する引数はバリアント型でないといけない。
次のマクロは引数が省略されたときに、引数nに3を代入する。
Sub Sample()
Call Sample2(“Excel”)
End Sub
Sub Sample2(msg As String,Optional n)
Dim i As Long,buf As String
If IsMissing(n) = True Then n = 3
For i = 1 To n
buf = buf & msg & vbCrLf
Next
MsgBox buf
End Sub