Sub _change à nom variable
Bonjour à tous,
Je travaille sur un UserForm et sur une de mes pages de cet UserForm, j'ai une TextBox qui, quand on en change la valeur (TextBox_Change), créé autant de TextBox que la valeur renseignée. Ces nouvelles TextBox sont ainsi nommées "Bat1", "Bat2", etc. Je souhaite maintenant, sur le même principe, renseigner le nombre d'étage de chaque bâtiment et créer autant de TextBox ("Bat1E1", "Bat1E2", etc.).
Mon problème est donc que pour utiliser l'événement TextBox_Change, j'ai besoin de connaître le nom de la TextBox concernée, mais je ne peux pas savoir à l'avance combien j'en aurais. J'aimerais donc savoir s'il existait un moyen de faire quelque chose comme "Bat"i_Change et avoir donc un événement qui s'adapte à une variable.
En espérant avoir été assez clair,
bonjour,
pour cela il faut utiliser des modules de classe.
Merci. Ne connaissant absolument pas le fonctionnement des classes, je vais me renseigner.
Après recherches, j'ai l'impression que je devrais me diriger vers ce genre de code mais j'ai du mal à comprendre ce qu'il fait exactement et donc si c'est bien ce que je recherche.
Public Parent As MSForms.UserForm
Public WithEvents TBx As MSForms.TextBox
Private Sub TBx_Change()
Parent.TBx_Change Me
End SubPourriez vous m'éclairer svp ?
bonjour,
tu peux t'inspirer de ceci, en anglais
Merci, j'ai pu commencer à trouver une solution.
Mon module de classe :
Option Explicit
Private WithEvents mTbo As MSForms.TextBox
Sub Init(Item As MSForms.TextBox)
Set mTbo = Item
End Sub
Public Sub mTbo_Change()
Dim cont As Control
Dim cont2 As Control
Dim nbEtage As Integer
If mTbo.Value = "" Then
nbEtage = 0 'mise à jour si nul
Else
nbEtage = mTbo.Value
End If
Fenetre_Creation.MultiPage1.Value = 1
For k = 1 to nbBat 'Variable définie précédemment et qui permet d'indicer les bâtiments
For j = 1 To nbEtage ' nb de txtbox à créer, renseigné par l'utilisateur
Set cont = Fenetre_Creation.CadreBat.Controls.Add("Forms.TextBox.1") ' ecriture des box suivant nombre
With cont
.Name = "Bat" & k & "Etage" & j
.Height = 20
.Width = 80
.Left = 40 + (j - 1) * 100
.Top = 125
.BackColor = RGB(0 + j * 20, 60, 255) 'Couleur de fond
End With
'idem pour une deuxièmpe rangée de TextBox
Set cont2 = Fenetre_Creation.CadreBat.Controls.Add("Forms.TextBox.1")
With cont2
.Name = "LgtsBat" & k & "Etage" & j
.Height = 20
.Width = 80
.Left = 40 + (j - 1) * 100
.Top = 155
.BackColor = RGB(0 + j * 40, 200, 200) 'Couleur de fond
End With
Next
Next
End SubComme les TextBox qui permettent de créer celles décrites au dessus dépendent elles-mêmes d'une autre valeur, elles n'existent pas à l'initialisation de la TextBox. J'aimerais les soumettre au module de classe dès leur création mais je me retrouve face à des erreurs.
Partie du code concernée :
Private Sub NbreBat_Change()
Dim ctrl25 As Control
Dim nbBat As Integer
Dim mTbos As Collection
Dim c As MSForms.Control
Dim tbo As ManagedTBO
Set mTbos = New Collection
Fenetre_Creation.CadreBat.Controls.Clear
If NbreBat.Value = "" Then
nbBat = 0
Else
nbBat = NbreBat.Value
End If
Fenetre_Creation.MultiPage1.Value = 1
For i = 1 To nbBat
Set ctrl25 = Fenetre_Creation.CadreBat.Controls.Add("Forms.TextBox.1")
With ctrl25
.Name = "EBat" & i
.Height = 20
.Width = 120
.Left = 200
.Top = 100 + (i - 1) * 80
.BackColor = RGB(0 + i * 40, 0, 160) 'Couleur de fond
End With
ctrl25.Select
Set tbo = New ManagedTBO
tbo.Init ctrl25
mTbos.Add tbo
Next
End SubManagedTBO étant le nom de mon module de classe.
Merci d'avance pour votre aide,