rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Créer un bouton dynamiquement excel via VBA

Posté par jot59, le vendredi 31 mars 2006 à 16:56:43
Bonjour ,
je souhaite créer un bouton par macro et affecter une macro également à ce bouton créé, sachant que le code lié à la macro qui doit affecter doit pouvoir être changé dynamiquement en fonction du contenu de certaines cellules.
j'ai écrit le code suivant :
Dim X As Byte
Dim Code As String
Dim NextLine As String
Dim oOLE As OLEObject
Sheets("Menu").Select
Range("A1").Select
i = 1
Do While Cells(i, 1) <> "XXX"
i = i + 1
Loop
i = i + 1
BU_number = Cells(i, 1)

Workbooks.Add 'creer classeur
Set oOLE = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandBut­ton.1", _
Link:=False, DisplayAsIcon:=False, Left:=340, Top:=30, Width:=100, Height:=30)
'Left position bouton par rapport au bord gauche de la feuille
'Top position bouton par rapport au haut de la feuille
'Width largeur bouton
'Height hauteur bouton

X = ActiveSheet.OLEObjects.Count 'compter le nombre de boutons existants dans la feuille

'option nommer l'objet
oOLE.Name = "CommandButton" & X
'texte sur le bouton
ActiveSheet.OLEObjects(X).Object.Caption = "BU " & X
Code = "Sub CommandButton" & X & "_Click()" & vbCrLf
Code = Code & "Sheets(""feuil2"").select" & vbCrLf
Code = Code & "End Sub"

With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).Code­Module
NextLine = .CountOfLines + 1
.insertlines NextLine, Code
End With
End Sub

ce code fonctionne très bien lorsqu'on crée une nouvelle feuille "Workbooks.Add 'creer classeur" après la boucle.
Le fait d'appuyer sur le bouton me fait aller sur la feuille "feuil2"

par contre dès qu'on supprime la ligne "Workbooks.Add 'creer classeur "
qui permet donc de créer le bouton sur la feuille active cane marche plus j'ai le message suivant :
"Impossible d'entrer en mode arrêt maintenant"
puis si je fais continuer : message : l'indice n'appartient à la sélection"

Quelqu'un peut m'aider sur le sujet
merci d'avance
Répondre à jot59  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le vendredi 31 mars 2006 à 21:37:56
Bonjour,

J'ai apporté quelque modif pour que cela fonctionne chez moi !

Sub CreerMenu()

    Dim X As Byte
    Dim i, BU_number As Long
    Dim Code As String
    Dim NextLine As String
    Dim oOLE As OLEObject
    
    Sheets("Menu").Select
    Range("A1").Select
    i = 1
    Do While Cells(i, 1).Value <> "XXX"
        i = i + 1
    Loop
    i = i + 1
    BU_number = Cells(i, 1)

    'Workbooks.Add 'creer classeur
    Set oOLE = ActiveWorkbook.ActiveSheet.OLEObjects.Add(ClassType:="F­orms.CommandButton.1", _
        Link:=False, DisplayAsIcon:=False, Left:=340, Top:=30, Width:=100, Height:=30)

    'Left position bouton par rapport au bord gauche de la feuille
    'Top position bouton par rapport au haut de la feuille
    'Width largeur bouton
    'Height hauteur bouton

    X = ActiveSheet.OLEObjects.Count 'compter le nombre de boutons existants dans la feuille

    'option nommer l'objet
    oOLE.Name = "CommandButton" & X
    'texte sur le bouton
    ActiveSheet.OLEObjects(X).Object.Caption = "BU " & X
    Code = "Sub CommandButton" & X & "_Click()" & vbCrLf
    Code = Code & "Sheets(""feuil2"").select" & vbCrLf
    Code = Code & "End Sub"

    With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).Code­Module
        NextLine = .CountOfLines + 1
        .insertlines NextLine, Code
    End With

End Sub



Lupin
Répondre à Lupin.A

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jot59, le lundi 3 avril 2006 à 10:01:17
Bonjour Lupin,

merci d'avoir regarder la macro, j'ai pris la macro de la réponse j'ai le meme problème lorsque je veux travailler sur la feuille courante (ligne 'Workbooks.Add 'creer classeur en commentaires)

impossible d'entrer en mode arrêt maintenant

il y a peut être un pb d'options de Excel ou Visual basic

merci d'avance
jot59
Répondre à jot59

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le mardi 4 avril 2006 à 14:46:32
re:

C'est tout a fait possible qu'il y ait des paramètres de sécurité!

