【プロシージャの呼び出し】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

関連リンク

ページの先頭へ