web-dev-qa-db-ja.com

VBA関数のオプションパラメーター

特定のコードを数回呼び出しているため、オプションのパラメーターを使用したいと思います。私は次のようなものを書くことができます:

Public Sub main()

strA = "A"

'Calling the function
CalculateMe (strA)

End Sub

Public Sub CalculateMe(strA As String)

    Set rs = DB.OpenRecordset("tbl_A")
    rs.MoveFirst
        Do Until rs.EOF
            If rs.Fields(0) = strA Then
                dblA = rs.fields(2).Value
            End If
            rs.MoveNext
        Loop
End Sub

複数のオプションパラメータを保持するように関数を変更するにはどうすればよいですか?

何かのようなもの:

Public Sub main()
strA = "A"
strB = "B"

'Calling the function
CalculateMe (strA, strB)

more code
End Sub

Public Sub CalculateMe(Optional strA As String, Optional strB as String)

    Set rs = DB.OpenRecordset("tbl_A")
    rs.MoveFirst
        Do Until rs.EOF
            If rs.Fields(0).Value = strA And rs.Fields(1).Value = strB Then
                dblA = rs.Fields(2).Value
            End If
            rs.MoveNext
        Loop
End Sub

Pankaj Jajuのアドバイスに従って、私はそれを次のように変更して実行することができました。

Public Sub main()
strA = "A"
strB = "B"

'Calling the function
dblA = CalculateMe (strA, strB)

End Sub

Public Function CalculateMe(Optional ByVal strA As String, Optional ByVal strB as String)

Set rs = DB.OpenRecordset("tbl_A")
rs.MoveFirst
    Do Until rs.EOF
        If rs.Fields(0).Value = strA And rs.Fields(1).Value = strB Then
            dblA = rs.Fields(2).Value
        End If
        rs.MoveNext
    Loop
End Sub

ここで、オプションのパラメーターの値をクリアするにはどうすればよいですか?いくつかの計算でこれが必要になります。何かのようなもの:

Set strA = Nothing
16
ProtoVB

サブを変更してByValを追加します

Public Sub CalculateMe(Optional ByVal strA As String, Optional ByVal strB As String)
12
Pankaj Jaju
Public Sub CalculateMe(Optional varA As Variant, Optional varB as Variant)

Chip Pearson's 優れた説明からの抜粋:

オプションのパラメーターの使用を管理する規則:

  • パラメーターをオプションにするには、Optionalキーワードが存在する必要があります。
  • データ型はVariantデータ型である必要があります(必須ではありません)。
  • オプションのパラメータは、パラメータリストの最後にある必要があります。
  • IsMissing関数は、Variantとして宣言されたパラメーターでのみ機能します。他のデータ型で使用すると、Falseを返します。
  • ユーザー定義型(UTD)をオプションのパラメーターにすることはできません。

Function Test(L1 As Long, L2 As Long, _
    Optional P1 As Variant, Optional P2 As Variant) As String

    Dim S As String

    If IsMissing(P1) = True Then
        S = "P1 Is Missing."
    Else
        S = "P1 Is Present (P1 = " & CStr(P1) & ")"
    End If

    If IsMissing(P2) = True Then
        S = S & "  " & "P2 Is Missing"
    Else
        S = S & "  " & "P2 Is Present (P2 = " & CStr(P2) & ")"
    End If

    Test = S
End Function

ここでは、L1とL2の両方が必須ですが、P1とP2はオプションです。両方ともVariant型なので、IsMissingを使用して、パラメーターが渡されたかどうかを判断できます。IsMissingは、Trueパラメーターが省略された場合、Variantを返します。 Falseパラメーターが含まれている場合はVariant。オプションパラメータのデータ型がVariant以外のデータ型の場合、IsMissingFalseを返します。

7

CalculateMe(,strB)の代わりに使用できます

dblA = CalculateMe strB:="B"
2
user9026558

あなたが本当に「オプション」を意味するかどうかはわかりません。この例では、オプションとして引数をリストしていますが、まだboth引数を関数に渡しています。

いずれにしても、ここではboth引数を渡します:

Public Sub main()
strA = "A"
strB = "B"

'Calling the function
dblA = CalculateMe(strA, strB)

more code
End Sub

引数の1つだけを渡したい場合は、次のようにします。

dblA = CalculateMe(, strB)

または:

dblA = CalculateMe(strA)

そうではなく、常に両方の引数を渡す場合、Optionalを使用しても意味がありません。

1
David Zemens