【プロシージャの呼び出し】Sub・Function
今回の目標
- 他のプロシージャを呼び出せるようになる
- 他のプロシージャから値を取得できるようになる
説明
始めに
マクロにいろいろな機能をつけていくと、1つのプロシージャの行数(ステップ数)が大きくなりがちです。これは可読性の低下を招きますので、機能毎に分けて記載すると良いでしょう。
プロシージャの呼び出し
基本例文です。
' Mainプロシージャを起動してShowMsgプロシージャを呼び出す
Sub MainSample1()
' 下の「ShowMsg」プロシージャに移動する
ShowMsg
End Sub
' メッセージを表示するだけのプロシージャ
Sub ShowMsg()
MsgBox "Hello World!!"
End Sub
Mainプロシージャを実行すると、ShowMsgプロシージャに移動します。
F8ボタンでステップインをして動きを見てみると良いでしょう。F8ボタンを連続して押すと、1ステップずつ実行します。
引数付きサブプロシージャ
プロシージャ名の後ろにあるカッコ内に引数を追加できます。引数とは、呼び出し元のプロシージャから呼び出し先のプロシージャに値(オブジェクト変数)を渡すことが出来ます。
この時、値をコピーしてプロシージャ先に渡す『値渡し』と、プロシージャ元の変数自体を渡す『参照渡し』の2種類があります。
値渡しはプロシージャ先の変数を変更しても、呼び出し元のプロシージャの変数には影響を与えません。
それに対し、参照渡しはプロシージャ先の変数で変更すると、呼び出し元のプロシージャでも変数が変更されます。
なお、引数付きのプロシージャからマクロを実行することはできません。
値渡し
値渡し の Subプロシージャ 基本構文("Byval"は省略できません)
Sub プロシージャ名(Byval 引数名 As 型名)
値渡しの使用サンプルです。
' 引数付きのプロシージャ(値渡し)
Sub MainByval()
Dim str As String
str = "ABC"
ShowMsgByval str
'呼び出し元:ABC と表示される
MsgBox "呼び出し元:" & str
End Sub
Sub ShowMsgByval(Byval msg As string)
msg = msg & "DEF"
'呼び出し先:ABCDEF と表示される
MsgBox "呼び出し先:" & msg
End Sub
上記サンプルを実行すると2回メッセージボックスが表示されます。
・1回目のメッセージボックス:ABCDEF
・2回目のメッセージボックス:ABC
参照渡し
参照渡し の Subプロシージャ 基本構文("Byref"は省略可能です)
Sub プロシージャ名(Byref 引数名 As 型名)
参照渡しの使用サンプルです。
' 引数付きのプロシージャ(参照渡し)
Sub MainByref()
Dim str As String
str = "ABC"
ShowMsgByref str
'呼び出し元:ABCDEF と表示される
MsgBox "呼び出し元:" & str
End Sub
Sub ShowMsgByref(Byref msg As string)
msg = msg & "DEF" '← ここで呼び出し元の変数ごと値を変更
'呼び出し先:ABCDEF と表示される
MsgBox "呼び出し先:" & msg
End Sub
上記サンプルを実行すると2回メッセージボックスが表示されます。
・1回目のメッセージボックス:ABCDEF
・2回目のメッセージボックス:ABCDEF
「Byref」を指定した場合、呼び出し先のプロシージャで引数の変数を変更すると、呼び出し元の変数の値も変更されます。
Functionプロシージャ
Functionプロシージャは、プロシージャ名を変数のように値を格納することで、呼び出し元に値(オブジェクト)を返すことが出来ます。
' 税抜き500円を税込みにする
Sub MainFnc1()
Dim Siharai As long
Siharai = AddShohizei1(500)
Msgbox "税込み金額は" & Siharai & "円です。"
End Sub
Function AddShohizei1(Byval Zeinuki As long)
'消費税率:10%
AddShohizei1 = Zeinuki * (1.10)
End Sub
Fucntionプロシージャでは返す型を指定できます。
型を省略するとと、自動的に Variant型 になります。
処理速度が落ち、エラーの原因になりえるため、可能な限り型を指定しましょう。
' 税抜き500円を税込みにする
Sub MainFnc2()
Dim Siharai As long
Siharai = AddShohizei1(500)
Msgbox "税込み金額は" & Siharai & "円です。"
End Sub
Function AddShohizei2(Byval Zeinuki As long) As Long
'消費税率:10%
AddShohizei12 = Zeinuki * 1.1
End Sub
関連リンク
次ページ:【例外処理】エラーキャッチの方法