Pour ce qui est du point d'arret, c'est normal je crois, la ligne
[ Set oOLE ... ] contient une méthode [ Add ] et l'on ne peut
traverser cette ligne lors d'un déboggage, ça m'arrive très
souvent.

Pour les paramètres de sécurité Excel, chez moi la sécurité
est au minimum et j'ai coché la case [ Faire confiance aux
projet VBA ] du deuxième onglet dans les paramètres de
sécurité.

Autre point, pour utiliser cet objet [ActiveWorkbook.VBProject.VBComponents], il te
faut charger la référence :
Microsoft Visual Basic for Applications Extensibility

Pour débogger place des point d'arret devant et après
la ligne du [ Set oOLE ... ].

Bon courage !

Lupin
Répondre à Lupin.A

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jot59, le mardi 4 avril 2006 à 17:36:06
Bonjour Lupin,

en fait tu as raison, lorsque je lance la macro hors VB donc depuis Excel , ca fonctionne.

ok merci de ton aide

a bientot
Répondre à jot59

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Naya, le mardi 14 novembre 2006 à 15:33:14
Bonjour,

je sais que ce post a ete resolu il y a longtemps mais vous pourrez surement m'aider.

je ne fais pas tout à fait la même chose que dans le message initial mais ca s'en rapproche.
je crée dynamiquement un certain nombre de boutons avec le code suivant et je crée le code qui va avec en utilisant ce que vous avez mis plus haut :
dim myCommandButtonDetail  as Control

Set myCommandButtonDetail = GestionMeuleForm.MultiPage1.Pages(4).CalculBesoinFrame.Contr­ols.Add _
        ("Forms.CommandButton.1", "CommandButtonDetail_" & iNbReappro)
    
With myCommandButtonDetail
               .Name = "CommandButtonDetail_" & iNbReappro
            '-- le reste des param
End With


strCode = "Public Sub CommandButtonDetail_" & iNbReappro & "_Click()" & Chr(13) & Chr(13)
strCode = strCode & "Load DetailReapproForm" & Chr(13) & "GestionMeuleForm.Hide" & Chr(13) & "DetailReapproForm.Show" & Chr(13) & Chr(13)
strCode = strCode & "End Sub" & Chr(13)
    
With ThisWorkbook.VBProject.VBComponents("GestionMeuleForm&q­uot;).CodeModule
        NextLine = .CountOfLines + 1
        .InsertLines NextLine, strCode
End With


cependant quand on clic sur un de ces boutons rien ne se passe alors que le code est bien ajouté a la fin du code de GestionMeuleForm.
je ne m'y connais pas assez en vba pour savoir pourquoi ca ne fonctionne pas.

merci d'avance de votre aide
Répondre à Naya

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le mardi 14 novembre 2006 à 19:01:17
Bonjour,

vous devez ajouter cette syntaxe :

With myCommandButtonDetail
            .Name = "CommandButtonDetail_" & iNbReappro
            .OnAction = "'Nom de la routine a appeller'"
            '-- le reste des param
End With


attention, la ligne se lit :

.OnAction = " 'Nom de la routine a appeller' "

Le nom de la routine doit être entre simple guillemets ' ... '
et le tout doit être entre double guillemets " ' ... ' "

Lupin
Répondre à Lupin.A

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Naya, le lundi 20 novembre 2006 à 11:51:59
Bonjour,

il me dit que la méthode ou propriété n'est pas gérée par cet objet

j'ai essayé en utilisant les OOleobject comme vous avez fait precedemment mais ca ne marche pas car je veux mettre l'objet sur un formulaire et ca ne marche pas :

quand je fais ca (pour tester) ca marche :
Set oOLECommandButtonDetail = ActiveWorkbook.ActiveSheet.OLEObjects.Add ( arguments...)

mais quand je fais ca (ce que je voudrai) ca ne marche pas :
Set oOLECommandButtonDetail = GestionMeuleForm.MultiPage1.Pages(4). _
CalculBesoinFrame.OLEObjects.Add(arguments...)

merci pour votre réponse

Claire
Répondre à Naya

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le mardi 21 novembre 2006 à 02:51:48
Bonjour,

Dans un premier temps, je dois vous avouer que j'ai confondu
un bouton menu au type de bouton que vous tentez d'installer.

J'ai testé votre code en le modelant pour m'en faire un exemple
et il semble que ce soit un bogue connue de microsoft d'après
les recherches que j'ai fais.

Désolé de ne pouvoir aller plus loin !

Lupin
Répondre à Lupin.A

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le mardi 21 novembre 2006 à 02:58:11
re:

voici le code que j'ai testé :

Sub TestCreationBouton()

    Dim myCommandButtonDetail  As CommandButton
    Dim iNbReappro As Integer, NextLine As Integer
    Dim strCode As String
    
    iNbReappro = 1
    
    Set myCommandButtonDetail = GestionMeuleForm.MultiPage1.Pages("Page4").CalculB­esoinFrame.Controls.Add _
        ("Forms.CommandButton.1", "CommandButtonDetail_" & iNbReappro)
    
    With myCommandButtonDetail
        .Name = "CommandButtonDetail_" & iNbReappro
        .Caption = "Run"
        .Top = 50
        .Left = 100
    End With

    strCode = ""
    strCode = strCode & "Private Sub CommandButtonDetail_" & iNbReappro & "_Click()" & vbCrLf & vbCrLf
    strCode = strCode & "'    Load DetailReapproForm" & vbCrLf
    strCode = strCode & "'    GestionMeuleForm.Hide" & vbCrLf
    strCode = strCode & "'    DetailReapproForm.Show" & vbCrLf
    strCode = strCode & "    Msgbox" & """" & "Réussi" & vbCrLf & vbCrLf
    strCode = strCode & "End Sub" & Chr(13)
    
    With ThisWorkbook.VBProject.VBComponents("GestionMeuleForm&q­uot;).CodeModule
        NextLine = .CountOfLines + 1
        .InsertLines NextLine, strCode
    End With


End Sub
'


Lupin
Répondre à Lupin.A

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Naya, le mardi 21 novembre 2006 à 09:47:48
Merci en tout cas d'avoir cherché (je sais au moins que ca ne vient pas de moi et de mes connaissances limitées en vba :p mais de windows lui meme).

Je vais me creuser la tête pour contourner le probleme ^^
Répondre à Naya

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Stim, le vendredi 31 août 2007 à 17:25:18
Bonjour,

Dans mon cas je créer une feuille dynamiquement dans le code et je créer un bouton dans celle ci, mais quand je veux insérer du code a la ligne :
With ThisWorkbook.VBProject.VBComponents(IntituleCre).CodeModule


Il me sort l'erreur :
"Erreur d'execution 9 :
L'indice n'appartient pas à la selection"

Et ceci peut importe ce que je met dans le with (meme quand le with est vide ...)

Aurais-je oublié qqchose ?
Configuration: Windows XP
Internet Explorer 6.0
Répondre à Stim

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le vendredi 31 août 2007 à 19:25:32
Bonjour Stim,

With ThisWorkbook.VBProject.VBComponents(IntituleCre).CodeModule

devrait se lire :

With ThisWorkbook.VBProject.VBComponents("IntituleCre")­.CodeModule

à moins que [ IntituleCre ] soit une variable et dans ce cas, c'est qu'elle
n'a pas été initialisé.

Lupin
Configuration: Windows XP
Internet Explorer 6.0
Répondre à Lupin.A

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Stim, le lundi 3 septembre 2007 à 09:30:55
Merci pour la précision lupin ;)

Mais le probleme n'est pas la en fait ^^ (IntituleCre est bien une variable qui contient le nom de la feuil)

Je viens de voir (en listant les vbcomponents) qu'en fait le component s'appelle "Feuil6" et cela marche très bien quand j'utilise ce nom la ... donc en fait, il me faudrait une méthode qui me renvoi le nom VB de cette feuille...
Configuration: Windows XP
Internet Explorer 6.0
Répondre à Stim

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le lundi 3 septembre 2007 à 15:29:19
re :

du genre :

Sub ChercheFeuille()
    
    Dim VBP As Variant
    Dim VBC As VBComponent
    Dim Message As String
    
    On Error Resume Next
    Set VBP = ActiveWorkbook.VBProject
    Message = ""
    With VBP
        For Each VBC In .VBComponents
            'Message = Message & vbLf & VBC.Name
            Select Case VBC.Type
                'Case 1: Message = Message & vbLf & "Module "
                'Case 2: Message = Message & vbLf & "Class Module "
                'Case 3: Message = Message & vbLf & "UserForm "
                Case 100: Message = Message & vbLf & "Document Module " & VBC.Name
            End Select
        Next VBC
    End With
    MsgBox Message
    
End Sub
'


Lupin
Configuration: Windows XP
Internet Explorer 6.0
Répondre à Lupin.A

23


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 djetther2006, le jeudi 27 mars 2008 à 17:57:27
Je voudrais créer un bouton qui me renvoie dans une autre cellule le chronomètre qui est déja affiché dans une cellule.

Mon problème est que la macro que j'utilise pour ce bouton n'est pas bonne , car lorsque j'active le bouton au lieu de me faire apparaitre le chrono , elle me fige la valeur.


Merci de m'aider....
Répondre à djetther2006

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
stim, le mardi 4 septembre 2007 à 08:41:45
En fait plus simplement j'ai trouvé la fonction "ActiveSheet.CodeName" qui me permet de récupérer le nom interne de la feuille, demandée par la fonction VBComponents...

Apres savoir pourquoi je peut pas mettre en direct le nom externe de la feuille ... la ca me dépasse ^^

Merci quand meme pour toutes tes réponses Lupin ;)

++
Répondre à stim

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
xaphie, le lundi 7 janvier 2008 à 20:28:25
Bonjour

Je ne suis pas super fort en VBA sur Excel, donc j'aurais besoin d'un petit coups de mains.
je vous explique un peu la structure de mon fichier.

j'ai une feuille de config qui me permet de créer toutes les autres autres feuilles du classeur.
dans ces feuilles, j'ai une feuille qui sert de "base" où je veux créé des boutons dynamiquement suivant le nom donné dans ma feuille de config.
c'est bouton devrais me faire aller directement à la feuille choisit
ex: bouton nommé "groupe" m'envoie sur la feuille "groupe"
Mon problème c'est que je ne sais pas comment récupérer le nom du boutons.

voici le code que j'envisager

sub choix_feuille()
dim nom_feuille as string

nom_feuille = ???????????

if feuille_existe then
sheets(nom_feuille).select
range("A1").select
else
msgbox ("Impossible, la feuille n'existe pas)
end if

Merci de votre aide
Répondre à xaphie

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le mardi 8 janvier 2008 à 14:51:00
Bonjour,

En supposant que la feuille de config se nomme [ Base ] !
En supposant que le bouton est placé sur la feuiile Base et qu'il se nomme [ Groupe ] !

Placer ce code derrière la feuille :
Option Explicit

Private Sub Groupe_Click()
    Call Module1.Choix_Feuille(Me.Groupe.Name)
End Sub


et placer ce code dans un module nommé [ Module1 ].
Option Explicit

Sub Choix_Feuille(Nom_Feuille As String)

    Nom_Feuille = Sheets("Base").Groupe.Name

    If (Feuille_Existe(Nom_Feuille)) Then
        Sheets(Nom_Feuille).Select
        Range("A1").Select
    Else
        MsgBox "Impossible, la feuille n'existe pas"
    End If

End Sub
'

Public Function Feuille_Existe(Feuille As String) As Boolean
    Dim wsFeuille As Worksheet
    Feuille_Existe = False
    For Each wsFeuille In Worksheets
        If (wsFeuille.Name = Feuille) Then
            Feuille_Existe = True
            Exit For
        End If
    Next wsFeuille
End Function
'
Répondre à Lupin.A

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
xaphie, le mardi 8 janvier 2008 à 20:11:30
Salut

Merci pour cette reponse

En fait ce que je voudrais, c'est de recupérer le nom du bouton qui ce nomme "groupe" dans la variable Nom_feuille de ma mcaro ci-dessous.

Sub Choix_Feuille(Nom_Feuille As String)

Nom_Feuille = ??? nom_du_bouton_sur lequel je click ??????

If (Feuille_Existe(Nom_Feuille)) Then
Sheets(Nom_Feuille).Select
Range("A1").Select
Else
MsgBox "Impossible, la feuille n'existe pas"
End If

End Sub

Je voudrais faire comme ça, car j'ai une macro qui me crée mes boutons en fonction d'une base (la feuille de config ). donc chaque bouton porte un nom qui correspond à une feuille et tous les boutons pointent sur la macro "choix_feuille" ci dessus. C'est pour ça que je veux recuperer le nom du bouton pour que lors du click sur le bouton groupe1 je vais sur la feuille groupe1 si je clik sur groupe2 je vais sur la groupe2 et ainsi de suite.

Je n'ai pas très bien compris comment fonctionne ta solution, mais je crois qu'il faut connaitre le nombre de boutons et créer une macro par bouton. Si j'ai bien compris, ta solution ne convient pas trop à ce que je voudrais faire car je ne connais pas le nombre de bouton qui sera créé car il sont créés à partir de la feuille de config et par conséquent je ne peu créer autant de macro que de bouton. d'ou la solution que voudrais mettre en place, mais je suis bloqué sur la manière de récupérer le nom du bouton sur lequel je click.
Deplus cela permet de fair des bouton dynamique.

Merci de ton aide si tu voie une autre maniere pour arriver à ce que je veux suis preuneur.
Répondre à xaphie

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le mardi 8 janvier 2008 à 21:44:52
re:

la il y a un problème !!!

Sous VBA il est impossible de créer un groupe de controle, donc chaque bouton
renvoie a une routine distincte !

ex:

Si le premier Bouton se nomme [ Groupe1 ]
Lorsque tu clique sur le bouton tu arrives
sur la procédure :

Private Sub Groupe1_Click()
End Sub

ainsi tu appelle ta procédure en passant le nom du bouton.

Private Sub Groupe1_Click()
Call Module1.Choix_Feuille("Groupe1")
End Sub
'

Si tes boutons, s'insère en dynamique, tu devras aussi
insérer le code correspondant de façon dynamique !

Lupin
Répondre à Lupin.A

20


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
guiss, le samedi 12 janvier 2008 à 01:00:14
Bonjour,

je fais mes premiers pas seul sur Visual basic et j'essaie de comprendre une série d'exercices simples que je commenc à faire (avec un peu de difficultés...)

j'essaie donc de créer sur ma feuille excel des boutons via visaul basic dans le cadre de la macro.

De base, il s'agit d'un exercice sur uen fonction de calcul de cercle dans lequel j'ai évidemment encodé la valeur de pi, celle du rayon, ... mais je n'arrive pas à cerner comment faire apparaitre sur ma feuille les boutons que je tente de créer (style appel_u_calcul , appel_p_calcul) et comment faire apparaitre un bouton "bouton form appel usf".

Car je n'arrive pas à créer et donc à faire le calcul avec userform

Bref, des premiers pas difficiles ; merci de l'aide apporter à ce petit sms d'un terrien en détresse
Répondre à guiss

21


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Lupin.A, le samedi 12 janvier 2008 à 15:27:11
Bonjour,

Si je comprends bien vous tenter de créer un/des bouton(s) sur une feuille de facon dynamique.

Commencer déja par faire les manipulations une fois sous l'enregistreur de macro !
Menu Excel // Outils / Macro / Nouvelle macro
Décomposé vos actions en plusieurs petites macros.

Exemple
Créer un bouton
Créer le code associé ( la fonction de calcul ) !
Attacher les morceaux
Epurer les macros
Créer la routine

Sous Excel
Alt F11

Faite un copier/coller du code généré par l'enregistreur et je vous guiderai pour le
nettoyage et l'ajout de boucle et condition.


A la base je puis vous conseiller d'utiliser le classeur que j'ai publié sur Excel-DownLoad
http://www.excel-downloads.com/...
Rechercher VizioXla, vous aurez une modele de base pour presque tous les objets d'excel !

Lupin
Répondre à Lupin.A

22


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
chlore, le jeudi 24 janvier 2008 à 18:48:58
Bonsoir,

Je rencontre le même genre de soucis que les personnes précédentes, je m'explique :
dans un onglet de mon classeur excel je crée dynamiquement des boutons associés à une macro qui me permettent de restituer dans un autre onglet des données filtrées sur le numéro de projet listé. Tous mes boutons mènent vers la même macro qui doit pouvoir identifier la ligne sur laquelle est placé le bouton cliqué, hors je ne trouve pas comment récupérer la ligne afin de savoir sur quoi filtrer ma restitution.
Merci d'avance de votre aide
Répondre à chlore
Logiciels pertinents trouvés dans les téléchargements
Télécharger DeKnop  4.3.12DeKnop - DeKnop ("LeBouton" en hollandais) est une application qui permet de créer des boutons pour les pages Web. Son utilisation...Catégorie: Webmaster
Licence: Freeware/gratuit
Télécharger Excel Viewer 2003Excel Viewer - Avec Microsoft Office Excel Viewer 2003, vous pouvez ouvrir, afficher et imprimer des classeurs Excel (fichiers XLS ), même...Catégorie: Tableur
Licence: Freeware/gratuit
Télécharger PDF Creator 0.9.5PDF Creator - PDF Creator est un outil gratuit permettant de créer des PDF à partir de presque n'importe quelle application capable...Catégorie: PDF
Licence: Open Source
Télécharger AVS Disc Creator 2.1.5.100AVS Disc Creator - Avec AVS DiscCreator vous pouvez rapidement graver vos données sur CD/DVD et Blu-ray disc. <h2>Fonctionnalités</h2> ...Catégorie: Gravure
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « créer un bouton dynamiquement excel via VBA »