|
|
|
|
Créer un bouton dynamiquement excel via VBA
Dernière réponse le 1 oct 2009 à 17:19:11 jot59, le 31 mar 2006 à 16:56:43Bonjour ,
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.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).CodeModule
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
Bonjour,
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:="Forms.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).CodeModule
NextLine = .CountOfLines + 1
.insertlines NextLine, Code
End With
End Sub
Lupin
|
Bonjour,
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 |
Bonjour,
|
Bonjour,
|
Re:
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").CalculBesoinFrame.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").CodeModule
NextLine = .CountOfLines + 1
.InsertLines NextLine, strCode
End With
End Sub
'
Lupin
|
Bonjour,
Configuration: Windows XP Internet Explorer 6.0 |
Bonjour Stim,
Configuration: Windows XP Internet Explorer 6.0 |
Merci pour la précision lupin ;)
Configuration: Windows XP Internet Explorer 6.0 |
Re :
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
|
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...
|
Bonjour
|
Bonjour,
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
'
|
Salut
|
Re:
|
Bonjour,
|
Bonjour,
|
Bonsoir,
|
Bonjour,
Sub CreerBoutonRetour()
Dim Code As String
Dim NextLine As String
Dim oOLE As OLEObject
Set oOLE = ActiveWorkbook.ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=340, Top:=5, 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(1).Object.Caption = "Retour aux graphes"
Code = "Sub CommandButton" & X & "_Click()" & vbCrLf
Code = Code & "Sheets(""Graph (2)"").Select" & vbCrLf
Code = Code & "End Sub"
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
NextLine = .CountOfLines + 1
.insertlines NextLine, Code
End With
End Sub
Sub ListederoulanteOnglets()
Dim Code As String
Dim NextLine As String
Dim oOLE As OLEObject
Set oOLE = ActiveWorkbook.ActiveSheet.OLEObjects.Add(ClassType:="Forms.Combobox.1", _
Link:=False, DisplayAsIcon:=False, Left:=1000, Top:=500, Width:=200, 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 = "BoutonListe" & X
'texte sur le bouton
'ActiveSheet.OLEObjects(1).Object.Caption = "Choix de l'onglet"
Code = "Sub BoutonListe" & X & "_DropButtonClick()" & vbCrLf
Code = Code & "BoutonListe" & X & ".Clear" & vbCrLf
sheetsnbre = ActiveWorkbook.Sheets.Count
For cptouze = 1 To sheetsnbre
Code = Code & "BoutonListe" & X & ".AddItem Sheets(" & cptouze & ").Name" & vbCrLf
Next cptouze
Code = Code & "End Sub"
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
NextLine = .CountOfLines + 1
.insertlines NextLine, Code
End With
Code2 = "Sub BoutonListe" & X & "_Click()" & vbCrLf
Code2 = Code2 & "Sheets(" & "BoutonListe" & X & ".Value).Activate" & vbCrLf
Code2 = Code2 & "End Sub"
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
NextLine = .CountOfLines + 1
.insertlines NextLine, Code2
End With
End Sub |

