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 :

Limite de l'utilisation d'un CommandButton_Click()


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut Limite de l'utilisation d'un CommandButton_Click()
    Bonjour,
    Une question probablement toute bête mais sur laquelle je bug depuis un moment.
    Est il possible de créer une boucle ou autre avec des commandButton_Click?

    Je m'explique....

    Aujourd'hui, par exemple, je code de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private sub commandbutton1_click()
                    MsgBox "Vous avez cliqué sur le bouton 1"
    End sub
     
    Private sub commandbutton2_click()
                    MsgBox "Vous avez cliqué sur le bouton 2"
    End sub
    Imaginons que je me retrouve avec 30 boutons, le code est surchargé.....

    Est il possible d'écrire sous une forme, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private sub userform_activate()
       For i = 1 to 30
          if controls("commandbutton" & i).click then
                  MsgBox "Vous avez cliqué sur le bouton" & i
         end if
       Next
    End sub
    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    L'évènement activate et l'évènement click d'un bouton n'ont absolument aucun lien entre eux ...
    Ce que tu veux faire ne peux donc se faire que par une instruction dans chaque évènement click de chaque bouton de commande *****
    ou (mieux, mais alors à bûcher sérieusement) en utilisant un module de classe gérant les évènements d'une collection de ces contrôles.

    EDIT ***** --->> J'en profite pour te rappeler que sur un userform (puisque c'est le cas), le contrôle cliqué est aussi l'objet ActiveControl

  3. #3
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut
    Bonjour, merci pour ta réponse. Dans mon exemple, j'ai mis le code dans un Activate mais effectivement, cela n'a aucun lien.

    Cependant, je ne comprends pas ce que tu as voulu expliquer dans ton "EDIT".

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Cependant, je ne comprends pas ce que tu as voulu expliquer dans ton "EDIT".
    Ah.
    Et je suppose que tu t'es bien évidemment (ou non ?) précipité pour ouvrir au moins ton aide VBA à la rubrique ActiveControl, propriété, pour savoir ce dont il s'agissait !
    ...
    Alors ? -->>
    Si tu l'as fait --->> que n'as-tu pas compris ? Qu'as-tu testé sur les bases de cette simple lecture ?
    Si tu ne l'as pas encore fait --->> qu'attends-tu (surtout si débutant) pour le faire ?

  5. #5
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut
    Démasqué !!!

    Je lis tout ca et je reviens vers toi en fonction !! Merci

    EDIT : Bon bah je comprend rien.... je pense que je vise quelque chose qui est bien loin de mon niveau........

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ce n'est pas compliqué.
    Regarde. On va prendre ton exemple
    Mets 3 boutons de commande sur ton userform et ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CommandButton1_Click()
      exemple
    End Sub
    Private Sub CommandButton2_Click()
      exemple
    End Sub
    Private Sub CommandButton3_Click()
      exemple
    End Sub
    Private Sub exemple()
      MsgBox "vous avez cliqué sur le bouton " & ActiveControl.Name
    End Sub
    A partir de là, à toi de concevoir, en utilisant au besoin des Select case dans la procédure exemple ******

    Il reste que l'utilisation d'une collection et d'un module de classe sont préférables (mais peut-être à éviter pour l'instant à ton niveau).

    ****** lorsque tu auras fait le 1er test, remplace la procédure exemple par celle-ci et regarde
    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
    Private Sub exemple()
      With ActiveControl
        Select Case Right(.Name, 1)
          Case 1
            .BackColor = RGB(255, 0, 0)
          Case 2
            .Move .Left + 100
          Case 3
            For i = 1 To 10
              .Move .Left + 10
                For j = 1 To 10000
                  DoEvents
                Next
              .Move .Left - 10
              For j = 1 To 10000
                 DoEvents
              Next
            Next
            .Caption = "coucou"
        End Select
      End With
    End Sub
    Le reste dépend de ta créativité et/ou de tes besoins. A toi de "faire".

  7. #7
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut
    Serieusement, tu devrais rédiger les exemples à la place des programmeurs de Office, on comprend largement plus facilement

    J'ai parfaitement compris le principe de l'activecontrol du coup.
    Néanmoins, je me rend compte qu'en voulant simplifier mon problème pour qu'il soit compréhensible et que ca ne fasse pas un monologue, la réponse que tu m'as donné ne me donne pas ma solution...... (même si il fort possible que je me serve très prochainement de l'activecontrol qui m'ouvre de nouvelles possiblilités )

    Voici mon problème réel :
    J'ai le tableau de données suivant :
    Nom : Sans titre.png
Affichages : 2055
Taille : 45,9 Ko
    qui s'enrichit ligne après ligne grace à un userform. Ce tableau est dans une feuille excel qui est masquée, il ne me sert donc que de "stockage" de données.

    Dans mon userform, j'ai la possiblité de consulter ce tableau via un ou plusieurs filtre :
    Nom : Sans titre.png
