J'ai dans une feuille Excel des données en A1:A4.
Un userform crée automatiquement le nombre de textbox au nombre de ligne
complétée. Autrement dit ici 4 textbox. Sachant que ces textbox sont nommée
successivement Textbox1 Textbox2 ... automatiquement.
J'ai également à chaque nouvelle textbox un bouton qui se créee
automtiquement : bouton1 bouton2 ...
voici le code de la création automtique du bouton :
Code:
Set ctr4 = Controls.Add("forms.commandbutton.1", "bouton" & x, True)
With ctr4
.Picture = LoadPicture("C:\annuler.gif")
End With
ctr4.Left = 408
ctr4.Width = 12
ctr4.Height = 12
ctr4.Top = 36 + (x - 1) * 22
2 questions :
Comment attribuer une action 'Click' à ce bouton automatiquement?
2 ème question :
J'aimerai que lorsque je clique sur le bouton, la ligne correspondante soit
supprimée dans la feuille Excel.
Ex : si je clique sur le bouton 'bouton2' alors la ligne 2 est supprimée.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
PMO
Bonjour,
Dans la mesure où j'ai bien compris voici un code à adapter selon vos besoins.
QUE FAIT IL A partir de la feuille "test" comportant des données, par exemple, en A1:C4 (impératif que A1 soit renseignée) le programme construit de manière dynamique 1) Un UserForm 2) Des TextBox et des Boutons en fonction du nombre de lignes de la plage A1:C4 soit 4 TextBox et 4 boutons dans cette exemple. Il faut que la plage désirée ne comporte en son sein ni ligne ni colonne vides. 3) Un bouton de fermeture 4) Pour chaque TextBox et chaque bouton un code évènementiel est créé. Si la feuille ne comporte aucune donnée il ne se passera rien.
En réponse à votre question 2 Plutôt que supprimer des lignes on les efface. Le fait de les supprimer crée un décalage ainsi si on supprime la ligne 2, la ligne 3 ne sera plus la ligne 3 mais deviendra la ligne 2.
ADAPTATION Adapter la constante test de la ligne Const MAFEUILLE As String = "test" Adapter également les propriétés suivantes Caption Height Width Left Top Text Font.Size Picture = LoadPicture("c:annuler.gif")
REFERENCE NECESSAIRE Ajouter impérativement la référence suivante par Menu Outils/Références (dans le VBE) Microsoft Forms 2.0 Object Library
CODE à copier dans un module Standard '********************** '### Adapter au nom de la feuille ### Const MAFEUILLE As String = "test"
'############################################ '# Ajouter impérativement la référence # '# suivante dans Menu Outils/Références # '# # '# Microsoft Forms 2.0 Object Library # '############################################ Sub PMO_BoutonAutomatique() Dim UF As Object Dim TB As MSForms.TextBox Dim CB As MSForms.CommandButton Dim A$ Dim i& Dim NbLig& Dim x& '---- Si aucune données en A1 on sort ---- If Sheets(MAFEUILLE).[a1] = "" Then Exit Sub '---- Nombre de lignes ---- NbLig& = Sheets(MAFEUILLE).[a1].CurrentRegion.Rows.Count On Error GoTo fin '---- Crée dynamiquement un UserForm ---- Set UF = ThisWorkbook.VBProject _ .VBComponents.Add(3) ' 3=UserForm With UF .Properties("Caption") = "Mon UserForm" 'à adapter .Properties("Height") = 240 'à adapter .Properties("Width") = 500 'à adapter End With '---- Crée le bouton de fermeture ---- Set CB = UF.Designer.Controls _ .Add("forms.CommandButton.1") With CB .Caption = "Fermer" .Left = 200 .Top = 180 End With '---- Crée les contrôles ---- For i& = 1 To NbLig& x = x + 1 '°°° Les TextBox °°° Set TB = UF.Designer.Controls _ .Add("forms.TextBox.1") With TB .Text = "Ligne " & i& 'à adapter .Left = 300 .Width = 105 .Height = 16 .Font.Size = 9 .Top = 36 + (x - 1) * 22 End With '°°° Les boutons °°° Set CB = UF.Designer.Controls _ .Add("forms.CommandButton.1") With CB .Picture = LoadPicture("c:annuler.gif") .Left = 408 .Width = 12 .Height = 12 .Top = 36 + (x - 1) * 22 End With Next i& '---- Ajout du code évènementiel ---- '°°° Fermer °°°° A$ = "Private Sub CommandButton1_Click()" & _ vbCrLf & "Unload Me" & _ vbCrLf & "End Sub" & vbCrLf '°°° Les boutons °°°° For i& = 1 To NbLig& A$ = A$ & "Private Sub CommandButton" & _ i& + 1 & "_Click()" & _ vbCrLf & "Sheets(""" & MAFEUILLE & _ """).Rows(" & i& & ").ClearContents" & _ vbCrLf & "End Sub" & vbCrLf Next i& ThisWorkbook.VBProject.VBComponents(UF.Name) _ .CodeModule.AddFromString (A$) '---- Affiche le UserForm ---- VBA.UserForms.Add(UF.Name).Show '---- Détruit le UserForm ---- ThisWorkbook.VBProject.VBComponents _ .Remove UF fin: End Sub '**********************
Cordialement.
-- PMO Patrick Morange
Bonjour,
J'ai dans une feuille Excel des données en A1:A4. Un userform crée automatiquement le nombre de textbox au nombre de ligne complétée. Autrement dit ici 4 textbox. Sachant que ces textbox sont nommée successivement Textbox1 Textbox2 ... automatiquement. J'ai également à chaque nouvelle textbox un bouton qui se créee automtiquement : bouton1 bouton2 ...
voici le code de la création automtique du bouton :
Code:
Set ctr4 = Controls.Add("forms.commandbutton.1", "bouton" & x, True) With ctr4 .Picture = LoadPicture("C:annuler.gif") End With ctr4.Left = 408 ctr4.Width = 12 ctr4.Height = 12 ctr4.Top = 36 + (x - 1) * 22
2 questions : Comment attribuer une action 'Click' à ce bouton automatiquement? 2 ème question : J'aimerai que lorsque je clique sur le bouton, la ligne correspondante soit supprimée dans la feuille Excel. Ex : si je clique sur le bouton 'bouton2' alors la ligne 2 est supprimée.
Quelqu'un peut m'aider?
Merci bcp
Laurent
Bonjour,
Dans la mesure où j'ai bien compris voici un code à adapter selon vos besoins.
QUE FAIT IL
A partir de la feuille "test" comportant des données, par exemple, en A1:C4
(impératif que A1 soit renseignée) le programme construit de manière dynamique
1) Un UserForm
2) Des TextBox et des Boutons en fonction du nombre de lignes de la plage
A1:C4 soit 4 TextBox et 4 boutons dans cette exemple.
Il faut que la plage désirée ne comporte en son sein ni ligne ni colonne
vides.
3) Un bouton de fermeture
4) Pour chaque TextBox et chaque bouton un code évènementiel est créé.
Si la feuille ne comporte aucune donnée il ne se passera rien.
En réponse à votre question 2
Plutôt que supprimer des lignes on les efface. Le fait de les supprimer
crée un décalage ainsi si on supprime la ligne 2, la ligne 3 ne sera plus
la ligne 3 mais deviendra la ligne 2.
ADAPTATION
Adapter la constante test de la ligne Const MAFEUILLE As String = "test"
Adapter également les propriétés suivantes
Caption
Height
Width
Left
Top
Text
Font.Size
Picture = LoadPicture("c:annuler.gif")
REFERENCE NECESSAIRE
Ajouter impérativement la référence suivante par Menu Outils/Références
(dans le VBE)
Microsoft Forms 2.0 Object Library
CODE à copier dans un module Standard
'**********************
'### Adapter au nom de la feuille ###
Const MAFEUILLE As String = "test"
'############################################
'# Ajouter impérativement la référence #
'# suivante dans Menu Outils/Références #
'# #
'# Microsoft Forms 2.0 Object Library #
'############################################
Sub PMO_BoutonAutomatique()
Dim UF As Object
Dim TB As MSForms.TextBox
Dim CB As MSForms.CommandButton
Dim A$
Dim i&
Dim NbLig&
Dim x&
'---- Si aucune données en A1 on sort ----
If Sheets(MAFEUILLE).[a1] = "" Then Exit Sub
'---- Nombre de lignes ----
NbLig& = Sheets(MAFEUILLE).[a1].CurrentRegion.Rows.Count
On Error GoTo fin
'---- Crée dynamiquement un UserForm ----
Set UF = ThisWorkbook.VBProject _
.VBComponents.Add(3) ' 3=UserForm
With UF
.Properties("Caption") = "Mon UserForm" 'à adapter
.Properties("Height") = 240 'à adapter
.Properties("Width") = 500 'à adapter
End With
'---- Crée le bouton de fermeture ----
Set CB = UF.Designer.Controls _
.Add("forms.CommandButton.1")
With CB
.Caption = "Fermer"
.Left = 200
.Top = 180
End With
'---- Crée les contrôles ----
For i& = 1 To NbLig&
x = x + 1
'°°° Les TextBox °°°
Set TB = UF.Designer.Controls _
.Add("forms.TextBox.1")
With TB
.Text = "Ligne " & i& 'à adapter
.Left = 300
.Width = 105
.Height = 16
.Font.Size = 9
.Top = 36 + (x - 1) * 22
End With
'°°° Les boutons °°°
Set CB = UF.Designer.Controls _
.Add("forms.CommandButton.1")
With CB
.Picture = LoadPicture("c:annuler.gif")
.Left = 408
.Width = 12
.Height = 12
.Top = 36 + (x - 1) * 22
End With
Next i&
'---- Ajout du code évènementiel ----
'°°° Fermer °°°°
A$ = "Private Sub CommandButton1_Click()" & _
vbCrLf & "Unload Me" & _
vbCrLf & "End Sub" & vbCrLf
'°°° Les boutons °°°°
For i& = 1 To NbLig&
A$ = A$ & "Private Sub CommandButton" & _
i& + 1 & "_Click()" & _
vbCrLf & "Sheets(""" & MAFEUILLE & _
""").Rows(" & i& & ").ClearContents" & _
vbCrLf & "End Sub" & vbCrLf
Next i&
ThisWorkbook.VBProject.VBComponents(UF.Name) _
.CodeModule.AddFromString (A$)
'---- Affiche le UserForm ----
VBA.UserForms.Add(UF.Name).Show
'---- Détruit le UserForm ----
ThisWorkbook.VBProject.VBComponents _
.Remove UF
fin:
End Sub
'**********************
Cordialement.
--
PMO
Patrick Morange
Bonjour,
J'ai dans une feuille Excel des données en A1:A4.
Un userform crée automatiquement le nombre de textbox au nombre de ligne
complétée. Autrement dit ici 4 textbox. Sachant que ces textbox sont nommée
successivement Textbox1 Textbox2 ... automatiquement.
J'ai également à chaque nouvelle textbox un bouton qui se créee
automtiquement : bouton1 bouton2 ...
voici le code de la création automtique du bouton :
Code:
Set ctr4 = Controls.Add("forms.commandbutton.1", "bouton" & x, True)
With ctr4
.Picture = LoadPicture("C:annuler.gif")
End With
ctr4.Left = 408
ctr4.Width = 12
ctr4.Height = 12
ctr4.Top = 36 + (x - 1) * 22
2 questions :
Comment attribuer une action 'Click' à ce bouton automatiquement?
2 ème question :
J'aimerai que lorsque je clique sur le bouton, la ligne correspondante soit
supprimée dans la feuille Excel.
Ex : si je clique sur le bouton 'bouton2' alors la ligne 2 est supprimée.
Dans la mesure où j'ai bien compris voici un code à adapter selon vos besoins.
QUE FAIT IL A partir de la feuille "test" comportant des données, par exemple, en A1:C4 (impératif que A1 soit renseignée) le programme construit de manière dynamique 1) Un UserForm 2) Des TextBox et des Boutons en fonction du nombre de lignes de la plage A1:C4 soit 4 TextBox et 4 boutons dans cette exemple. Il faut que la plage désirée ne comporte en son sein ni ligne ni colonne vides. 3) Un bouton de fermeture 4) Pour chaque TextBox et chaque bouton un code évènementiel est créé. Si la feuille ne comporte aucune donnée il ne se passera rien.
En réponse à votre question 2 Plutôt que supprimer des lignes on les efface. Le fait de les supprimer crée un décalage ainsi si on supprime la ligne 2, la ligne 3 ne sera plus la ligne 3 mais deviendra la ligne 2.
ADAPTATION Adapter la constante test de la ligne Const MAFEUILLE As String = "test" Adapter également les propriétés suivantes Caption Height Width Left Top Text Font.Size Picture = LoadPicture("c:annuler.gif")
REFERENCE NECESSAIRE Ajouter impérativement la référence suivante par Menu Outils/Références (dans le VBE) Microsoft Forms 2.0 Object Library
CODE à copier dans un module Standard '********************** '### Adapter au nom de la feuille ### Const MAFEUILLE As String = "test"
'############################################ '# Ajouter impérativement la référence # '# suivante dans Menu Outils/Références # '# # '# Microsoft Forms 2.0 Object Library # '############################################ Sub PMO_BoutonAutomatique() Dim UF As Object Dim TB As MSForms.TextBox Dim CB As MSForms.CommandButton Dim A$ Dim i& Dim NbLig& Dim x& '---- Si aucune données en A1 on sort ---- If Sheets(MAFEUILLE).[a1] = "" Then Exit Sub '---- Nombre de lignes ---- NbLig& = Sheets(MAFEUILLE).[a1].CurrentRegion.Rows.Count On Error GoTo fin '---- Crée dynamiquement un UserForm ---- Set UF = ThisWorkbook.VBProject _ .VBComponents.Add(3) ' 3=UserForm With UF .Properties("Caption") = "Mon UserForm" 'à adapter .Properties("Height") = 240 'à adapter .Properties("Width") = 500 'à adapter End With '---- Crée le bouton de fermeture ---- Set CB = UF.Designer.Controls _ .Add("forms.CommandButton.1") With CB .Caption = "Fermer" .Left = 200 .Top = 180 End With '---- Crée les contrôles ---- For i& = 1 To NbLig& x = x + 1 '°°° Les TextBox °°° Set TB = UF.Designer.Controls _ .Add("forms.TextBox.1") With TB .Text = "Ligne " & i& 'à adapter .Left = 300 .Width = 105 .Height = 16 .Font.Size = 9 .Top = 36 + (x - 1) * 22 End With '°°° Les boutons °°° Set CB = UF.Designer.Controls _ .Add("forms.CommandButton.1") With CB .Picture = LoadPicture("c:annuler.gif") .Left = 408 .Width = 12 .Height = 12 .Top = 36 + (x - 1) * 22 End With Next i& '---- Ajout du code évènementiel ---- '°°° Fermer °°°° A$ = "Private Sub CommandButton1_Click()" & _ vbCrLf & "Unload Me" & _ vbCrLf & "End Sub" & vbCrLf '°°° Les boutons °°°° For i& = 1 To NbLig& A$ = A$ & "Private Sub CommandButton" & _ i& + 1 & "_Click()" & _ vbCrLf & "Sheets(""" & MAFEUILLE & _ """).Rows(" & i& & ").ClearContents" & _ vbCrLf & "End Sub" & vbCrLf Next i& ThisWorkbook.VBProject.VBComponents(UF.Name) _ .CodeModule.AddFromString (A$) '---- Affiche le UserForm ---- VBA.UserForms.Add(UF.Name).Show '---- Détruit le UserForm ---- ThisWorkbook.VBProject.VBComponents _ .Remove UF fin: End Sub '**********************
Cordialement.
-- PMO Patrick Morange
Bonjour,
J'ai dans une feuille Excel des données en A1:A4. Un userform crée automatiquement le nombre de textbox au nombre de ligne complétée. Autrement dit ici 4 textbox. Sachant que ces textbox sont nommée successivement Textbox1 Textbox2 ... automatiquement. J'ai également à chaque nouvelle textbox un bouton qui se créee automtiquement : bouton1 bouton2 ...
voici le code de la création automtique du bouton :
Code:
Set ctr4 = Controls.Add("forms.commandbutton.1", "bouton" & x, True) With ctr4 .Picture = LoadPicture("C:annuler.gif") End With ctr4.Left = 408 ctr4.Width = 12 ctr4.Height = 12 ctr4.Top = 36 + (x - 1) * 22
2 questions : Comment attribuer une action 'Click' à ce bouton automatiquement? 2 ème question : J'aimerai que lorsque je clique sur le bouton, la ligne correspondante soit supprimée dans la feuille Excel. Ex : si je clique sur le bouton 'bouton2' alors la ligne 2 est supprimée.