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é

Optional

Bonsoir @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

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)


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.

par contre moi je ne comprends pas bien ce que tu veux dire par là !

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 pas

Alors 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

13essai1.xlsm (19.68 Ko)

(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

(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 ?!? !?!
Rechercher des sujets similaires à "variables optionnelles"