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 :

Détecter le clic sur un bouton de UserForm généré par une macro [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 31
    Par défaut Détecter le clic sur un bouton de UserForm généré par une macro
    Bonjour,

    j'ai réalisé une macro (contenu dans le module Agencemment UF) permettant d'afficher un UserForm (UserForm_SelectionInt) qui comporte le même nombre de boutons qu'il y a de lignes dans une cellule (ici la C26). Voici mon 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
    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
     
    Option Explicit
     
    Sub UF_selectionInt()
     
    'GLOSSAIRE
    Dim Obj As Control
    Dim i As Integer
        i = 1
    Dim debutLigne As Integer
        debutLigne = 1
    Dim finLigne As Integer
    Dim widthUF As Integer
        widthUF = 10
    Dim heightUF As Integer
        heightUF = 25 + UserForm_SelectionInt.Label_consigne.Height + UserForm_SelectionInt.Label_consigne.Top
    Dim clic As Boolean
     
     
     
        Do
            finLigne = InStr(debutLigne, Range("C26"), Chr(10)) 'permet de connaître la position d'un retour chariot, donc la fin d'une ligne
            If finLigne = 0 Then finLigne = Len(Range("C26")) 'si InStr renvoie 0, c'est qu'on a parcourou toutes les lignes de la cellule
     
            'on ajoute un commandButton pour chaque ligne de la cellule
            Set Obj = UserForm_SelectionInt.Controls.Add("forms.CommandButton.1")
            With Obj
                .Name = "CommandButton_" & i
                .Object.Caption = Mid(Range("C26"), debutLigne, finLigne - debutLigne + 1) 'affiche chaque ligne de la cellule sur son bouton correspondant
                .Left = 2
                .Top = 30 * i + 10
                .Object.AutoSize = True
     
                If .Width > widthUF Then widthUF = .Width + 10 'definie la largeur du UserForm comme étan celle du bouton le plus large, + 10 pixel
     
            End With
            debutLigne = finLigne + 1 'on pase à la deuxième ligne
            i = i + 1
     
        Loop While finLigne < Len(Range("C26")) 'on exécute la boucle tant que l'on a pas parcouru toutes les lignes
     
        'Mise en forme du UserForm
        With UserForm_SelectionInt
            .Width = widthUF
            .Height = heightUF + 30 * i + 10
            .Label_consigne.Left = (.Width - .Label_consigne.Width) / 2
            .Repaint
        End With
     
    End Sub
    Cette macro est appelé à l'initialisation de l'UserForm_SelectionInt.

    Maintenant passons au problème:
    j'aimerais pouvoir détecter le clic sur un des boutons, sachant que le ne connaît pas le nombre de ligne de la cellule C26 (d'où l'intérêt de générer automatiquement les boutons en fonction du nombre de lignes de cette cellule).

    J'ai tester des choses telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private Sub CommandButton_ & AgencementUF.UF_selectionInt.i & _Click()
    Mais bien entendu ça n'a pas fonctionné.

    Merci d'avance pour vote aide.

    SamSam

  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
    Il te faut pour cela nécessairement passer par l'utilisation d'une classe dans laquelle tu affectes à tes commandbuttons ajoutés dynamiquement les évènements de ce type de contrôle.
    Tu as à ce sujet un tuto sur ce forum, qui dispose d'un moteur de recherche ad hoc

    Ceci étant dit :
    qui comporte le même nombre de boutons qu'il y a de lignes dans une cellule
    donne à penser que ta conception elle-même est maladroite et à revoir (y compris celle de la feuille de calcul)

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 31
    Par défaut
    Bonjour Unparia
    merci pour l'info je vais aller voir ça.

    En fait, ma feuille est un calendrier qui recense les interventions à faire sur différentes machines. Donc quand il y a plusieurs interventions à faire le même jour, il faut bien les afficher dans la même cellule (à côté de la date).
    Quand l'utilisateur clique sur une intervention, un UF apparaît lui affichant les étapes à suivre.
    ça fonctionnait très bien lorsqu'il y avait qu'une seule intervention par jour, mais ce cas de figure est loin de la réalité.
    Si tu as une autre solution ou une piste pour contourner le fait de mettre 2 ou plusieurs interventions dans la même cellule, je suis preneur.


    A te relire

    SamSam

  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
    Donc quand il y a plusieurs interventions à faire le même jour, il faut bien les afficher dans la même cellule (à côté de la date).
    Non. Et c'est là l'erreur de conception et de modélisation.
    Conception et modélisation bien conduites = une seule donnée par champ (si sgbd) ou cellule (si tableur).
    Mais si tu veux discuter de cet aspect-là (conception) -->> sous-forum ad hoc

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 31
    Par défaut
    J'ai suivi ton conseil, et j'ai repensé mon code. Maintenant, quand il y a deux interventions le même jour, une cellule est insérée sous la date puis fusionnée avec la cellule contenant la date, et une autre cellule est insérée sous l'intervention déjà programmée, contenant la deuxième intervention.

    Merci pour tes conseils

    Je mets ce sujet en Résolu, même si mon problème de base ne l'est pas, étant donné que je n'ai plus de problème.

    SamSam

  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
    C'est déjà un premier pas ...
    Toutefois :
    - l' "art martial" du développement informatique est assez particulier
    - au judo, par exemple, on attend volontiers l'attaque de l'adversaire pour, en l'accentuant, le faire vaciller
    - en développement informatique, c'est plutôt le contraire : on "se jette en avant pour ne pas tomber en arrière"

    Ne fusionne rien du tout, ni même des cellules partageant la même date dans la colonne des dates. Tu t'en féliciteras le jour où tu devras faire des états, des relevés, des calculs, etc ... sélectifs.
    Si tu as plusieurs opérations correspondant à une même date :
    - une ligne date (y compris en la recopiant) dans la colonne des dates par opération et une ligne opération pour chaque opération.
    - Si raisons esthétiques, rien ne t'empêche de garder la première date d'un groupe jour "lisible" et les suivantes "invisibles" en donnant à la couleur de la police celle du fond de la cellule

    Suis ce conseil. Il est sage et te permettra d'éviter d'avoir peut-être à construire ainsi de véritables usines à gaz, lentes et lourdes.
    Amitiés et bonne chance

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

Discussions similaires

  1. [AC-2003] Détecter le clic sur un bouton de la barre d'outils
    Par Marin d'Eau Douce dans le forum VBA Access
    Réponses: 4
    Dernier message: 24/04/2012, 14h12
  2. Ouverture de userform par clic sur un bouton de formulaire
    Par karlgina dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/06/2011, 19h29
  3. Détecter le clic sur un bouton
    Par Gizmil dans le forum Langage
    Réponses: 5
    Dernier message: 11/02/2011, 17h44
  4. Détecter un clic sur le bouton "Page précédente" : c'est possible.
    Par tetrab dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/12/2008, 16h23
  5. Gérer les clics sur les boutons
    Par cyberlewis dans le forum Windows
    Réponses: 4
    Dernier message: 08/02/2004, 15h34

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