XL 2016 Procédures et arguments

shanon7

XLDnaute Junior
Bonjour !

Je suis tombée sur ce morceau de code qui illustre la notion de procédures et arguments en VBA, mais je ne comprends pas son exécution. Voici le code en question :
VB:
Sub exemple()

    Dim nom As String, prenom As String, age As Integer
    
    nom = Range("A1")
    prenom = Range("B1")
    age = Range("C1")

  
  boiteDialogue nom
    

End Sub

Private Sub boiteDialogue(nom As String, Optional prenom, Optional age)

    'Si l'âge est manquant
    If IsMissing(age) Then
        
        If IsMissing(prenom) Then 'Si le prénom est manquant, on n'affiche que le nom
            MsgBox nom
        Else 'Sinon, on affiche le nom et le prénom
            MsgBox nom & " " & prenom
        End If

    'Si l'âge a été renseigné
    Else

        If IsMissing(prenom) Then 'Si le prénom est manquant, on affiche le nom et l'âge
            MsgBox nom & ", " & age & " ans"
        Else 'Sinon on affiche le nom, le prénom et l'âge
            MsgBox nom & " " & prenom & ", " & age & " ans"
        End If
    
    End If
      
End Sub

1/ Je ne comprends pas pourquoi la sub "exemple" est entrée avant la sub "boitedialogue" alors que la sub exemple fait appel à la sub boitedialogue. Bon, cela ne semble pas être un souci dans VBA car la macro s'exécute bien mais cela me semble illogique comme ordre ?

2/ Je pensais que lors du lancement de la macro "exemple", la macro "boitedialogue" allait se lancer et donc que les ifs allaient être testés et donc que en fonction de l'issue, on aurait tel ou tel résultat. Par exemple, si je n'entre pas d'âge en cellule C1 (mais j'entre un nom et un prénom en A1 et B1 resp.) , seule la condition If ismissing(age) est vraie donc je m'attendais à ce que s'affiche le message "nom, prenom" or seul le nom s'affiche. Je sais que le nom s'affiche car dans la sub Exemple il y a boitedialogue nom mais même si je mets boitedialogue nom, prenom, age alors ce qui s'affiche est "nom, prenom, 0 ans".

En d'autres termes, je ne comprends pas vraiment cette macro et comment faudrait-il l'écrire afin qu'elle s'exécute correctement?

Merci pour votre aide,

Shanon
 
Solution
Bonjour Shanon,

Concernant l'ordre, le VBA n'en a que faire. Il exécute ce qu'on lui demande, chaque macro est indépendante.
Vous auriez même pu, pour simplifier la lecture mettre la macro boiteDialogue dans un autre module.

Concernant la réponse c'est normal car les paramètres prenom et age sont déclarés optionnel et vous passer la commande boiteDialogue nom donc prénom et age ne sont pas traités par la boite de dialogue.
Vous pouvez l'améliorer en faisant :
1- boiteDialogue nom, prenom, age
2- If IsMissing(age) Or age = 0 Then
VB:
Sub exemple()
    Dim nom As String, prenom As String, age As Integer
    nom = Range("A1")
    prenom = Range("B1")
    age = Range("C1")
    boiteDialogue nom, prenom, age
End Sub
Private Sub...

shanon7

XLDnaute Junior
teste chaque sub exemple
si tu me dis que ca n'est ce que fait le post#5 ,je mange mon clavier
re bonjour,

oui la sub EXEMPLE_NOM_PRENOM_AGE fait la même chose que le post #5 mais pas les autres qui n'affichent que le nom, le prénom ou l'âge selon ce qui a été renseigné dans la sub.
J'en déduis donc que j'aurais pu garder uniquement cette sub et la private sub boitedialogue ? Ces 2 macros répondent bien à mon besoin et sans recourir aux if, ce qui semble effectivement plus simple à écrire. Merci ! :) Il me reste à aller explorer la syntaxe de trim et array que je ne connais pas encore

Shanon
 

Discussions similaires

Réponses
2
Affichages
198

Statistiques des forums

Discussions
315 096
Messages
2 116 172
Membres
112 676
dernier inscrit
little_b