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
Changez votre sous et ajoutez ByVal
Public Sub CalculateMe(Optional ByVal strA As String, Optional ByVal strB As String)
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:
Optional
doit être présent pour rendre un paramètre facultatif.Variant
data 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.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
.
Au lieu de CalculateMe(,strB)
, vous pouvez utiliser
dblA = CalculateMe strB:="B"
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
.