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 :

Appel d'une macro depuis un userform [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut Appel d'une macro depuis un userform
    Bonsoir,

    Une question, nouvelle pour moi, mais certainement enfantine pour les plus expérimentés d'entre vous:

    J'ai créé un userform dans lequel il y a un bouton "Ok"
    Dans ce bouton, j'ai placé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Reponse = "ChequesRepasOui"
        Tableau = "Contrat"
        Call Choix(Reponse, Tableau)
     
        Me.ChequeRepasOui.Visible = False
        Me.ChequeRepasNon.Visible = False
        Cells("J" & LigneCrt).Value = " Waarde WG = " & WaardeWGValeur & "/ Waarde WN = " & WaardeWNValeur
     
        Unload ChequeRepasFenetre
    Malheureusement, j'ai un message d'erreur concernant l'appel de la macro Choix et ce malgré que j'ai essayé plusieurs instructions.
    La macro Choix est déclarée publique et les variables qui s'y trouvent aussi.
    Quant à Me.ChequeRepasOui.Visible = False, après avoir mis l'appel à la macro en commentaire, j'ai également un message d'erreur.

    Quelqu'un pourrait-il me donner la syntaxe correcte ?

    Merci d'avance

    Henri

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Tu aurais plus de chance de réponse si tu publies l'intégralité du code en précisant l'endroit (type de module) où il se trouve.

    EDIT : et précise aussi le message d'erreur exact.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    D'accord. Il s'agit d'une feuille qui sert de checklist. Il y a une bonne centaine de boutons d'actions et de checkbox.

    Voici d'abord la macro à laquelle je fais appel depuis tous ces boutons et à laquelle je dois accéder depuis la userform:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Public LigneCrt As Integer
    Public ColDebut As String
    Public ColFin As String
    Public LigneDebut As String
    Public LigneFin As String
     
     
    Public Sub Choix(Reponse, Tableau)
     
        LigneCrt = ActiveSheet.Shapes(Reponse).TopLeftCell.Row
     
        Select Case Tableau
     
            Case "NieuweKlant"
                ColDebut = "B3"
                ColFin = "B4"
                LigneDebut = "B5"
                LigneFin = "B6"
     
            Case "Vreemdeling"
                ColDebut = "B7"
                ColFin = "B8"
                LigneDebut = "B9"
                LigneFin = "B10"
     
            Case "Student"
                ColDebut = "B11"
                ColFin = "B12"
                LigneDebut = "B13"
                LigneFin = "B14"
     
            Case "Flexi"
                ColDebut = "B15"
                ColFin = "B16"
                LigneDebut = "B17"
                LigneFin = "B18"
     
            Case "Bestelling"
                ColDebut = "B19"
                ColFin = "B20"
                LigneDebut = "B21"
                LigneFin = "B22"
     
            Case "Contract"
                ColDebut = "B23"
                ColFin = "B24"
                LigneDebut = "B25"
                LigneFin = "B26"
     
        End Select ' Tableau
     
    End Sub
    Voici un exemple d'utilisation de cette macro depuis un bouton d'action:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub ADVB_Click()
     
        Reponse = "ADVB"
        Tableau = "NieuweKlant"
        Call Choix(Reponse, Tableau)
     
    ' Coloration du fond en blanc
        Range(Sheets("Parameters").Range(ColDebut).Value & LigneCrt & ":" & _
        Sheets("Parameters").Range(ColFin).Value & LigneCrt).Interior.Color = RGB(255, 255, 255)
     
    End Sub
    Voici le userform :
    Nom : Sans titre.png
