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. (Merci à Robert pour ce code).
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.
Alors comme ça Robert te file des Bouton qui ne font pas de Click !!! LOL
Bon voici une Redif de Démo adaptée pour toi...
A mettre dans un Module Standard d'un Classeur Vierge Pour Tester... (NB Penser à la référence comme indiqué, Menu VBA Outils / Référence)
OptionExplicit
'================================R E A D - M E====================================== ' ' NB Nécessite la Réference VB à Microsoft Form 2.0 Object Library ' Paramétrage Sécurité 'Faire Confiance au Projet Visual Basic' '===================================================================================
Const Sign AsString = '@+Thierry 's Truc sur www.Excel-Downloads.com, Aug 2005' Const USFName AsString = 'USF_Auto_Thierry' Const WSName AsString = 'Feuil1' '<<< A ADAPTER
Sub MyUserFormAutoBuilder() Dim ObjUSF AsObject Dim ObjTextBox As Object, ObjLabel As Object, CmdB As Object, LstB AsObject Dim TopPlusHeight AsInteger Dim x AsByte Dim VCmdLeft AsInteger Dim VTxbLeft AsInteger
Non mais je rêve !!! Que sont ces insinuations comme quoi j'aurais refilé des boutons à Laurent !!! Je ne vous permets pas Môssieu Thierry. C'eût été une Laurence... Passe encore, malgré une hygiène irréprochable, on n'est jamais à l'abri par les dents qui courent d'une irritation des muqueuses. Mais à un Laurent ? Vous vous méprenez sur mes mœurs très cher. Vous avez dû vous laisser abuser par mon amour pour le Brésil... Comme j'ai bien ri sur ce coup là je vous pardonne volontiers, mais n'y revenez pas sinon c'est le duel au chant du coq dans un bistrot à votre convenance. Les armes ? Je vous laisse le choix : la Duvel ou la Caipirinha...
Bon assez déconner... Laurent j'ai répondu à ton e-mail et je pense que tu vas t'en sortir maintenant avec ces lignes de coke du dealeur monégasque. Comment ? qu'ai-je dit ? Ho pardon ! Je voulais dire : 'ces lignes de codes du Killeur monégasque...'
Merci à vous deux.
Pour le code c'est bien cela qu'il me fallait. Du moins à peu près.
J'ai mis un peu de temps à décortiquer pour comprendre le fonctionnement, mais çà va! j'ai compris!
Cependant il ya quelque chose qui ne fonctionne pas.
En effet à la base j'ai un userform avec un bouton appelé Bouton1.
Donc quand j'adapte le code, il me créee bien le nombre de bouton correspondant au nombre de ligne, mais!
il n'y a que le premier bouton qui fonctionne. Je pense que cela est du au fait que mon usf ne comporte que un bouton.
En effet le code de Thierry créee un userform avec le nombre de bouton correspondant, je veux dire par là que dans visual basic j'ai un nouveau usf qui s'affiche.
Y'a-t-il un moyen de contourner ce problème?
Car une fois lancé l'initialisation de mon usf, il me créer bien le code correspondant au nombre de bouton c'est à dire : bouton1_click, bouton2_click...
Private Sub UserForm_Initialize()
Dim P As Range 'déclare la variable P
Dim n As Byte 'déclare la variable n
Dim x As Byte 'déclare la variable x
Dim Ctr As Control 'déclare la variable Ctr
Dim Ctr2 As Control
Dim Ctr3 As Control
Dim Ctr4 As Control
Set P = Range('A1:A' & Range('A65536').End(xlUp).Row) 'définit la variable P
n = P.Cells.Count 'définit la variable n
'limite à dix TextBoxes au cas où il y aurait plus de donnés dans la colonne A
If n > 10 Then n = 10
'condition : si n est supérieur à 1
If n >= 1 Then
Me.Height = 80 + (n - 1) * 22 'redimensionne la hauteur de l'UserForm
'ajout des Textboxes
For x = 2 To n 'boucle de 2 à n
'définit la variable Ctr
Set Ctr = Controls.Add('forms.TextBox.1', 'tests' & x, True)
Ctr.Left = 12 'positionne le nouveau TextBox (horizontal)
Ctr.Width = 132 'dimensionne le nouveau TextBox
Ctr.Top = 30 + (x - 1) * 22 'positionne le nouveau TextBox (vertical)
Ctr.TabIndex = x - 1 'position du focus par la touche [Tab]
Set Ctr2 = Controls.Add('forms.TextBox.1', 'qte' & x, True)
Ctr2.Left = 186 'positionne le nouveau TextBox (horizontal)
Ctr2.Width = 30 'dimensionne le nouveau TextBox
Ctr2.Top = 30 + (x - 1) * 22 'positionne le nouveau TextBox (vertical)
Ctr2.TabIndex = x - 1 'position du focus par la touche [Tab]
Set Ctr3 = Controls.Add('forms.TextBox.1', 'commentaire' & x, True)
Ctr3.Left = 240 'positionne le nouveau TextBox (horizontal)
Ctr3.Width = 162 'dimensionne le nouveau TextBox
Ctr3.Top = 30 + (x - 1) * 22 'positionne le nouveau TextBox (vertical)
Ctr3.TabIndex = x - 1 'position du focus par la touche [Tab]
Set Ctr4 = Controls.Add('forms.commandbutton.1', 'annuler' & x, True)
With Ctr4
.Picture = LoadPicture('C:\\Documents and Settings\\LGADEYNE\\Bureau\\annuler.gif')
End With
Ctr4.Left = 408 'positionne le nouveau TextBox (horizontal)
Ctr4.Width = 12 'dimensionne le nouveau TextBox
Ctr4.Height = 12
Ctr4.Top = 36 + (x - 1) * 22 'positionne le nouveau TextBox (vertical)
Next x 'prochaine valeur de la boucle
End If 'fin de la condition
MyLabelClicks detail.Name
'remplissage des TextBoxes
For x = 1 To n 'boucle de 1 à n
'attribue au TextBox la valeur de la cellule correspondante
Me.Controls('tests' & x).Value = Range('A' & x).Value
Next x 'prochaine valeur de la boucle
End Sub
Sub MyLabelClicks(MyUsf As String)
Dim x As Integer
Dim L As Byte
Const WSName As String = 'Feuil1'
With ThisWorkbook.VBProject.VBComponents(MyUsf).CodeModule
For L = 1 To 4
x = .CountOfLines
.InsertLines x + 1, 'Sub annuler' & L & '_Click()'
.InsertLines x + 2, 'MsgBox ''Bonjour je vais détruire la Ligne ' & L & ''
.InsertLines x + 3, 'Sheets(''' & WSName & ''').Rows(' & L & ').EntireRow.Delete'
.InsertLines x + 4, 'End Sub'
Next
End With
End Sub
Salut a tous, Laurent, _Thierry, Robert ainsi que le reste de la galaxy
Je ne sais pas si ton code marche.
J’ai eu les memes problemes que toi, c'est-à-dire que la creation d’evenements ne fonctionnait qu’avec des label ou button crées « en dur » (a la main) et non a l’initialisation du formulaire.
Pour remedier au probleme, j’ai utilise les modules de classe.
Un modul de class, ca permet a certain control, que tu aura « ajoutés » au modul de class, d’avoir tous le meme comportement
Dans mon exemple, on va se focaliser sur MesLabelsSoustitre. En gros jai des labels qui s’appelles « soustitre* » et je veux a tous leur assigner la meme action on click
J’ai Commencé par créer un modul de class nommé : MesLabelsSoustitre
et en declaration
Code:
Public WithEvents GroupelabelSoustitre As MSForms.Label
Puis, il faut declarer dans ton userform initialise :
Code:
Dim Ctrl As Control
Dim LabelSoustitre() As New MesLabelsSoustitre 'Tu va donc ajouter Labelsoustitre dans le module de class meslabelssoustitre
Une fois les labels crees a la volée, toujours dans ton Userform initialize, rajoute :
Code:
Nb = 0
For Each Ctrl In UserForm1.Controls 'Nom de ton formulaire
If TypeName(Ctrl) = 'Label' Then 'Pour tous les Labels…
If Ctrl.name Like 'label*' = True Then '…Commencant par “label…”
Nb = Nb + 1
ReDim Preserve LabelSoustitre(1 To Nb)
Set LabelSoustitre(Nb).GroupelabelSoustitre = Ctrl ' « ajouter » le label actuel au modul de class mesLabelsSoustitre
End If
End If
Next
Tu peux evidemment faire pareil avec les button en remplacant label par button...
Maintenant, que les labels qui m’interresse sont « ajouté » au mon modul de class, on va leur assigner des events.
Dans ton modul de class, en code, rajoute :
Code:
Private Sub GroupelabelSousTitre_click() ' au click sur un label « ajouté » au modul de class
MsgBox 'je suis le label: ' & GroupelabelSoustitre.name & Chr(13) 'Affiche le nom du label sur lequel tu cliques
End Sub
Bon, c’est + parlant avec l’exemple sous le nez
Lien supprimé
J’espere que ca pourra t’aider (je sais pas si c’est extremement clair, a vrai dire je ne coirs pas mais je suis a bloc pourtant….) et que tu vas t'y retoruver dans tous les noms que j'ai donné
J'ai cherché un petit moment mais çà y'est j'ai compris!
Donc en fait j'ai crée un module classique dans lequel je fais monté mon usf avec ajout dans le module de classe des boutons, puis affiche mon usf.
Si je mets l'évènement sur le click dans le module de classe :
Code:
msgbox 'Bravo'
çà fonctionne.
Mais est-il possible par exemple quand je clique sur le bouton annuler1 que il me fasse quelque chose du genre :
Code:
Set boutonname = annuler
set numligne = 1
Le 1 correspondant au numéro du bouton.
Car je pense que je vais devoir passer par là (extraction du numéro) pour pouvoir faire une suppression de la ligne correspondante.
Comme çà je n'aurais plus qu'à mettre un truc du style :
Alors j'ai essayer de trouver comment faire dans le module de classe pour que lorsque je clique sur un bouton il y a une msgbox qui s'affiche avec le numéro du bouton.
Mais je n'y arrive pas.
voici mon code :
Code:
Private Sub groupeboutonannuler_click()
Set num = groupeboutonannuler
MsgBox 'numéro ' & num
End Sub
Donc, une astuce que j'ai trouve pour faire passe des numero dans le modul de classe c'est d'utiliser la propriete '.tag' des button.
Je m'explique.
Quand tu cree tes bouton a la volée, rajoute un tag a chaque button, avec n (ou x, je sais pas comment tu l'a appelle le numero de la ligne) le numero du button
Code:
ctlNew.Tag = n 'permet de dire que c'est le button '1' ou '2'...
puis dans le module de classe, tu mets on click:
msgbox 'Annuler'&GroupelabelSousTitre.tag ' ca te marquera le Tag (donc le numero) du button sur lequel tu clique.
Sheets('Feuil1').Rows(GroupelabelSousTitre.tag).EntireRow.Delete'efface la ligne en question
T'as pas besoin de definir une action pour chaque button, si tu met ca dans le modul de classe ca le fait pour tous.
Et tu voudrais pas mettre ton fichier, ca serai peut etre + simple pour aider??