web-dev-qa-db-fra.com

Fonction VBA Paramètres optionnels

J'appelle plusieurs fois un code spécifique, c'est pourquoi j'aimerais utiliser des paramètres facultatifs ..__ Je peux écrire quelque chose comme:

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

Comment puis-je changer la fonction pour contenir plus de 1 paramètres optionnels?

Quelque chose comme:

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

Suivant les conseils de Pankaj Jaju, j’ai réussi à le faire fonctionner en le changeant pour:

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

Maintenant, comment puis-je effacer la valeur d'un paramètre facultatif? J'en aurai besoin pour certains calculs. Quelque chose comme:

Set strA = Nothing
14
ProtoVB

Changez votre sous et ajoutez 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)

Extraits de Chip Pearson's excellente explication:

Règles régissant l'utilisation de paramètres facultatifs:

  • Le mot clé Optional doit être présent pour rendre un paramètre facultatif.
  • Le type de données doit être (mais pas nécessairement, voir ci-dessous) un type Variant data
  • Le ou les paramètres facultatifs doivent figurer à la fin de la liste des paramètres
  • La fonction IsMissing fonctionnera uniquement avec les paramètres déclarésas Variant. Il renverra False s'il est utilisé avec un autre type de données.
  • Les types définis par l'utilisateur (UTD) ne peuvent pas être des paramètres facultatifs.

Exemple

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

Ici, L1 et L2 sont obligatoires, mais P1 et P2 sont facultatifs. Puisque les deux sont des types Variant, nous pouvons utiliser IsMissing pour déterminer si le paramètre a été passé. IsMissing renvoie True si le paramètre Variant est omis ou False si le paramètre Variant est inclus. Si le type de données du paramètre facultatif est un type de données autre que Variant, IsMissing renverra False.

6
Christopher Peisert

Au lieu de CalculateMe(,strB), vous pouvez utiliser

dblA = CalculateMe strB:="B"
1
user9026558

Je ne suis pas sûr que vous vouliez vraiment dire "optionnel". Dans votre exemple, vous énumérez les arguments comme optionnels, mais vous passez toujours les arguments both à la fonction. 

Dans tous les cas, ici vous passez les deux arguments:

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

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

more code
End Sub

Si vous voulez ne transmettre qu'un seul des arguments, faites comme ceci:

dblA = CalculateMe(, strB)

Ou:

dblA = CalculateMe(strA)

Sinon, si vous passez toujours les deux arguments, cela n'a aucun sens de les avoir Optional.

1
David Zemens