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

VBA 関数に引数を渡す

はじめに

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

関数に引数を渡すと関数の動作を柔軟に変更できます。

引数を持つ関数の作成

Sub と Function に引数の違いはありません。

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

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

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

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

End Sub

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

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

End Sub

引数には ByVal と ByRef の渡し方があります。詳細は次の項目で紹介します。

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

End Sub

関数に引数を渡す

関数に引数を渡すには次のようにします。

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

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

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

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

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

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

ByVal、ByRef を省略すると ByRef 扱いになります。

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

Sub Tips()
    Dim i As Integer
    i = 1
    サブ i
    Debug.Print (i) ' i が 2 になる。ByVal だと 1 のまま
End Sub

VBA でやっかいなのは、上のコードで引数に () を付けていません。実は () を付けると ByRef でも値が変更されません。

Sub Tips()
    Dim i As Integer
    i = 1
    サブ (i) ' i は 1 のまま
    サブ i ' i は 2 になる
    Call サブ(i) ' i は 3 になる
End Sub

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

そもそも ByRef を使用するとバグの温床になりかねません。そのため ByRef が必要になるときは設計を見直して、引数に ByVal を付けるようにしたほうが現実的です。

関連ページ