IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

argument de Sub


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut argument de Sub
    Bonjour à tous.
    Dans le code suivant, je souhaiterais que la variable "Rig" soit valorisée uniquement si la Sub est appelée SANS argument.
    Sauf que je n'arrive pas à trouver comment faire comprendre à VBA que je veux que l'argument soit FACULTATIF !
    Il me dit tout le temps qu'il est obligatoire...
    Quelqu'un saurait me suggérer une solution?
    Merci !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Caricariga(Rig)
    If Rig Is Nothing Then
        Rig = ActiveCell.Row
    End If
    TextBox1 = Cells(Rig, 1)
    '(etc etc)
    End Sub

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Je n'ai pas compris ton exemple mais regarde du côté de Optional

    1. Ci-joint exemple simple avec IsMissing (la variable doit être variant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub MaSub(Optional k As Variant)
    Dim t As Integer
     
    If IsMissing(k) Then
        t = 100
    Else
        t = k
    End If
    Range("A1") = t
    End Sub
     
    'Teste les 2 cas
    Sub test()
     
    Call MaSub
    'Call masub(12)
    End Sub
    2. Un autre exemple avec une valeur par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MaSub(Optional k As Integer = 100)
    Dim t As Integer
     
    t = k
    Range("A1") = t
    End Sub
     
    'Teste les 2 cas
    Sub test()
     
    Call MaSub
    'Call MaSub(12)
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    Effectivement, ça marche... à peu près.
    En effet, avec cette solution je peux passer ou non l'argument. Sauf que tout d'un coup j'ai plein de problèmes avec les types des variables que je n'avais pas avant.
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub CommandButton2_Click()
    Dim Rig As Integer
    Rig = ActiveCell.Row
    If CtrlRigCfBox(Rig) > 0 Then
        risp = MsgBox("Dati NON salvati ! - Proseguire ?", vbYesNo)
        If risp = vbYes Then
            Exit Sub
        End If
    End If
    Avanti (1)
    End Sub
     
     
    Function CtrlRigCfBox(Optional Rig As Integer)
    'indica quanti dati nelle textbox sono diversi da quelli nelle celle
    CtrlRigCfBox = 0
    If Rig = "" Then
        Rig = ActiveCell.Row
    End If
    If Cells(Rig, 2) <> TextBox2 Then
        CtrlRigCfBox = CtrlRigCfBox + 1
    End If
    If Cells(Rig, 3) <> TextBox3 Then
        CtrlRigCfBox = CtrlRigCfBox + 1
    End If
    If Cells(Rig, 4) <> TextBox4 Then
        CtrlRigCfBox = CtrlRigCfBox + 1
    End If
    If Cells(Rig, 5) <> TextBox5 Then
        CtrlRigCfBox = CtrlRigCfBox + 1
    End If
    If Cells(Rig, 6) <> TextBox6 Then
        CtrlRigCfBox = CtrlRigCfBox + 1
    End If
    End Function
    Et bien, le CommendButton2, avant de lancer la Sub "Avanti", doit lancer un code qui contrôle si quelques données de l'InputBox sont différents de ceux contenus dans la ligne. Mais maintenant que j'ai rendu l'argument Rig facultatif, celui-ci souffre systématiquement d'une incompatibilité de type au premier appel dans la Function CtrlRigCfBox, aussi bien quand la fonction est appelée AVEC l'argument que quand elle est appelée SANS.
    Pourquoi donc?
    L'Aide d'Excel donne des explications assez obscures... au moins à mes yeux de profane!
    Merci pour toute suggestion.

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Rien n'est obscure
    Pour le paramètre optional

    • Soit tu le déclare en variant
    • Soit tu le type avec une valeur par défaut.

    Relis mon post 1 et l'aide vba

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub CommandButton2_Click()
    Dim Rig As Integer, Risp As Integer
     
    Rig = ActiveCell.Row
    If CtrlRigCfBox(Rig) > 0 Then
        Risp = MsgBox("Dati NON salvati ! - Proseguire ?", vbYesNo)
        If Risp = vbYes Then Exit Sub
    End If
    Call Avanti(1)
    End Sub
     
    'indica quanti dati nelle textbox sono diversi da quelli nelle celle
    Function CtrlRigCfBox(Optional Lig As Integer = 0)
    Dim Compteur As Integer
     
    If Lig = 0 Then Lig = ActiveCell.Row
    If Cells(Lig, 2) <> TextBox2 Then Compteur = Compteur + 1
    If Cells(Lig, 3) <> TextBox3 Then Compteur = Compteur + 1
    If Cells(Lig, 4) <> TextBox4 Then Compteur = Compteur + 1
    If Cells(Lig, 5) <> TextBox4 Then Compteur = Compteur + 1
    If Cells(Lig, 6) <> TextBox5 Then Compteur = Compteur + 1
    'Tes TextBox sont sur la feuille ou dans un userform? On peux faire ceci par boucle
    CtrlRigCfBox = Compteur
    End Function

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut L'ombre est souvent juste en dessous de ta lampe (proverbe chinois)
    Merci pour tes éclairages; j'ai relu... mais je vais aussi relire, parce que tout n'est pas vraiment clair.
    En attendant, mes TextBox sont dans une Userform et les boucles m'intéressent beaucoup.
    Est-ce que tu saurais me dire comment enchaîner:
    - un nom d'objet tel qu'une textbox & un index (par ex. "i")
    - un nom de variable (et quels types s'y prêtent) & un index.
    Parce que si on arrive à faire une chose pareille, ça veut dire qu'on peut aussi se faire un code bon pour un grand nombre de UserForm, il suffira de dire d'abord quelque chose comme...
    Et pour les variables ça va être des boucles aussi, ce qui permet de faire d'un seul coup exactement autant de variables que nécessaire! (Je pense à une tout autre application.)
    Qu'en penses-tu?

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Pour boucler sur TextBox2..TextBox6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function CtrlRigCfBox(Optional Lig As Integer = 0)
    Dim Compteur As Integer
    Dim i As Byte
     
    If Lig = 0 Then Lig = ActiveCell.Row
    For i = 2 To 6
        If Cells(Lig, i) <> Me.Controls("TextBox" & i) Then Compteur = Compteur + 1
    Next i
    CtrlRigCfBox = Compteur
    End Function

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    Me.Controls("TextBox" & i)
    Génial!
    Si je comprends bien, Me est la UserForm, Controls fait référence génériquement aux contrôles qui sont dedans, puis c'est spécifié dans la parenthèse...
    Ça ressemble un peu à la syntaxe de la formule "INDIRECT" dans les cellules: guillemets pour la "citation" directe d'un nom ou d'un objet, sans guillemets pour les variables qui véhiculent un élément.

    Et par contre, comment tu fais pour les variables?
    Comme c'est hors sujet de cette discussion, si tu penses que c'est trop long à traiter j'en ferai un nouveau post.
    Merci encore!

    P.S.: Excuse-moi, question complémentaire pour le TextBox. Quelle syntaxe pour les compter? Ça irait, par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Controls("TextBox" & *).Count
    ?

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Non, pour le comptage des textbox, ça n'irait pas (tu pouvais tester, non?)
    Pour compter, il faudrait boucler sur tous les controles de ton usf
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Ktrl As Control
    Dim c As Integer
     
    For Each Ktrl In Me.Controls
        If TypeOf Ktrl Is MSForms.TextBox Then c = c + 1
    Next Ktrl
    MsgBox c
    Pour la question des variables, je n'ai pas bien compris la question, si tu peux détailler.

    Par contre tu peux utiliser les variables tableau.

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    Si je n'ai pas testé c'est tout bonnement parce que je me doutais bien que ma solution était simpliste et je n'aurais pas su interpréter l'échec, donc autant demander. En plus, je ne peux pas utiliser Excel sur cet ordinateur, dans l'immédiat.
    Quant aux variables, je ferai un nouveau post demain, parce que ça n'a vraiment rien à voir avec les UserForm et ça mérite une discussion à part.
    Je te remercie pour toute ta disponibilité, je vais maintenant mettre tous ces bouts de code dans mon module et j'essaierai de revenir ici avec le code intégral pour ceux qui sont intéressés.
    A bientôt!

Discussions similaires

  1. [A-07] Question passage arguments Sub
    Par AlainL dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/01/2009, 16h02
  2. changer l'argument d'une sub
    Par Dafbau dans le forum IHM
    Réponses: 2
    Dernier message: 11/09/2007, 12h10
  3. Declaration argument de sub
    Par tidoc dans le forum VB.NET
    Réponses: 1
    Dernier message: 31/07/2007, 11h55
  4. Passer un argument a Sub UserForm_Initialize(position As Integer)
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/06/2007, 12h47
  5. Réponses: 5
    Dernier message: 10/03/2006, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo