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 :

CommandButton Dynamique sur Sheets [XL-2010]


Sujet :

Macros et VBA Excel

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut CommandButton Dynamique sur Sheets
    Bonjour,

    Je tente désespérément de faire un CommandButton Dynamique sur une Sheets.

    Je m'explique, je travail sur un projet dont le langage de programmation est en Excel VBA.

    J'arrive à faire des CommandButton dynamique dans des Userforms, c'est à dire que ces boutons n'existe pas dans la Userform mais à son initialisation elle crée autant de boutons que de valeur dans la colonne "A" d'une de mes feuilles par exemple, avec un code derrière chaque bouton en fonction de sa .Caption.

    Dans un Userform, ça m'a donné du fil à retordre mais j'y suis parvenu.

    Par contre, faire cela dans une Sheet me semble totalement différent et après moulte essais d'adaptation de mon code, je ne parviens par à le faire.

    Arriveriez-vous à m'aider ?

    En résumé, ce que j'aimerai faire par exemple ( pour que je puisse transposer un possible exemple dans mon projet ), c'est qu'à partir d'un commandbutton, je puisse créer un autre commandbutton sur une autre feuille qui possèdera le code que je lui donnerai, mais pour faire simple, faisons lui juste faire un MsgBox "It's Working!".

    J'attends vos retour pour que nous puissions travailler sur ce problème, et je remercie d'avance la communauté VBA de ce forum qui m'a déjà bien aidé durant les années précédentes !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test1()
        Dim Btn As Object
        Set Btn = ActiveSheet.Buttons.Add(126.75, 39.75, 46.5, 19.5)
        With Btn
            .Caption = "Appuie !"
            .OnAction = "Macro"
        End With
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Macro()
        MsgBox "It's Working!"
    End Sub

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    Merci Daniel.C de m'aider !

    Enfait j'avais déjà fait un code de ce genre mais le paramètre .OnAction ne fonctionne jamais, et dans votre code, c'est pareil. Il ne fonctionne pas, j'ai vu par ci et par là que .OnAction est capricieux avec Excel 2010.

    Auriez-vous une autre solution ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Je n'ai pas de problème, même avec Excel 2010... D'où tien-tu qu'il y a un problème avec cette version ? Publie ton code.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Tu peux essayer avec un bouton des contrôles ActiveX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    Dim CB As Object
    Set CB = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
     Left:=100, Top:=100, Width:=40, Height:=60)
    Set CB = ActiveSheet.OLEObjects(1)
    CB.Name = "CB1"
    With CB.Object
        .Caption = "Appuie!"
    End With
    End Sub
    Dans le module de la feuille, mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CB1_Click()
        MsgBox "It's Working!"
    End Sub

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    Je viens de tester votre nouveau code,un bouton se crée mais rien ne se passe.

    Dans le CommandButton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub CommandButton2_Click()
        Dim CB As Object
        Set CB = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
         Left:=100, Top:=100, Width:=40, Height:=60)
        Set CB = ActiveSheet.OLEObjects(1)
        CB.Name = "CB1"
        With CB.Object
            .Caption = "Appuie!"
        End With
    End Sub
    Et dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CB1_Click()
        MsgBox "It's Working!"
    End Sub
    Pour ce qui est de .OnAction, j'avais fouillé sur le net quand je voulais l'utilisé et les résultats me disaient qu'à partir de 2007 la fonction n'était plus pris en charge, peut être étais-je tombé sur un mauvais ragot cependant chez moi cette fonction ne fonctionne pas.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Il y a deux types de contrôles : les contrôles de formulaire et les contrôles ActiveX. "OnAction" ne fonctionne pas avec ces derniers. Le code que je t'ai donné crée un contrôle de formulaire. Il fonctionne ici. Pour créer un bouton ActiveX et la macro qui va avec sur la feuille "Feuil1" :

    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 test()
        Dim CB As Object
        Set CB = Sheets("Feuil1").OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
            Left:=100, Top:=100, Width:=40, Height:=60)
        CB.Name = "CB1"
        With CB.Object
            .Caption = "Appuie!"
        End With
        With ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule
            .InsertLines 1, "Private Sub CB1_Click()"
            .InsertLines 2, "MsgBox ""It's Working!"""
            .InsertLines 3, "End Sub"
        End With
    End Sub
    Tu dois cocher dans les options, dans le centre de gestion de la confidentialité, paramètres des macros, la case "Accès approuvé au modèle d'objet du projet VBA".

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    Quelle efficacité Daniel.C !
    Cela fonctionne très bien !

    Je vois si je peux adapter ça à mon code et je mettrai le topic en "Résolu" !

    En réalité je vais mettre ce code dans un module de classe.
    Mais le problème c'est que je ne sais pas si ça va marcher correctement ?

    En fait, mon programme appel un Userform qui à son initialisation va placer X boutons en fonction de ce qu'il y'a sur une de mes pages.
    Ensuite au clic sur un de ces boutons, un code va être chercher dans un module de classe qui, en fonction du .Caption du bouton va me créer une certaine page.
    Cette page est donc créée à partir du Module de Classe où réside le code derrière les boutons, mais comment faire si je veux générer ce bouton grâce à votre code sur une feuille généré à partir du Module de Classe ? Car le code du CommandButton va être créé dans le module et le bouton ne saura pas où allez chercher, n'ai-je pas raison ?

    Argh et voilà une erreur qui se produit quand j'arrive sur la première ligne de la création du CommandButton :

    "Impossible d'entrer en mode arrêt maintenant."

    Mais votre code ,seul, fonctionne très bien cela dit. C'est quand il est appelé dans un module de classe que ça ne fonctionne pas.

    Serait-il possible de créer le code du bouton avant et de lui assigner avec autre chose que .OnAction ?
    Car mon projet est protéger par mot de passe et son écriture, lors de son exécution, est interdite.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    J'ai du mal à comprendre ce que tu veux faire. Maintenant, si le code ne fonctionne pas dans le module de classe, je ne sais pas quoi faire.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    J'ai trouvé une combine pour ne pas le faire dans le module de classe, mais étant donné que mon projet est protégé par mot de passe, est-il possible de créer le sub soit même et de lui attribuer ?

    Encore merci pour votre aide !

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Si ta question est d'ôter par macro le mot de passe d'un projet, je ne pense pas que ce soit possible.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    Non non, ce que je veux dire c'es qu'au lieu de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule
            .InsertLines 1, "Private Sub CB1_Click()"
            .InsertLines 2, "MsgBox ""It's Working!"""
            .InsertLines 3, "End Sub"
        End With
    On crée directement dans le projet vba :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CB1_Click()
    MsgBox "It's Working!"
    End Sub
    Et on l'attribue au Command Button créée, est-ce possible ?

  13. #13
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Ça fonctionnait ici (cf. #5), mais apparemment pas chez toi ?

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    Ok le code fonctionne dans mon projet mais uniquement quand je déverrouille mon code VBA au préalable.

    J'utilise donc 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
    Sheets("Feuil2").Unprotect Password:="****"
                    Dim CB As Object
                    Set CB = Sheets("Feuil2").OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
                     Left:=255, Top:=6, Width:=505, Height:=35)
                    Set CB = Sheets("Feuil2").OLEObjects(1)
                    CB.Name = "CB1"
                    With CB.Object
                        .Caption = "Valider"
                    End With
                    Sheets("Feuil2").Protect Password:="*****", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingCells:=True
                    With ThisWorkbook.VBProject.VBComponents("Feuil2").CodeModule
                        .InsertLines 1, "Private Sub CB1_Click()"
                        .InsertLines 2, "MsgBox ""It's Working!"""
                        .InsertLines 3, "End Sub"
                    End With
    J'ai fais une erreur, enfait je génère le bouton dans Thisworbook.SheetChange et le problème c'est que la Feuil2 n'existe pas, je l'a crée puis je place le commandbutton "Valider" dessus et ensuite j'écris le code, je ne peux donc pas mettre le code "à l'avance" dessus. N'y a-t-il pas un moyen de dire au command button d'allez chercher son code ailleur que sur la Feuil2, l'idéal pour moi serait que CB1 ait son code dans ThisWorkBook mais je ne sais pas si c'est possible ?

    Il y'aurait 2 solutions à mon problème donc : pouvoir lui attribuer son code mais ailleurs que sur la feuille où le bouton est placé ou pouvoir contourner d'une façon ou d'une autre la protection par mot de passe du projet vba le temps d'écrire le code du bouton sur sa feuille.

    Encore merci pour l'intérêt que tu portes à mon soucis Daniel.C.

  15. #15
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Pas sûr d'avoir compris. Pour t'assurer que la feuille a été créée :

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        If Sh.Name = "Feuil2" Then
            Sheets("Feuil2").Unprotect Password:="****"
            Dim CB As Object
            Set CB = Sheets("Feuil2").OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
             Left:=255, Top:=6, Width:=505, Height:=35)
            Set CB = Sheets("Feuil2").OLEObjects(1)
            CB.Name = "CB1"
            With CB.Object
                .Caption = "Valider"
            End With
            Sheets("Feuil2").Protect Password:="*****", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingCells:=True
            With ThisWorkbook.VBProject.VBComponents("Feuil2").CodeModule
                .InsertLines 1, "Private Sub CB1_Click()"
                .InsertLines 2, "MsgBox ""It's Working!"""
                .InsertLines 3, "End Sub"
            End With
        End If
    End Sub
    en ajoutant un test au cas où tu réactives Feuil2.

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    Effectivement nous nous sommes mal compris !
    Je n'ai pas de doute sur la création de la feuille.
    Mon soucis désormais réside dans le fait que je ne peux faire les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With ThisWorkbook.VBProject.VBComponents("Feuil2").CodeModule
                .InsertLines 1, "Private Sub CB1_Click()"
                .InsertLines 2, "MsgBox ""It's Working!"""
                .InsertLines 3, "End Sub"
            End With
    Si mon Projet VBA est protégé, il faut donc trouver un moyen de contourner la protection du projet le temps d'écrire dans la Feuil2 ou alors de dire au CB1 d'allez chercher son code ailleurs que su la Feuil2, est-ce possible ?

  17. #17
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    A mon avis, non. Ceci dit, tu devrais ouvrir une nouvelle discussion portant sur la création dynamique de bouton avec protection du projet VBA.

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 127
    Points : 56
    Points
    56
    Par défaut
    Très bien, alors je met en résolu et je crée un nouveau fil de discussion !

    Et bien sur je n'oublie pas de te remercier pour le temps passé sur mon problème ! Merci Daniel.C !

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

Discussions similaires

  1. Un image qui se redimensionne dynamiquement sur toute la cel
    Par Furius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 10/01/2006, 23h10
  2. Réponses: 9
    Dernier message: 16/11/2005, 11h32
  3. Connexion dynamique sur une base SQL Server
    Par jh0483 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/08/2005, 15h10
  4. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 17h55
  5. [VBA-E] Dim dynamique sur un tableau
    Par Vince69 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/12/2002, 13h32

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