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 :

Modules de classe événement click sur OLEObjects [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut Modules de classe événement click sur OLEObjects
    Bonjour,
    En aide à un forumeur, je me trouve exposé à un problème que je ne saisis pas... J'ai beau chercher, m'arracher les cheveux, rien n'y fait. Je fais donc appel àvos lumières. Merci de vous pencher sur ce cas...
    Voici ce que j'ai fait (et qui ne fonctionne pas!)

    Dans un module standard :
    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
    Public Bouton() As New Classe1
    Dim Obj As OLEObject
     
    Sub CreateButton()
    Worksheets("Principal").Select
    Set Obj = ActiveSheet.OLEObjects.Add("Forms.CommandButton.1", Left:=100, Top:=150, Width:=80, Height:=30)
    With Obj
        .Name = "ButtonInitFeuille"
        .Object.Caption = "Initialisation"
    End With
    InitBoutons
    End Sub
     
    Sub InitBoutons()
    Dim Cpt As Integer
     
    For Each Obj In Worksheets("Principal").OLEObjects
        'If oleObj.Name = "ButtonInitFeuille" Then
        If TypeOf Obj.Object Is MSForms.CommandButton Then
            Cpt = Cpt + 1
            ReDim Preserve Bouton(1 To Cpt)
            Set Bouton(Cpt).ButtonInitFeuille = Obj.Object
       End If
    Next
    Set Obj = Nothing
    End Sub
     
    Sub InitFeuilleTab()
        MsgBox "Ca fonctionne!"
    End Sub
    Dans le module de classe (nommé Classe1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public WithEvents ButtonInitFeuille As MSForms.CommandButton
     
    Private Sub ButtonInitFeuille_Click()
        Call InitFeuilleTab
    End Sub
    Voilà. Lorsque je créé un bouton en lançant "CreateButton", il le créé bien. Cependant, le clic n'a aucun effet. Pour obtenir un résultat, il faut lancer "CreateButton" puis, manuellement (ALT+F8) "InitBoutons"... J'en perds mon lâtin.
    Merci.
    Vous dites, si vous voulez un classeur exemple ou de plus amples indications...

  2. #2
    Membre chevronné
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Par défaut
    Bonjour Pijaku,

    Donc, en pas à pas, tu ne passe même pas dans ta sub InitBoutons() ?
    A tout hasard, essaye avec un

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Salut,
    Le mode pas à pas ne semble pas fonctionner.
    Il passe de toutes façons par InitButons. j'ai essayé de mettre un MsgBox dans la boucle de InitButons et il s'affiche bien à chaque Bouton...
    Call n'apporte rien de plus.
    Merci quand même

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il y a des bizarreries dans ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Bouton() As New Classe1
    Les parenthèses sont de trop. Je suppose que tu veux manipuler une classe qui serait en quelque sorte une collection de boutons, mais tu ne peux faire cela comme ça.

    Dès lors, ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Bouton(Cpt).ButtonInitFeuille = Obj.Object
    pose problème également.

    Dans la classe, tu déclares un bouton comme variable puis une procédure sur évènement, mais il faudrait encore attribuer un objet à cette variable.

    A ce stade, il serait utile que tu expliques d'abord en français ce que tu souhaites réaliser, au lieu de donner du code qui ne correspond probablement pas à ton objectif, et nous pourrons alors de guider au mieux.

    A toutes fins utiles, tu peux lire mon tuto sur la création de classes personnalisées.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour Pierre,

    Ce que je souhaite réaliser :
    A l'ouverture du classeur :
    1- Ajout d'une feuille nommée "principal",
    2- suppression de toutes les autres feuilles,
    3- ajouter un bouton de commande dans ma feuille,
    ================> Jusqu'ici tout va bien

    4- l'affecter à une classe d'objet pour pouvoir déclencher un événement (toujours le même) au clic.
    5- Lorsque je le souhaite, re-lancer (par : ALT+F8) les points 3 (création) et 4 (affectation).

    Le 5- pourra être fait à volonté.

    Je suis parti de la réponse de Patrick dans cette discussion en essayant de l'adapter. Je pensais naïvement changer "Image" en "CommandButton" et que ça roulerai, mais...

    De plus, ce que je ne saisis pas dans ce que j'ai réalisé, c'est que les 2 codes fonctionnent. Lancés séparément, "CreateButton" me créé bien mon CommandButton et "InitButton" fait en sorte que mon bouton réagisse au clic.
    Par contre, la réunion des deux codes en une seule procédure créé mon bouton mais ne "l'initialise" pas...

    J'ai lu votre tuto avant de me lancer dans cette histoire... Très explicite, mais je dois être encore trop novice pour bien le comprendre... Je vais le lire autant de fois que nécessaire pour enfin comprendre.

    Merci.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    La réponse sera différente si tu souhaites un résultat ou si tu souhaites, par goût d'apprendre, à ajouter des éléments qui réagissent au même évènement.

    Si le but est le résultat, je serai pragmatique en ajoutant des boutons de formulaires (des "shape") sur les feuilles et en leur renseignant comme propriété le nom de la macro qui doit être activée au clic (propriété OnAction).

    Cela éviterait la manipulation de classe et de collection d'objets
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    En fait, c'est juste par goût d'apprendre. Pour être honnête c'est une question qui m'a été posée ailleurs et que j'ai résolu en utilisant une toute autre méthode.
    Je voulais donc, juste pour moi, savoir le faire et pouvoir le reproduire.
    J'ai déjà réalisé des classes personnalisées comme celle-ci à l'intérieur de UserForm et ça ne m'a jamais posé de problème. Par contre, sur les feuilles je galère... Ne serais ce que la vue d'un Shape me colle des frissons .

    Si tu veux, que tu peux, et que tu en trouves le temps, j'aimerais vraiment apprendre ça.

    En tout cas, merci.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut
    bonjour pikaju

    si tu t'es inspiré de la derniere discution tu devrais t'en sortir

    cela dis dans masignature le lien sur mon addins mouseover et out sur les bouton dans un userform serait plus parlant

    ensuite au fur et a mesure de ta discution je me rend compte qu'en fait tu n'ajoute qu'un seul bouton
    a partir de la la classe n'a pas lieu d'etre

    tout simplement ajouter la macro associé "private sub trucmachin_click"par macro

    tiens comme ça vite fait

    vire ton module classe

    vire tout ce qui avait avant dans le module ou ce trouve la macro createbouton

    et met ceci a ca place:
    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
    'Attention il faut activer la référence "Microsoft visual basic for Application extensibility x.x chez moi (5.3)
     
    Option Explicit
    Dim VBComp As VBComponent
    Dim Mdl As CodeModule
    Dim objet As Shape
    Dim Obj As OLEObject
    Dim nombouton As String
    Dim x As Long
     
     
    Sub CreateButton()
        For Each Obj In Worksheets("Principal").OLEObjects
            If Obj.Name = "bouton1" Then
             Exit Sub
            Else
             GoTo ajoutbouton
            End If
        Next
     
    ajoutbouton:
     
            Worksheets("Principal").Select
            Set Obj = ActiveSheet.OLEObjects.Add("Forms.CommandButton.1", Left:=100, Top:=150, Width:=80, Height:=30)
            With Obj
                .Name = "bouton1"
                .Object.Caption = "Initialisation"
                nombouton = .Name
            End With
            For Each VBComp In ActiveWorkbook.VBProject.VBComponents
     
                'ATTENTION!!!
                'Veriefie bien dans l'editeur vbe que le sheets s'appelle bien
     
                '"Principal(Principal)"
     
                'et non pas
     
                '"Feuil1(Principal)"
     
                If VBComp.Name = "Principal" Then
     
                With VBComp.CodeModule
                    x = .CountOfLines
                    .InsertLines x + 1, "Private Sub " & nombouton & "_Click()"
                    .InsertLines x + 2, "InitFeuilleTab"
                    .InsertLines x + 3, "End Sub"
                End With
            End If
            Next
        End Sub
    Sub InitFeuilleTab()
    MsgBox "coucou"
    End Sub
    voili voilou
    résumé:
    teste si le bouton existe déjà
    si il existe on sort de la sub
    si il n'existe pas on le créé
    on créé aussi sa macro associée a son événement (click) dansle module de la feuille "principal"

    dans cet macro évènement on fait appel a la macro "InitFeuilleTab" tout simplement

    mon opigion:il n'est pas utile de faire une classe qui gere les evenements du bouton puisque qu'il y en a qu'un sachant qu la classe quand elle est activée elle prend de la memoire pour rien

    tandis que de cette maniere il ne reste rien en memoire

    on pourrais meme boucler x fois sur cette macro incrementer une variable pour le nom du bouton et les ammener tous a ce resultat ce qui aurais pour effet le meme que l'utilisation de ta classe

    comme tu peux le constater il y a plusieur solutions je viens de t'en présenter une ,toi qui veux apprendre te voila maintenant dans la manipulation de l'editeur vbe par macro

    voila pour mon opigion


    n'hesite pas poser des questions

    au plaisir
    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

  9. #9
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Salut Patrick,
    Bonjour à tous.

    Si j'ai posé cette question, à la base, c'était pour apprendre à réaliser des modules de classe. Naïvement, car je ne connaissais pas, je voyais ça tout simplement dans le cadre de la création de contrôles qui possédaient tous le même rôle, la même action à réaliser.
    Le tuto de Pierre Fauconnier, que je remercie au passage, commence à m'ouvrir les yeux sur les possibilités de ces classes.

    Je connaissais la manipulation de l'éditeur de macro par macro, c'est la solution que j'avais proposé au demandeur initial.

    Bref, je vais marquer ce post comme "résolu", et retourner apprendre par moi-même.

    Merci à tous de l'aide apportée.

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

Discussions similaires

  1. Lier un évènement click sur un tabItem
    Par m-mas dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 09/12/2011, 19h13
  2. l'évènement click sur une ligne de datagrid
    Par ayouta.gfs dans le forum C#
    Réponses: 11
    Dernier message: 25/05/2011, 04h22
  3. [2.0] Générer un événement click sur un textbox
    Par dieuzorro dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 27/02/2008, 22h26
  4. Problème d'évènement click sur mon onglets
    Par bitou11 dans le forum Access
    Réponses: 7
    Dernier message: 03/08/2006, 00h24
  5. événement Click sur Check et option button ??
    Par badsepuku dans le forum IHM
    Réponses: 3
    Dernier message: 09/02/2006, 13h51

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