2020年6月16日火曜日

[VBA] 11. ユーザー定義関数

ユーザー定義関数の作り方と呼び出し方について。



関数の作り方と呼び出し (戻り値なし)
戻り値のない関数は以下の構成となる。ByVal は値を渡すことを明示している。(参照渡しの時は不要)
Function 関数プロシージャ名(ByVal 引数名 As 引数の型)
    処理
End Function
関数の呼び出し方は Call を使う。Call を省略してもエラーにはならないが、後述する参照渡し(ByRef)の時に困るので省略しない方が無難だと思う。
Call 関数プロシージャ名(引数)

入力された引数に 10 を加算して表示するサンプル。
Sub test()
    Dim num As Long

    num = 20
    Call func_add10(num)  'func_add10() を呼び出し
End Sub

Function func_add10(ByVal a As Long)
    a = a + 10
    Debug.Print a
End Function
実行結果
 30 


関数の作り方と呼び出し (戻り値あり)
戻り値がある関数を作成する場合は、宣言文の末尾に戻り値の型の宣言を不可する。
Function 関数プロシージャ名(ByVal 引数名 As 引数の型) As 戻り値の型
    処理

    関数プロシージャ名 = 戻り値
End Function
関数の呼び出しについては、戻り値なしで使った Call は不要となる。
変数 = 関数プロシージャ名(引数)

入力された引数に 10 を加算して返すサンプル。ByVal で値を渡すことを明示しているため、関数内の処理は num1 に影響しない。
Sub test()
    Dim num1 As Long, num2 As Long

    num1 = 20
    num2 = func_add10(num1)  'func_add10() を呼び出し
    
    Debug.Print num1; num2   'num1 と num2 の値を表示
End Sub

Function func_add10(ByVal a As Long) As Long
    a = a + 10
    func_add10 = a  '戻り値を返す
End Function
実行結果
 20  30 

引数が複数ある場合は (ByVal 引数名1 As 引数1の型, ByVal 引数名2 As 引数2の型, ...) となります。


参照渡し
引数の参照渡しを行う場合は、ByVal を省略するか、ByRef とします。試しに前述した 10 を加算して返すサンプルを参照渡しにすると、関数内の処理が num1 に影響していることがわかります。
戻り値なしの場合は必ず Call を使って呼び出さないと、挙動が変わる(呼び出し元の変数が変化しない)ので注意。
Sub test()
    Dim num1 As Long, num2 As Long

    num1 = 20
    num2 = func_add10(num1)  'func_add10() を呼び出し
    
    Debug.Print num1; num2   'num1 と num2 の値を表示
End Sub

Function func_add10(ByRef a As Long) As Long
    a = a + 10
    func_add10 = a  '戻り値を返す
End Function
実行結果
 30  30 



0 件のコメント:

コメントを投稿