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 :

Création de bouton dynamique dans un userForm : aucune action sur le onclick


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 49
    Points
    49
    Par défaut Création de bouton dynamique dans un userForm : aucune action sur le onclick
    Bonjour à tous,

    tout nouveau sur le vba mais avec des bases de développeur java derrière , j'ai un petit soucis sur la récupération de l'evenement "click" sur les boutons que je créer dynamiquement sur mon userForm. ( J'aimerai qu'a chaque click sur chaque bouton , sa couleur change , 3 couleurs possible).

    Quand je créer mes boutons manuellement il n'y a pas de soucis j'obtiens bien ce que je veux , mais lorsque je les créer dynamiquement , impossible de récuperer le focus sur le click.
    Voici comment je créer mes boutons :

    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
    53
    54
    55
    56
    57
     
    Private Sub UserForm_Initialize()
        Dim Color As ColorFormat
        Dim ObjCell As Range
        Dim ActWB As Workbook
        Dim I As Integer
        Dim Bouton1 As Control
     
        Dim yy As Integer
        yy = 20
     
        On Error Resume Next
     
     
     
     For Each ObjCell In Range("G175:G179").Cells
        Set Bouton1 = UserForm1.Controls.Add("Forms.CommandButton.1")
     
        With Bouton1
            .Name = ObjCell.Value
            .Caption = ObjCell.Value
            .Left = 20
            .Top = yy
            .Width = 50
            .Height = 18
            yy = yy + 25
        End With
        Next
     
          With UserForm1
            .Caption = "Validation RA"
            .StartUpPosition = 2
            .Height = yy + 40
            .Width = 30
        End With
     
         Set Color = ThisWorkbook.Colors(1)
        If Err.Number = 0 Then
            UserForm1.Controls.Item(0).BackColor = Split(Color, """")(1)
        End If
     
         Set Color = ThisWorkbook.Colors(2)
        If Err.Number = 0 Then
            UserForm1.Controls.Item(1).BackColor = Split(Color, """")(1)
        End If
         Set Color = ThisWorkbook.Colors(3)
        If Err.Number = 0 Then
            UserForm1.Controls.Item(2).BackColor = Split(Color, """")(1)
        End If
         Set Color = ThisWorkbook.Colors(4)
        If Err.Number = 0 Then
            UserForm1.Controls.Item(3).BackColor = Split(Color, """")(1)
        End If
         Set Color = ThisWorkbook.Colors(5)
        If Err.Number = 0 Then
            UserForm1.Controls.Item(4).BackColor = Split(Color, """")(1)
        End If
    J'ai récupéré cette partie en piochant à gauche à droite sur internet. La deuxième partie me sert pour les changements de couleurs dont je veux garder l'état à la réouverture du fichier. ( création de variables cachés ).

    Voici un exemple d'une action sur le click d'un des boutons ( j'en ai donc créée autant qu'il y a de boutons )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub AAL_Click()
    If UserForm1.Controls.Item(0).BackColor = &H8000000F Then
        UserForm1.Controls.Item(0).BackColor = RGB(0, 0, 255)
    ElseIf AAL.BackColor = RGB(0, 0, 255) Then
        UserForm1.Controls.Item(0).BackColor = RGB(0, 255, 0)
    ElseIf AAL.BackColor = RGB(0, 255, 0) Then
        UserForm1.Controls.Item(0).BackColor = &H8000000F
        Else
       UserForm1.Controls.Item(0).BackColor = &H8000000F
    End If
    End Sub
    AAL represente le nom de notre bouton ( objCell.Value) , mais à l’exécution je ne rentre jamais dans cette fonction.
    Je galère depuis quelques jours et je ne trouve pas de solution que je comprenne ou qui soit fonctionnelle. Si quelqu'un peut m'aider.

    J'ai de plus une autre question : est il possible de reset la macro chaque lundi midi par exemple? j'aimerai que les couleurs se réinitialise par defaut chaque lundi midi.


    C'est pourquoi j'en appelle à vous et vous remercie par avance.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Il te faut constituer une collection de ces contrôles ajoutés dynamiquement et construire une classe pour y gérer les évènements du type des contrôles de cette collection.
    Mais tout cela n'est pas du Excel (la présente section), mais du VBA (autre section de ce forum).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 49
    Points
    49
    Par défaut
    Merci pour la réponse, je suis désolé si je me suis trompé de section, est ce que j'ai la possibilité de la changer tout seul ou je laisse faire un modo ? Merci et encore désolé

    C'est ce que j'ai fait ce matin et le comportement à l'aire plus que correct. Le dernier petit problème que j'ai , c'est la sauvegarde de la couleur par défaut. Lorsque je change les couleurs de mes boutons je n'ai pas de soucis à la fermeture/réouverture, j'ai bien ce que j'avais défini, sauf pour la couleur par défaut des boutons, à la réouverture ou au relancement de la macro, ils deviennent noirs et je dois cliquer une fois pour récupérer la couleur par defaut.

    Voici donc la solution trouvé

    Mon 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
    53
    54
    Option Explicit
     
    Private Sub UserForm_Initialize()
        Dim Color As ColorFormat
        Dim ObjCell As Range
        Dim ActWB As Workbook
     
        Dim Bouton1 As Control
     
        Dim Cl As Classe1
        Set Collect = New Collection
     
        Dim yy As Integer
        yy = 20
     
        On Error Resume Next
     
        For Each ObjCell In Range("G175:G190").Cells
        Set Bouton1 = UserForm1.Controls.Add("Forms.CommandButton.1")
     
        With Bouton1
            .Name = ObjCell.Value
            .Caption = ObjCell.Value
            .Left = 20
            .Top = yy
            .Width = 100
            .Height = 30
            yy = yy + 40
            'ajout de l'objet dans la classe
            Set Cl = New Classe1
            Set Cl.Bouton = Bouton1
            Collect.Add Cl
        End With
        Next
     
          With UserForm1
            .Caption = "Validation RA"
            .StartUpPosition = 2
            .Height = yy + 40
            .Width = 155
        End With
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     
        'inscrit les valeurs dans des Noms cachés
        Dim Ctrl As Control
        Dim I As Integer
        I = 0
        For Each Ctrl In UserForm1.Controls
           ThisWorkbook.Colors(I + 1) = UserForm1.Controls.Item(I).BackColor
           I = I + 1
        Next
    End Sub
    Module de classe :
    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
    Option Explicit
     
    Public WithEvents Bouton As MSForms.CommandButton
     
    'exemple pour gerer l'evenement eclic sur les objets type CheckBox
    Private Sub Bouton_Click()
     
    Dim Ctrl As Control
    For Each Ctrl In UserForm1.Controls
        If Ctrl.Name = Bouton.Caption Then
            If Bouton.BackColor = &H8000000F Then
                 Bouton.BackColor = RGB(0, 0, 255)
            ElseIf Bouton.BackColor = RGB(0, 0, 255) Then
                 Bouton.BackColor = RGB(0, 255, 0)
            ElseIf Bouton.BackColor = RGB(0, 255, 0) Then
                 Bouton.BackColor = &H8000000F
                Else
                Bouton.BackColor = &H8000000F
            End If
        End If
    Next
     
    End Sub
    '--------------------------------------
    Module d'autoOpen
    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
    Option Explicit
     
    Sub auto_open()
     Dim I As Integer
     Dim Ctrl As Control
     I = 0
     
     For Each Ctrl In UserForm1.Controls
        If Not (ThisWorkbook.Colors(I + 1) = &H8000000F) Then
            UserForm1.Controls.Item(I).BackColor = ThisWorkbook.Colors(I + 1)
        End If
        I = I + 1
    Next
    UserForm1.Show
     
    End Sub
    C'est possiblement codé à l'arrache mais tout à l'aire dynamique comme ça , les personnes allant l'utilisé n'auront qu'a changer la plage de cellule à inclure. Mais cette couleur noire à la place de la couleur par défaut me pose vraiment soucis.

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour je n'ai pas tout regardé mais pour ta couleur c'est peut etre un peu normal schant que "ThisWorkbook.Colors" contient 56 couleur si tu a plus de 56 cells(bouton) alors ca bug c'est normal

    si tes couleur ne sont pas précises tu peut utiliser (rgb) avec rnd pour chaque partie tu aura certainement plus de choix de couleurs

    edit:
    après relecture de ton dernier post je pense que tu souhaite avoir un effet mouse over sur tes boutons

    et bien cherche dans les contrib et meme ce forum avec ce qui est en gras tu trouvera largement ton bonheur

    ou tout simplement dans les contrib avec mon pseudo
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/08/2016, 15h46
  2. vba ajout de bouton dynamique dans userform + action sur bouton ajouté
    Par choupette_64 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/07/2009, 15h04
  3. [VBA-E] Evenement associé au bouton crée dans une userform
    Par AH... dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/02/2007, 14h06
  4. [FLASH 8] Changer label bouton dynamiquement dans une boucle
    Par Malau dans le forum ActionScript 1 & ActionScript 2
    Réponses: 5
    Dernier message: 03/05/2006, 16h55
  5. Création de champ dynamique dans un formulaire
    Par alex75 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/04/2006, 16h00

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