Variables Optionnelles
Bonjour,
Je voulais savoir si dans un fonction à 4 variables, elles pouvaient toutes être Optionnelles ou si au moins une variable était obligatoire ?
Bonsoir,
Je suppose dans une fonction personnalisée VBA. Par défaut, les arguments (dans une fonction ou dans une procédure) sont obligatoires sauf si l'argument est précédé par le mot clé
OptionalBonsoir @Raja,
Merci de la réponse
Oui j'ai oublié de préciser que c'était dans une procédure privée dans Excel BVA.
Je comprends qu'il faut mettre Optional devant les variables.
Si la procédure à 4 variables, n'est-on pas obligé d'avoir un variable obligatoire (Sans Optional) et les 3 autres évidement avec Optional devant
Bonjour,
ben teste et dis-nous la réponse
eric
Bonsoir et merci
Quand je fais dans une nouvelle Procédure Privée ça fonctionne.
Par contre, quand je modifie les conditions des variables optionnelles dans une Procédure Privée, les nouvelles conditions ne sont pas prises.
Je fais les conditions avec IsMissing()
C'est pour cela que je posais la question
Par contre, je ne comprends pas pourquoi les nouvelles conditions ne sont pas prises en compte.
Désolé de poser des questions bêtes
- Messages
- 1'119
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour JeanF44, (tous)
Je confirme toutes les variables paramètres d'une procédure/fonction peuvent être optionnelles, c'est d'ailleurs un moyen de "cacher" une procédure/fonction à l'affichage de la boite d'exécution des macro-cmdes par [Alt]-[F8]
Sub ProcedureInvisible(Optional bidon As Boolean)
'ou
Function FonctionCachee(Optional bidon As Boolean)par contre moi je ne comprends pas bien ce que tu veux dire par là !JeanF44 a écrit :Par contre, quand je modifie les conditions des variables optionnelles dans une Procédure Privée, les nouvelles conditions ne sont pas prises.
Un petit exemple de "ce qui ne marche pas" serait sympa pour t'aiguiller !
(re)
PS/
Je viens de faire un petit test pour vérifier ma pensée première
JeanF44 a écrit :Je fais les conditions avec IsMissing()
La fonction IsMissing() ne fonctionne qu'avec les variables qualifiées !
C'est à dire, si tu as
Sub FonctionAvecOption(Optional cetteOption)
If IsMissing(cetteOption) Then
' Ca ne fonctionne pasAlors que, si tu as
Sub FonctionAvecOption(Optional cetteOption As unType) ' unType est Integer, String... ou ce dont tu as besoin
If IsMissing(cetteOption) Then
' Ca fonctionne !!!Bonsoir et merci des réponses
Le type de la variable est définie dans la procédure qui appelle la procédure privée.
Je pense que je me plante dans les conditions.
Désolé pour joindre le fichier car je le commence seulement.
Je vais essayer d'en faire une partie et de le joindre
Bonsoir
Le but de ma procédure est d'appeler une procédure privée dont les variables sont optionnelles.
La variable ou les variables documentées sur la feuille Excel doivent s'affichées dans une boîte de message.
Je voulais faire cette macro avec Optional et IsMissing() pour apprendre
Fichier que j'ai commencé est joint
- Messages
- 1'119
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
(re)
Réponse dans ton code...
Private Sub Boite_Dial_0A(Optional nom, Optional prenom, Optional age) '
If IsMissing(nom) Then ' Si Nom non documenté
If IsMissing(prenom) Then ' Si Nom non documenté
MsgBox "Si 1 : " & age ' Boîte de message Affichant Age
Else ' Sinon
MsgBox "Si 2 : " & prenom & " " & age ' Boîte de message Affichant Prénom et Age
End If
Else ' Sinon '
MsgBox "Si 3 : " & nom & prenom & age ' boîte de message avec Nom,Prénom et Age
End If ' Fin de condition
End Sub '
Sub Test_0A() '
Dim Nom3 As String, Prenom3 As String, Age3 As Integer ' Variables
If Range("B7") = "" And Range("C7") = "" And Range("D7") = "" Then ' Condition si les cellules ne sont pas documentées
MsgBox "Aucun élément documenté en B7 ou C7 ou D7" ' Boîte de message pour bonne documentation
Exit Sub ' Sortie de procédure
End If ' Fin de condition
' Explications...
Nom3 = Range("B7") ' Valeur de la variable Nom
Prenom3 = Range("C7") ' Valeur de la variable Prénom
Age3 = Range("D7") ' Valeur de la variable Age
' -----------------------------------------------------------------------------------
' à ce point là du code tu viens d'initialiser les variables Nom3,Prenom3 et Age3
' càd que
' SI Range("B7") = "" -> autrement dit vide (ou plutôt à blanc)
' ALORS Nom3 = "" -> DONC Nom3 n'est pas "IsMissing puisqu'elle est = à ""
' -----------------------------------------------------------------------------------
'
' Par ailleurs
' Lorsque tu arrive dans Boite_DialOA(optional... cf. appel ci-dessous
' Tu n'écris pas Boite_Dial_OA
' MAIS BoiteçDialOA Nom3, Prenom3, Age3
' DONC une fois dans Boite_DialOA les variables optionnelles ne sont plus optionnelles puisque tu les précises après le nom de la procédure !!!!
Boite_Dial_0A Nom3, Prenom3, Age3 ' Appel de la procédure privée
End Sub ' '
' -------------------------------------------------------------------------------------------------------------
'
' Par ailleurs tes procédures ne PEUVENT pas fonctionner comme tu le penses !
'
' J'explique
'
' Dans Test_OA
' tu définis les 3 variables
' tu testes les valeurs des 3 cellules représentant ces variables
' et (seulement) après tu affectes ces valeurs de cellules à ces variables
' puis enfin tu lance la procédure Boite_Dial_OA avec les 3 variables pour paramètres
'
' Donc Dans Boite_Dial_OA
' les 3 variables ne sont pas IsMissing !!! CQFD
'
' -------------------------------------------------------------------------------------------------------------
' En résumé ta procédure Boite_Dial_OA de la manière dont tu y accède ne verra jamais les variables à IsMissing (qui au passage veut dire EstOublié - et elle ne sont pas oubliées !!!)
'Re et merci de la réponse.
If Range("B7") = "" And Range("C7") = "" And Range("D7") = "" Then ==> Je tester qu'au moins 1 valeur soit saisie.
ensuite, je me suis inspiré du cours VBA :
Sub macro_test()
Dim nom1 As String, prenom1 As String, age1 As Integer
nom1 = Range("A1") => "" donc non oublié ==> correspond bien à mon ==>Nom3 = Range("B7")
prenom1 = Range("B1") => "" donc non oublié ==> correspond bien à mon ==>Prenom3 = Range("C7")
age1 = Range("C1") => "" donc non oublié ==> correspond bien à mon ==>Age3 = Range("D7")
boite_de_dialogue nom1
boite_de_dialogue nom1, prenom1
boite_de_dialogue nom1, , age1
boite_de_dialogue nom1, prenom1, age1
End Sub
Private Sub boite_de_dialogue(nom As String, Optional prenom, Optional age)
If IsMissing(age) Then...
If IsMissing(prenom) Then
MsgBox nom
Else
MsgBox nom & " " & prenom
End If
Else
If IsMissing(prenom) Then
MsgBox nom & ", " & age & " ans"
Else
MsgBox nom & " " & prenom & ", " & age & " ans"
End If
End If
End Sub
Où alors il faut répéter l'appel à la procédure privée en répétant :
boite_de_dialogue nom1
boite_de_dialogue nom1, prenom1
boite_de_dialogue nom1, , age1
boite_de_dialogue nom1, prenom1, age1
Dans ce cas il faut mettre les différentes combinaisons dans la Sub avant d'appeler la procédure privée
Etant novice et essayant d'apprendre le VBA, j'ai du mal à comprendre cette procédure privée
- Messages
- 1'119
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
(re)
Ce qu'il faut comprendre en réalité c'est IsMissing() réagit à quelque chose (une variable) qui EstOubliée()
Donc si tu lance une procédure avec des paramètres ils ne sont pas oubliés !
En conclusion ta procédure privée, tel que le code est écrit verra toujours les paramètres !
Tu as tout juste en disant
JeanF44 a écrit :Où alors il faut répéter l'appel à la procédure privée en répétant : boite_de_dialogue nom1 boite_de_dialogue nom1, prenom1 boite_de_dialogue nom1, , age1 boite_de_dialogue nom1, prenom1, age1
ce qui dans ton code devrait se traduire par :
' --------------------------------------------------------------
' NOUVEAU CODE
' --------------------------------------------------------------
Private Sub NouvelleBoite_Dial_OA(Optional nom, Optional prenom, Optional age)
Dim msgParam
Dim cptParam
msgParam = ""
cptParam = 0
If Not IsMissing(nom) Then
msgParam = msgParam & " NOM = " & nom
cptParam = cptParam + 1
Else
msgParam = msgParam & " IsMissing NOM "
End If
If Not IsMissing(prenom) Then
msgParam = msgParam & " PRENOM = " & prenom
cptParam = cptParam + 1
Else
msgParam = msgParam + " IsMissing PRENOM "
End If
If Not IsMissing(age) Then
msgParam = msgParam & " AGE = " & age
cptParam = cptParam + 1
Else
msgParam = msgParam + " IsMissing AGE "
End If
MsgBox cptParam & " :" & msgParam
End Sub
Sub NouvelleTest_OA()
Dim nom As String, prenom As String, age As Integer
If (Range("B7") = "") And (Range("C7") = "") And (Range("D7") = "") Then
NouvelleBoite_Dial_OA
Else
If (Range("B7") = "") And (Range("C7") = "") And Not (Range("D7") = "") Then
age = Range("D7")
NouvelleBoite_Dial_OA , , age
Else
If (Range("B7") = "") And Not (Range("C7") = "") And (Range("D7") = "") Then
prenom = Range("C7")
NouvelleBoite_Dial_OA , prenom
Else
If (Range("B7") = "") And Not (Range("C7") = "") And Not (Range("D7") = "") Then
prenom = Range("C7")
age = Range("D7")
NouvelleBoite_Dial_OA , prenom, age
Else
If Not (Range("B7") = "") And Not (Range("C7") = "") And Not (Range("D7") = "") Then
nom = Range("B7")
prenom = Range("C7")
age = Range("D7")
NouvelleBoite_Dial_OA nom, prenom, age
Else
If Not (Range("B7") = "") And (Range("C7") = "") And Not (Range("D7") = "") Then
nom = Range("B7")
prenom = Range("C7")
age = Range("D7")
NouvelleBoite_Dial_OA nom, , age
' mais j'ai sans doute oublié des tests !!!
End If
End If
End If
End If
End If
End If
End Sub
' cependant vu la longueur, le nombre des tests à réaliser sans en oublier ?!? !?!