サイトについて      連絡先   検索

VBA 関数に引数を渡す

はじめに

Excel VBA の関数に引数を渡す方法を紹介します。

ByVal (値渡し) と ByRef (参照渡し) の 2 種類の渡し方があります。

引数を使って処理を分岐させるなど、柔軟な動作ができます。

引数を持つ関数の作成

Sub と Function の両方で同じように引数を渡せます。引数は変数を宣言するのと同じです。

一つの引数を持つ関数を作成するには次のようにします。

Function 関数名(引数 As String)
    
End Function

複数の引数を持つ関数を作成するには、引数を , で区切って複数作成できます。

Sub 関数名(引数1 As String, 引数2 As Integer)

End Sub

引数を配列にするには、引数に () を付けます。

Sub 関数名(引数() As Integer)

End Sub

関数に引数を渡す

関数に引数を渡すには関数名 (引数)のようにします。

Sub 実行()
    ' 関数に引数を渡します。
    サブ ("Tips")
End Sub

' この関数に引数を渡します。
Sub サブ(引数1 As String)
    Debug.Print (引数1)
End Sub

複数の引数を渡すには、渡す値を , で区切って渡します。

Sub 実行()
    ' 関数に引数を渡します。
    サブ ("Tips", 100)
End Sub

' この関数に引数を渡します。
Sub サブ(引数1 As String, 引数2 As Integer)
    Debug.Print (引数1)
    Debug.Print (引数2)
End Sub

ByVal と ByRef の違い

引数には ByVal (値渡し) と ByRef (参照渡し) の 2 種類があります。省略すると ByRef になります。

Sub 関数名(ByVal 引数val As String, ByRef 引数ref As Integer)

End Sub

引数は値が渡されるだけでなく、変数と同じように引数に値を設定できます。この時、ByVal と ByRef で違いがあります。

Sub 関数名(引数 As String)
    引数 = "Tipsfound"
End Sub

ByVal と ByRef の違いは、引数に渡した変数の値が関数呼び出し後に変更されるかどうかです。

Sub 実行()
    Dim 変数 As Integer
    変数 = 1

    サブVal 変数
    Debug.Print (変数) ' ByVal だと 1 のまま
  
    サブRef 変数
    Debug.Print (変数) ' ByRef だと変数が 2 になる
End Sub

' この関数を呼び出します。
Sub サブVal(ByVal 引数1 As Integer)
    引数1 = 2
End Sub

Sub サブRef(ByRef 引数1 As Integer)
    引数1 = 2
End Sub

注意点

VBA でやっかいなのは、上のコードで Sub 関数の引数に () を付けていません。実は () を付けると ByRef でも値が変更されません。ただし、Call で呼び出したときは ByRef の動作になります。

Function 関数は必ず () が必要で ByRef の動作になるので問題ありません。

Sub 実行()
    Dim 変数 As Integer
    変数 = 1

    サブRef (変数)
    Debug.Print (変数) ' ByRef でも変わらず 1 のまま
    
    サブRef 変数
    Debug.Print (変数) ' 値が変更され 2 になる
    
    Call サブRef(変数)
    Debug.Print (変数) ' 値が変更され 3 になる
End Sub

このことから Sub 関数を呼び出すには見やすさからも Call を付けるのをオススメします。

そもそも ByRef はバグの温床になりかねないので使用しないのが一般的です。ただし ByVal を省略すると自動で ByRef になるので必ず ByVal を付けるように注意します。ByRef が必要になるときは設計を見直して、引数に ByVal を付けることを心がけます。

関連ページ