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

VBA 省略可能な引数 Optional と名前指定

はじめに

Excel VBA マクロの関数に省略可能な引数 Optional を渡す方法を紹介します。

省略したときの既定値を設定できます。引数の値がほぼ同じときに便利です。

名前を指定して引数を渡す方法も紹介します。

  • 目次
    • 省略可能な引数を作成する
    • 引数を省略して渡す
    • 名前を指定して渡す

省略可能な引数を作成する

省略可能な引数を作成するにはOptional 引数名 As 型名 = 既定値のように入力します。Optional を付けると省略可能になります。省略されたときの既定値を設定できます。


Sub 関数名(Optional 引数 As String = "既定値")

End Sub

既定値を指定しないとその型の初期値になります。ただし省略したときに何の値になるのかを明示するためにも、必ず既定値は設定します。


Sub 関数名(Optional 引数 As String)

End Sub

Optional を付けられるのは最後の引数です。Optional の前の引数にも付けられます。


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

End Sub

Sub 関数名(引数1 As Integer, Optional 引数2 As Integer = 2, Optional 引数3 As Integer = 3)

End Sub

Optional が付いていない引数の前には付けられません。


' これはできません。
Sub 関数名(Optional 引数1 As Integer = 1, 引数2 As Integer)

End Sub

ByVal や ByRef と組み合わせられます。ParamArray とは組み合わせられません。


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

End Sub

' これはできません。
Sub 関数名(Optional ParamArray 引数1() As Variant)

End Sub

VBA では「MsgBox 関数」や「StrComp 関数」などで使われています。毎回同じ引数を渡すときは、省略して既定値でその値を設定できると便利です。

引数を省略して渡す

引数を省略するには何も入力しないだけです。省略したときは既定値が設定されます。通常の方法で値を渡すこともできます。


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

    Call サブ        ' 1、省略したときは既定値になる
    Call サブ(変数)  ' 2、値を渡すとその値になる
End Sub

' この関数が呼び出されます
Sub サブ(Optional 引数 As Integer = 1)
    Debug.Print (引数)
End Sub

複数の引数を省略するには、何も指定しないで,で区切ります。


Sub 実行()
    Call サブ("前")         ' 前23
    Call サブ(, "中")       ' 1中3
    Call サブ(, , "後")     ' 12後
    Call サブ("前", , "後") ' 前2後
End Sub
       
' この関数が呼び出されます
Sub サブ(Optional 引数1 As String = "1", Optional 引数2 As String = "2", Optional 引数3 As String = "3")
    Debug.Print (引数1 & 引数2 & 引数3)
End Sub

名前を指定して渡す

名前を指定して引数を渡すのに Optional を付ける必要はありません。ただ Optional が付いた引数でよく使われるのでここで紹介します。

引数には引数名:=値のように入力すると、名前を指定してその引数に値を渡せます。名前を指定したときは、引数の順番は関係なくなります。


Sub 実行()
    Call サブ(引数1:="前")              ' 前23
    Call サブ(引数3:="後", 引数2:="中") ' 1中後
    Call サブ("前", 引数3:="後")        ' 前2後
End Sub

' この関数が呼び出されます
Sub サブ(Optional 引数1 As String = "1", Optional 引数2 As String = "2", Optional 引数3 As String = "3")
    Debug.Print (引数1 & 引数2 & 引数3)
End Sub

ただし、名前を指定して渡した引数の後ろにも、名前を付ける必要があります。


Sub 実行()
    Call サブ(引数1:=1, 2)        ' エラー、引数2 も名前で指定する必要あり
    Call サブ(引数2:=2, 1)        ' エラー、引数1 も名前で指定する必要あり
    Call サブ(引数1:=1, 引数2:=2) ' OK
End Sub

' この関数が呼び出されます
Sub サブ(引数1 As String,  引数2 As String)
    
End Sub

名前を指定して渡した引数より後ろに定義されている引数に Optional が付いているときは省略できます。


Sub 実行()
    Call サブ(引数1:=1)    ' OK
    Call サブ(引数1:=1, 2) ' エラー、省略はできても指定するには名前が必要
End Sub

' この関数を呼び出します。
Sub サブ(引数1 As String, Optional 引数2 As String = "2")
    
End Sub

名前を付ける理由

省略可能な引数が多くのある関数で、必要な引数だけに値を渡すためです。


Sub 実行()
    Call サブ(, , , , 5, , , , ,10) ' 何の引数なのかわかりずらい
    Call サブ(引数5:=5, 引数10:=10)  ' 引数の名前でよくわかる
End Sub

もう一つは Boolean の引数の意味を明確にするためです。


Sub 実行()
    Call サブ(True)        ' 何が True なのかわかりずらい
    Call サブ(許可:=True)  ' 許可することが名前でよくわかる
End Sub

このように Optional が付いていると省略できるので、Optional と一緒に使われます。

わざわざすべての引数に名前を付けて渡す必要はありません。上記の例のようにわかりやすいコードになるのなら名前を付けます。

  • 目次
    • 省略可能な引数を作成する
    • 引数を省略して渡す
    • 名前を指定して渡す