Affichages : 2042
Taille : 25,5 Ko

    Lorsque je fais rechercher, un UF apparait avec une liste d'info correspondant à mes filtres.

    On en arrive à mon problème.
    Je veux que mes choix apparaissent les uns à la suite de autres, sans sauter de ligne, même si dans mon tableau de données, le filtre fait que plusieurs lignes séparent mes choixs.
    Par exemple, prenons le cas du type "F" : sont concernés dans mon tableau les lignes 1,2 9 et 11.
    Dans mon UF qui consultera ces 4 lignes, je veux qu'elles appraissent les une à la suite des autres.
    J'y suis parvenu grace à ce code :
    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 userform_activate()
    Dim Numlab As Long
        Numlab = 2
        'Filtre par "FAST"
        If Sheets("parametres").Cells(46, 10).Value = "Fast" Then
            For i = 1 To 40
                If Sheets("parametres").Cells(i + 7, 46) = "F" Then
                    Controls("label" & Numlab).Caption = Sheets("parametres").Cells(i + 7, 53).Value
                    Controls("label" & Numlab).Visible = True
                    Controls("CommandButton" & Numlab).Visible = True
                    Numlab = Numlab + 1
                End If
            Next
        End If
    End sub
    Ceci m'affichera le titre de chacune de mes lignes.
    Par contre, en face de chacune de ces lignes, je veux faire apparaitre un bouton qui m'envoie sur un lien hyperlink correspondant à la colonne BC de mon tableau.

    Voilà pourquoi je voulais intergrer dans mon "private sub activate ()" mon état "click" de mes boutons pour pouvoir leur associer à chacun un lien hyperlink en fonction de mes lignes filtrées dans mon tableau


    Houlà, j'arrive à m'embrouiller dans mes explications, je n'imagine même pas vous qui me lisez

    Une idée?

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Houlà, j'arrive à m'embrouiller dans mes explications, je n'imagine même pas vous qui me lisez
    En effet. ce que tu montres (sans que l'on sache qui est baptisé quoi) ne me permet pas d'y voir vraiment clair

    Dans mon UF qui consultera ces 4 lignes, je veux qu'elles appraissent les une à la suite des autres.
    Qu'elles "apparaissent" où ?

    Et par ailleurs, ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = 1 To 40
                If Sheets("parametres").Cells(i + 7, 46) = "F" Then
                    Controls("label" & Numlab).Caption = Sheets("parametres").Cells(i + 7, 53).Value
                    Controls("label" & Numlab).Visible = True
                    Controls("CommandButton" & Numlab).Visible = True
                    Numlab = Numlab + 1
                End If
            Next
    montre que tu as sur ton userform au moins :
    - 40 contrôles Label nommés Label1, Label2 ... Label 40
    - 40 contrôles CommandButton nommés CommandButton1, CommandButton2, ..... CommandButton40

    Tu devrais probablement repenser la conception de tout cela. Un si grand nombre de contrôles présents sur un userform n'est pas de nature à rassurer et je suis quasiment certain de ce que ce que tu cherches à faire peut l'être de manière plus technique et efficace, mais :
    1) il faudrait connaître tous les tenants et aboutissants exacts et parfaitement exposés de ta démarche
    2) cela n'aurait plus rien à vraiment voir avec le sujet de la présente discussion

  9. #9
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut
    Effectivement, je conçois qu'il doit forcément exister une solution plus technique que cette "magouille" de codage....
    Je débute en programmation et suis loin à 2000 lieux de connaitre certaines solutions plus abouties.
    J'ai besoin de travailler sur un fichier rapidement mis en oeuvre, malheureusement... Comme tu le signale, la solution n'est donc pas à répertorier dans ce sujet.
    Merci quand même 👍

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code useform : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim CmBu(40) As New Classe1
    Private Sub UserForm_Initialize()
    Dim Numlab As Integer: Numlab = 2
    With Sheets("parametres")
     If .Cells(46, 10).Value = "Fast" Then
            For i = 1 To 40
                Controls("label" & Numlab + i - 1).Caption = .Cells(6, 53).Offset(i).Value
                Controls("label" & Numlab + i - 1).Visible = .Cells(6, 46).Offset(i).Value = "F"
                Controls("CommandButton" & Numlab + i - 1).Visible = .Cells(6, 46).Offset(i).Value = "F"
                Set CmBu(i).Bouton = Controls("CommandButton" & Numlab + i - 1)
            Next
        End If
    End With
    End Sub
    Code Classe1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public WithEvents Bouton As CommandButton
    Private Sub Bouton_click()
        MsgBox "Vous avez cliqué sur " & Bouton.Name
    End Sub
    Dernière modification par Invité ; 10/03/2017 à 15h48.

  11. #11
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Par défaut
    Bonjour,
    Ayant acquis de nouvelles connaissances depuis mon problème initial, je m'apercois que tu avais parfaitement raison Unparia en disant qu'il existait probablement une solution technique beaucoup plus simple à metre en oeuvre que mon amxi Userform composé de 8000 activecontrols, lol.

    Et cette solution etait tout simplement...... la Listbox....

    Quoi qu'il en soit, merci de vous être interessé à mon problème... Ceci m'a permis à ce jour de mettre en pratique de nouvelles connaissances!


    Résolu

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

Discussions similaires

  1. [PPT-2007] Limitations dans l'utilisation ActionSettings
    Par bpeyre dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 30/10/2011, 10h11
  2. Réponses: 4
    Dernier message: 19/07/2011, 11h52

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