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 :

[VBA-Excel] fonction appelée par plusieurs bouton : quel bouton ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut [VBA-Excel] fonction appelée par plusieurs bouton : quel bouton ?
    Bonjour,

    J'ai une fonction qui est appelé par plusieurs bouton.
    j'aimerais, dans cette fonction, savoir quel bouton a appelé la fonction (Sub).
    y'aurai-t-il un mot clé "thisButton", ou activeButton ou un truc comme ça ?
    sinon, je suis obligé de faire ce genre de 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
     
    sub maFonction(num_bouton) 
       ... toute ma fonction
    end sub
     
    sub click_bouton1()
       maFonction (1)
    end sub
    sub click_bouton2()
       maFonction (2)
    end sub
    sub click_boutonN()
       maFonction (N)
    end sub
    Je précise que la solution que je recherche est justement sensée me permettre de me passer de la déclaration d'une fonction "onClick" par bouton.

    Ca permet in fine de laisser l'utilisateur de la feuille Excel de copier-coller le bouton dans une autre feuille (onglet) mais d'avoir la même fonction.

    Dans un précédent projet, j'avais utilisé les propriétés du bouton pour l'identifier/localiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub invert1_Click()
        fonction_invert (invert1.TopLeftCell.Column + 1)
    End Sub
    Mais on voit que à chaque bouton il faut créer la "Sub" et remplacer le nom du bouton (invert1 dans l'exemple précédent)

    Merci beaucoup.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour
    juste une idee
    tu pourrais passer un argument specifiant le nom du bouton
    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
    sub click_bouton1()
    dim nombouton
    nombouton = le nom de ton bouton 1
    maFonction (l argument bouton)
    end sub
     
    sub click_bouton2()
    dim nombouton
    nombouton = le nom de ton bouton 2
    maFonction (l argument bouton)
    end sub
     
    sub click_boutonN()
    dim nombouton
    nombouton = le nom de ton bouton n
    maFonction (l argument bouton)
    end sub
     
    ' etc
    tu recupere ton argument ds ta fonction et tu l exploite comme tu veux

  3. #3
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Tu pourrais même passer le bouton entier en paramètre.

    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
    Function maFonction(cmd As CommandButton) As String
        maFonction = cmd.Caption
    End Function
     
    Private Sub cmd1_Click()
        Label1.Caption = maFonction(cmd1)
    End Sub
     
    Private Sub cmd2_Click()
        Label1.Caption = maFonction(cmd2)
    End Sub
     
    Private Sub cmd3_Click()
        Label1.Caption = maFonction(cmd3)
    End Sub
    C'est un exemple un peu gaga, mais ça montre juste le principe.

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonsoir


    Tu peux aussi passer par un module de classe pour écrire qu'une seule fois la procédure associée aux boutons.


    Exemple pour gérer des CommandButton placées dans les feuilles de calcul:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    '--------------------------------------
    'dans un module standard
    Option Explicit
     
    Public Collect As Collection
    '--------------------------------------

    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
    '--------------------------------------
    'dans un module de classe nommé "Classe1"
    '
    Option Explicit
     
    Public WithEvents CmdGroup As MSForms.CommandButton
     
     
    Private Sub CmdGroup_Click()
        'Exemple qui renvoie le nom du bouton,
        'le nom de la feuille et la position.
        MsgBox CmdGroup.Name & vbCrLf & _
            CmdGroup.Parent.Name & vbCrLf & _
            CmdGroup.TopLeftCell.Address
     
    End Sub
     
    '--------------------------------------

    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
    '--------------------------------------
    'à placer dans le module objet ThisWorbook pour que la classe
    'soit initialisée lors de l'ouverture du classeur.
     
    Option Explicit
     
    Private Sub Workbook_Open()
    Dim Obj As OLEObject
    Dim Cl As Classe1
    Dim Ws As Worksheet
     
    Set Collect = Nothing
    Set Collect = New Collection
     
    'Boucle sur les feuilles du classeur
    For Each Ws In ThisWorkbook.Worksheets
        'boucle sur les objets de la Feuil1
        For Each Obj In Ws.OLEObjects
            'verifie s'il s'agit d'un CommandButton
            If TypeOf Obj.Object Is MSForms.CommandButton Then
     
                Set Cl = New Classe1
                Set Cl.CmdGroup = Obj.Object
                Collect.Add Cl
            End If
        Next Obj
    Next Ws
    End Sub
    '--------------------------------------


    bon week end
    michel

  5. #5
    Membre averti
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut Merci
    Merci SilkyRoad-Michel : c'est exactement ce que je cherchais.
    J'avais chercher dans les définitions de Events, mais je connaissais pas le "Public WithEvents ...".
    J'ai mis les 3 bouts de codes là où tu l'indiquais, ca a marché (presque) du premier coup (j'avais des boutons Excel qui ne sont pas du même type que "commandButton").
    Bref, merci infiniment pour ce message et ce code qui ont bien du te prendre 1 heure de ton temps.

    Je comprends pas tous les petits détails :
    1) pourquoi on fait un "SET Collect = NOTHING pour refaire un SET après)
    2)y'a-t'il vraiment besoin de l'objet "Collect"
    Mais j'ai déjà appris beaucoup de choses là (je n'avais jamais utilisé de Class en VB-Excel, Public WithEvents ...)
    et je vais peut-être le modifier pour que lorsqu'on copie-colle de nouveaux boutons, ils soient également pris en compte (qu'ils soient déclarés comme dans la classe Class1). Pour l'instant, ton code permet de les prendre en compte à l'ouverture du fichier Excel.

  6. #6
    Membre averti
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut
    Comme je l'ai dit, le code de SilkyRoad marche très bien.

    J'ai voulu le changer pour l'appliquer aux bouton qui sont d'un autre type : Excel.Shape; type = msoFormControl ; FormControlType = xlButtonControl
    (désolé, mon vocabulaire francais n'est pas assez étendu pour désigner ce type de bouton, même s'il ressemble à l'autre OLEObject ...)

    mais le compileur bloque sur la déclaration que je fais dans ma classe :
    Public WithEvents CmdGroup As Excel.Shape
    avec l'erreur "L'objet n'a pas d'automatisation d'évènement".

    j'en conclu que je ne pourrais pas avoir des "bouton Excel (pas OLE)" ?

    C'est dommage, parce qu'on peut copier-coller (bêtement) les "bouton Excel" alors que les OLE, il faut passer en mode "édition de formulaire" (un truc comme ca), ce qui n'est pas intuitif pour l'utilisateur lambda ...

    Encore merci

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonsoir

    Effectivement ce n'est pas possible pour les formes shapes


    bonne soirée
    michel

  8. #8
    Membre averti
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut
    Alors, comme j'ai abandonné les "shapes" pour les boutons OLE, je me suis dit : ca serais cool de faire un bouton qui créé les boutons.
    Je l'ai fait, et à la fin de la duplication de mes boutons, plus aucun ne fonctionne (je sais pas pourquoi, mais les évenements ne sont plus captés)

    J'ai essyé de re-appeler la fonction qui déclare les boutons en tant que Class1, mais rien à faire, ou plutot, dès la fin de l'éxécution de la duplication, c'est comme si rien avait été fait.

    J'ai même utilisé une l'évènement worksheet_change pour ré-éxécuter la macro qui déclare les boutons en tant que Class1. Bref, après la création d'un nouveau bouton, il faut que je fasse un modif bête-inutile dans la worksheet pour pouvoir lancer l'évènement worksheet_change qui me réactive mes boutons.
    Du n'importe quoi

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/06/2007, 09h43
  2. [VBA][Excel]fonction networkdays
    Par nemesys971 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/01/2006, 13h47
  3. [VBA/Excel] Fonction open sous Excel 97
    Par nico01984 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/01/2006, 14h19
  4. [VBA EXCEL] Fonction Instr
    Par thulvar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/01/2006, 14h43
  5. [VBA Excel] Trier une plage à plusieurs colonnes
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 22/12/2005, 17h04

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