Affichages : 825
Taille : 3,5 Ko

    Il s'agit de mettre une valeur numérique dans les deux cases et ensuite de les afficher en ligne 71.
    Après avoir suivi un tuto, je me suis dit que ceci devrait faire l'affaire :

    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
    Private Sub OkBouton_Click()
     
        Unload Me
        Reponse = "LoonMaaltijdchequesJa"
        Tableau = "Contract"
        Call Choix(Reponse, Tableau)
     
        Me.LoonMaaltijdchequesJa.Visible = False
        Me.LoonMaaltijdchequesNeen.Visible = False
        Cells("J" & LigneCrt).Value = " Waarde WG = " & WaardeWGValeur & "/ Waarde WN = " & WaardeWNValeur
    ' Pour que ce soit lisible pour le lecteur, je souhaiterais que les boutons de la ligne disparaissent ainsi que la userform et que le texte "Waarde WG (valeur WG) 9,-€ / Waarde (valeur WN) 1,-€" s'affiche.
     
        Unload MaaltijdchequesFenetre
     
    End Sub
    J'espère que c'est plus clair, sinon, je reste à votre disposition.

    Merci d'avance pour votre gentillesse

    Henri

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Je déconseille l''utilisation de variables publiques, en particulier lorsqu'on utilise des macros évènementielles.
    Il est préférable de transférer les informations en paramètres des procédures appelées.
    Si besoin on peut créer un type de variable personnel.
    voir cet exemple :
    https://www.developpez.net/forums/d1.../#post11063786

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Merci Patrice !
    Je vais étudier cela et voir comment je peux adapter cela à mon programme.
    J'espère également y trouver la réponse à ma question.
    Bonne soirée !
    Henri

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Patrice,

    Ce que tu m'as communiqué est certainement très intéressant, mais d'un niveau trop élevé pour mes connaissances.
    En outre, j'ai peut-être mal cherché, mais je n'ai rien trouvé concernant l'appel à une macro depuis un userform.

    Merci pour ton intervention. N'aurais-tu pas quelque chose de plus concret ?

    Bon dimanche !

    Henri

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,
    Citation Envoyé par Henri1830 Voir le message
    En outre, j'ai peut-être mal cherché, mais je n'ai rien trouvé concernant l'appel à une macro depuis un userform.
    Pas besoin de chercher sur le web, dans l'exemple de mon post précédent c'est la ligne 10 : Call Module1.Enregistre(Contact), et dans ton code tu l'utilises ligne 6 : Call Choix(Reponse, Tableau).

    J'ai du mal à comprendre le fonctionnement de ton code, le rôle de ta procédure n'est pas très clair, voire même alambiqué.
    Si le but et de définir une plage de cellules, pourquoi ne pas simplement utiliser une fonction (au lieu d'une procédure) qui renvoie directement la plage ou l'adresse de la plage ?

    J'ai l'impression que tu n'as pas bien compris le concept de l'utilisation des variables en VBA. Voir cet excellent cours VBA gratuit :
    https://bidou.developpez.com/article/VBA/
    et ce tutoriel :
    http://silkyroad.developpez.com/VBA/LesVariables/

    A mon avis, il faut tout réécrire, en commençant chaque module par Option Explicit, pour s'obliger à déclarer toutes les variables avant de les utiliser.
    Il faut aussi leur attribuer un type le plus précis possible et toujours minimiser leur portée, afin qu'elles n'existent que là où elles sont utiles.

    En outre, dans ton code, il y a des instructions que je trouve dangereuses : Range(Sheets("Parameters").Range(... et Cells("J" & LigneCrt)... en particulier lorsqu'elles ne sont pas situées dans la module de la feuille concernée.
    Il est vivement conseillé de préciser le parent du range ou du cells.
    D'autre part Range n'appartient pas à Sheet mais à Worksheet et la syntaxe de Cells n'est pas correcte, c'est Cells(ligne, colonne) donc : Worksheets("MaFeuille").Range(Worksheets("Parameters").Range(... et Worksheets("MaFeuille").Cells(LigneCrt, "J")...

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Patrice,

    Mille mercis pour les conseils.

    Je comprends qu'avec les éléments en ta possession, tu trouves ce code un peu biscornu.
    En fait, cet appel à procédure est récurrent dans l'ensemble du logiciel.
    Il permet de déterminer l'emplacement de la ligne sur laquelle se trouve les cases d'option.

    J'avais essayé de faire précéder l'appel à procédure du nom que j'ai donné à la feuille (Checklist), mais pas lui conserver son nom d'origine (Feuil1).
    Voyant que ça ne fonctionnait pas, je me suis embarqué dans toutes sortes d'hypothèses aussi stériles les unes que les autres.

    Maintenant, j'ai fait précédé tout ce qui vient de la Feuil1 par "Feuil1." et tout fonctionne.

    Encore merci pour le coup de main.

    Henri

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/10/2015, 14h53
  2. [XL-2000] Appel d'une procédure depuis un UserForm
    Par Hankow dans le forum Excel
    Réponses: 7
    Dernier message: 30/07/2015, 11h32
  3. [XL-2007] Comment appeler une macro depuis un ruban perso
    Par tgv77 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 20/11/2009, 17h08
  4. Appeler une macro d'un userform d'un autre VBAproject
    Par chrystobale dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/11/2009, 14h09
  5. VB Word : appel d'une macro depuis l'extérieur
    Par pezz dans le forum VBA Word
    Réponses: 2
    Dernier message: 24/02/2005, 10h28

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