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...

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Pour l'ordre des sub et function dans un (des) module(s), vba s'en fiche...

Pour le reste, à vue de nez, si vous n'appelez 'boiteDialogue' qu'avec le nom, ce comportement est normal !

La macro exemple recolte les valeurs des cellules dans des variables, mais vous n'en envoyez qu'une (nom) en paramètre (boiteDialogue nom)

D'un autre côté, si vous envoyez à 'boiteDialogue' des variables n'ayant reçu aucune valeur elles ne seront plus 'missing' et auront leur valeur par défaut (0 pour Integer et "" pour string).

Je vous laisse réfléchir....
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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 boiteDialogue(nom As String, Optional prenom, Optional age)
    'Si l'âge est manquant
    If IsMissing(age) Or age = 0 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
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

@sylvanu ...sauf que dans l'exemple que vous donnez les paramètre ne sont jamais manquants....

Pour vous en convaincre mettez "Toto" en A1 et 15 en C1 c'est le dernier else qui sera exécuté :
VB:
Else 'Sinon on affiche le nom, le prénom et l'âge
            MsgBox nom & " " & prenom & ", " & age & " ans"

alors que prenom est censé être manquant (du moins dans ce qu'il me semble comprendre de la demande).

Cordialement
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Pour faire fonctionner votre exemple original suivant des cas différents, c'est la macro exemple qu'il faut changer pour que l'autre fonctionne correctement :
VB:
Sub exemple()

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

 
  boiteDialogue nom
  boiteDialogue nom, prenom
  boiteDialogue nom, prenom, age
  boiteDialogue nom,,age

End Sub

cordialement
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Roblochon,
Dans l'exemple de Shanon post #1, on trouve :
VB:
  boiteDialogue nom
Donc, si, les paramètres prenom et age ne sont pas transférés à la macro boiteDialogue. ;)

C'est le point que j'ai modifié, en transférant systématiquement les trois paramètres avec :
Code:
boiteDialogue nom, prenom, age
On obtient suivant les données ces trois réponses, sans toucher au code :
1614602702681.png
1614602722360.png
1614602750099.png
 

shanon7

XLDnaute Junior
Re,

Pour faire fonctionner votre exemple original suivant des cas différents, c'est la macro exemple qu'il faut changer pour que l'autre fonctionne correctement :
VB:
Sub exemple()

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


  boiteDialogue nom
  boiteDialogue nom, prenom
  boiteDialogue nom, prenom, age
  boiteDialogue nom,,age

End Sub

cordialement
Bonjour,

Merci pour votre réponse.

Lorsque j'exécute cette macro néanmoins, je n'ai pas le résultat escompté. J'ai successivement le nom, puis le nom & prénom, puis le nom prénom age puis nom et age qui s'affichent. Et si par exemple je ne mets rien dans "prénom" alors j'ai successivement le nom, le nom, le nom et age, le nom et l'age. Or ce que je veux est que selon le résultat du if on ait l'affichage correspondant.

Shanon
 

shanon7

XLDnaute Junior
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 boiteDialogue(nom As String, Optional prenom, Optional age)
    'Si l'âge est manquant
    If IsMissing(age) Or age = 0 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
Bonjour,

Merci pour cette réponse.

Donc si j'ai bien compris (cf réponse @Roblochon) si je mets boitedialogue nom, prenom, age et qu'ensuite dans ma feuille excel je remplis nom et prénom mais pas l'age par exemple, on considère que age prend sa valeur par défaut donc 0 vu que je l'ai déclaré comme integer. D'où l'affichage du "0 ans" dans mon premier exemple lorsque rien n'était entré dans C1 pour prénom ?

Shanon
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 945
Membres
101 849
dernier inscrit
florentMIG