bouton automatique

LaurentG

XLDnaute Occasionnel
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. (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.

Quelqu'un peut m'aider?

Merci bcp

Laurent
 

_Thierry

XLDnaute Barbatruc
Repose en paix
=> Redif DEMO UserForm Génération Automatique

Bonsoir Laurent, le Forum

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)

Option Explicit

'================================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 As String = '@+Thierry 's Truc sur www.Excel-Downloads.com, Aug 2005'
Const USFName As String = 'USF_Auto_Thierry'
Const WSName As String = 'Feuil1' '<<< A ADAPTER


Const TxbWidth As Integer = 65
Const TxbHeigth As Integer = 20
Const TxbLeft As Integer = 90
Const TxbTop As Integer = 15

Const CmdWidth As Integer = 70
Const CmdHeigth As Integer = 20
Const CmdLeft As Integer = 10
Const CmdTop As Integer = 15

Sub MyUserFormAutoBuilder()
Dim ObjUSF As Object
Dim ObjTextBox As Object, ObjLabel As Object, CmdB As Object, LstB As Object
Dim TopPlusHeight As Integer
Dim x As Byte
Dim VCmdLeft As Integer
Dim VTxbLeft As Integer

&nbsp;
&nbsp;
Set ObjUSF = ThisWorkbook.VBProject.VBComponents.Add(3)
&nbsp;
With ObjUSF
&nbsp; &nbsp; .Properties('Caption') = Sign
&nbsp; &nbsp; .Properties('Width') = 660
&nbsp; &nbsp; .Properties('Height') = 260
&nbsp; &nbsp; .Properties('ShowModal') =
True
'&nbsp; &nbsp; .Properties('Name') = USFName 'Si on veut forcer un Nom de UserForm...
&nbsp;
End With
&nbsp;
&nbsp; &nbsp;
For x = 1 To 40
&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp;
Set ObjTextBox = ObjUSF.Designer.Controls.Add('Forms.TextBox.1')
&nbsp; &nbsp; &nbsp;
Set ObjLabel = ObjUSF.Designer.Controls.Add('Forms.CommandButton.1')
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Select Case x
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Case 1 To 10
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If x = 1 Then TopPlusHeight = CmdTop
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VCmdLeft = CmdLeft
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VTxbLeft = TxbLeft
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Case 11 To 20
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If x = 11 Then TopPlusHeight = CmdTop
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VCmdLeft = CmdLeft + 160
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VTxbLeft = TxbLeft + 160
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Case 21 To 30
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If x = 21 Then TopPlusHeight = CmdTop
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VCmdLeft = CmdLeft + 320
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VTxbLeft = TxbLeft + 320
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Case 31 To 40
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If x = 31 Then TopPlusHeight = CmdTop
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VCmdLeft = CmdLeft + 480
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VTxbLeft = TxbLeft + 480
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End Select
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
With ObjLabel
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Caption = 'Button ' & x
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Left = VCmdLeft: .Top = TopPlusHeight: .Width = CmdWidth: .Height = CmdHeigth
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Tag = 'Thierry
's Demo'
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Name = 'CmdDemo' & x
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End With
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
With ObjTextBox
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Left = VTxbLeft: .Top = TopPlusHeight: .Width = TxbWidth: .Height = TxbHeigth
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Tag = 'Thierry
's Demo'
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Name = 'TxbDemo' & x
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .TextAlign = fmTextAlignRight
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End With
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; TopPlusHeight = TopPlusHeight + 20
&nbsp; &nbsp;
Next

MyLabelClicks ObjUSF.Name

VBA.UserForms.Add(ObjUSF.Name).Show
&nbsp;
Set ObjUSF = Nothing
Set ObjTextBox = Nothing
Set ObjLabel = Nothing

End Sub

Sub MyLabelClicks(MyUsf As String)
Dim x As Integer
Dim L As Byte

&nbsp; &nbsp;
With ThisWorkbook.VBProject.VBComponents(MyUsf).CodeModule
&nbsp; &nbsp; &nbsp; &nbsp;
For L = 1 To 40
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = .CountOfLines
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .InsertLines x + 1, 'Sub CmdDemo' & L & '_Click()'
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .InsertLines x + 2, 'MsgBox ''Bonjour je vais détruire la Ligne ' & L & ''
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .InsertLines x + 3, 'Sheets(''' & WSName & ''').Rows(' & L & ').EntireRow.Delete'
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .InsertLines x + 4, 'End Sub'
&nbsp; &nbsp; &nbsp; &nbsp;
Next
&nbsp; &nbsp;
End With

End Sub


Il est clair que cette démo fait un peu plus que ce que tu demandes mais tu as ainsi tous les éléments...

Bonne Soirée
[ol]@+Thierry[/ol]
 

Robert

XLDnaute Barbatruc
Repose en paix
Re:=> Redif DEMO UserForm Génération Automatique

Bonsoir Laurent, Bonsoir Thierry,

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...'
 
L

LaurentG

Guest
Re:=> Redif DEMO UserForm Génération Automatique

Bonjour,

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...

Merci

Laurent
 

LaurentG

XLDnaute Occasionnel
Re:=> Redif DEMO UserForm Génération Automatique

voici le code que j'utilise :

Code:
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

Merci

Laurent
 
L

ludocavic

Guest
Re:=> Redif DEMO UserForm Génération Automatique

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é

Hasta luego

Ludo

Message édité par: ludocavic, à: 19/09/2005 17:40

Message édité par: ludocavic, à: 19/09/2005 18:04
 

LaurentG

XLDnaute Occasionnel
Re:=> Redif DEMO UserForm Génération Automatique

Merci beaucoup!

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 :

Code:
Sheets('Feuil1').Rows('numligne').EntireRow.Delete

Merci

Laurent
 

LaurentG

XLDnaute Occasionnel
Re:=> Redif DEMO UserForm Génération Automatique

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

Il m'affiche 'Numéro FAUX'.
Je ne comprends pas.

Vous avez une idée?

Merci

Laurent
 
L

ludocavic

Guest
Re:=> Redif DEMO UserForm Génération Automatique

Salut et bonjour

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??


Voila, jespere que tu t'en sortira

a+

Ludo

Message édité par: ludocavic, à: 20/09/2005 09:09
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 185
dernier inscrit
salhit