Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA: Appeller une textbox créée depuis le code

mememe

XLDnaute Nouveau
Bonjour à tous!

Tout d'abord, bonne et heureuse année à tous!
Je viens à vous pour un petit problème qui me turlupine!

En fait, j'ai créé des textbox dans un userform via ma macro, et je lui ai donné un nom.
Jusqu'ici, rien d'extraordinaire.

Quand je demande une liste des controls du userform avec un for....each..., mes textbox apparaissent avec le bon nom.

Mais quand je tape une valeur dans le userform et que j'essai de la récupérer via un userform.textbox11.value, il ne reconnait pas la textbox.

Quelqu'un pour m'aider?
D'avance merci, ça me bloque un peu...

Bonne soirée!



Code:
Public Sub CommandButton1_Click()
Dim obj As Object
Dim answer As String

For Each obj In Def_paroi.Controls
answer = answer & vbLf & obj.Name
Next

MsgBox answer

answer = (Def_paroi.textbox32.Value)


Unload Def_paroi

End Sub

Public Sub nombre_mur_change()

Dim valeur As Variant

Def_paroi.Hide
ReDim nb_mur_paroi(Def_paroi.nombre_mur.Value)
nb_mur_paroi(no_paroi) = Def_paroi.nombre_mur.Value
    
Dim Top, Lefti, Width, Height, i As Integer
Dim NumeroTextBox As Integer
Dim TextBoxName, labelname, labelcolonne As String

'supp^ression des textbox

Dim CTRL As Control
i = 0
For Each CTRL In Me.Controls
    If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.Label Then
            Me.Controls.Remove (i)
    Else
        i = i + 1
    End If
Next
    
Top = 70

Width = 50
Height = 20
NumeroTextBox = 1




Def_paroi.Height = 115


i = 1
test = False

While i <= 20 And i <= nb_mur_paroi(no_paroi)

       
 Def_paroi.Width = 260
 Lefti = 70
             Def_paroi.Height = Def_paroi.Height + 25
            
        labelname = "Paroi" & i
        Set labelparoi = Def_paroi.Controls.Add("Forms.label.1", labelname, True) 'Ouverture est le nom de ma fenetre
        
        Lefti = 50
        
        With labelparoi
        .Visible = True
        .Caption = "paroi " & i
        .Top = Top 'Definit la distance entre le bord de la fenetre et le bord du conteneur
        .Left = Lefti - 45 'Definit la distance entre le bord gauche de la fenetre et le bord du conteneur
        .Width = Width 'Definit la largeur de l'objet
        .Height = Height 'Definit la hauteur de l'objet
        .Font.Size = 10
        End With
        
            
            
            For j = 1 To 3
        
                TextBoxName = "textbox" & i & j
                Set TextBox = Def_paroi.Controls.Add("Forms.textbox.1", TextBoxName, True)  'Ouverture est le nom de ma fenetre
        
                With TextBox
                .Name = TextBoxName
                .Visible = True
                .Top = Top 'Definit la distance entre le bord de la fenetre et le bord du conteneur
                .Left = Lefti 'Definit la distance entre le bord gauche de la fenetre et le bord du conteneur
                .Width = Width 'Definit la largeur de l'objet
                .Height = Height 'Definit la hauteur de l'objet
                .Font.Size = 10
                End With
                
                
                labelcolonne = "Labelcolonne" & j
                Set labelcol = Def_paroi.Controls.Add("Forms.label.1", labelcolonne, True)  'Ouverture est le nom de ma fenetre
        
                With labelcol
                .Visible = True
                .Top = 50 'Definit la distance entre le bord de la fenetre et le bord du conteneur
                .Left = Lefti 'Definit la distance entre le bord gauche de la fenetre et le bord du conteneur
                .Width = Width 'Definit la largeur de l'objet
                .Height = Height 'Definit la hauteur de l'objet
                .Font.Size = 10
                End With
                
                If j = 1 Then
                    labelcol.Caption = "Coord. X"
                Else
                    If j = 2 Then
                        labelcol.Caption = "Coord. Y"
                            Else
                                labelcol.Caption = "Teta /X"
                            End If
                    End If
                
                
            Lefti = Lefti + 70
            
            Next j
 i = i + 1
Top = Top + 25
        
Wend


If i > 20 Then
Top = 70
 For i = 21 To nb_mur_paroi(no_paroi)
 
             Def_paroi.Width = 520
             Lefti = 320
        
        labelname = "Paroi" & i
        
        Set labelparoi = Def_paroi.Controls.Add("Forms.label.1", labelname, True) 'Ouverture est le nom de ma fenetre
                
        With labelparoi
        .Visible = True
        .Caption = "paroi " & i
        .Top = Top 'Definit la distance entre le bord de la fenetre et le bord du conteneur
        .Left = Lefti - 45 'Definit la distance entre le bord gauche de la fenetre et le bord du conteneur
        .Width = Width 'Definit la largeur de l'objet
        .Height = Height 'Definit la hauteur de l'objet
        .Font.Size = 10
        End With
        
            
            
            For j = 1 To 3
        
                TextBoxName = "textbox" & i & j
                Set TextBox = Def_paroi.Controls.Add("Forms.textbox.1", TextBoxName, True)  'Ouverture est le nom de ma fenetre
        
                With TextBox
                .Name = TextBoxName
                .Visible = True
                .Top = Top 'Definit la distance entre le bord de la fenetre et le bord du conteneur
                .Left = Lefti 'Definit la distance entre le bord gauche de la fenetre et le bord du conteneur
                .Width = Width 'Definit la largeur de l'objet
                .Height = Height 'Definit la hauteur de l'objet
                .Font.Size = 10
                End With
                
                
                labelcolonne = "Labelcolonne" & j
                Set labelcol = Def_paroi.Controls.Add("Forms.label.1", labelcolonne, True)  'Ouverture est le nom de ma fenetre
        
                With labelcol
                .Visible = True
                .Top = 50 'Definit la distance entre le bord de la fenetre et le bord du conteneur
                .Left = Lefti 'Definit la distance entre le bord gauche de la fenetre et le bord du conteneur
                .Width = Width 'Definit la largeur de l'objet
                .Height = Height 'Definit la hauteur de l'objet
                .Font.Size = 10
                End With
                
                If j = 1 Then
                    labelcol.Caption = "Coord. X"
                Else
                    If j = 2 Then
                        labelcol.Caption = "Coord. Y"
                            Else
                                labelcol.Caption = "Teta /X"
                            End If
                    End If
                                
            Lefti = Lefti + 70
            
            Next j
            
        Top = Top + 25
 
        
Next
End If


Def_paroi.Height = Def_paroi.Height - 25

Def_paroi.Show
'Def_paroi.nombre_mur.SetFocus

'MsgBox (Def_paroi.textbox32.Value)


End Sub
 

mememe

XLDnaute Nouveau
Re : VBA: Appeller une textbox créée depuis le code

C'est pas mon code cette fois

L'interet est de décaler les trois colonnes pour que les 20 lignes suivantes soient dans une deuxième colonne... c'est pas clair?

En gros, au dessus de 20lignes, le USF sort en bas de l'écran sur les petits écrans...
Donc, il faudrait créer une deuxième colonne...

Une idée?
 

James007

XLDnaute Barbatruc
Re : VBA: Appeller une textbox créée depuis le code

Merci pour ton explication ...

Mais je ne comprends pas tout : pourquoi la paroie 1 et la paroie 21 devraient avoir les mêmes trois coordonnées ...?

Ne faudrait-il pas tout doubler ...?

Avant de partir dans des calculs de modulo, pour décaler les labels ... mieux vaut être clair sur l'objectif final ...

P.S. a priori, je viens de faire un test sur un autre ordinateur ... c'est davantage 17 que 20 que tu devrais considérer comme limite pour les petits écrans ...

A +
 

mememe

XLDnaute Nouveau
Re : VBA: Appeller une textbox créée depuis le code

Les parois 21 et 1 n'auront pas les même coordonnées.
En fait, le numéro de la paroi va changer, et l'incrémentation du nom des textbox va continuer, ce seront donc des textbox différentes, avec des coordonnées de paroi différentes.

Dans le code qu'on m'a fourni, ca n'a pas été reprit, mais les textbox s'appelleront:

ligne 1 : textbox11 textbox12 textbox13
ligne 2: textbox21 textbox22 textbox23

A chaque fois, je concatene i et j pour former le nom de ma textbox.

C'est vraiment gentil de prendre du temps, merci!
 

James007

XLDnaute Barbatruc
Re : VBA: Appeller une textbox créée depuis le code

Merci ...

Voilà une explication claire et rassurante ... pour éviter d'aller ... dans le mur

Tu n'as plus qu'à décider du modulo qui va modifier le Left et le Top de tes Labels ...

A +
 

mememe

XLDnaute Nouveau
Re : VBA: Appeller une textbox créée depuis le code

Heu.... je vais me faire huer, mais c'est quoi un modulo?
Et je le mets où ce fameux bidule?

Il faut bien que je mette la condition du nombre de ligne avant le changement de colonne?
Et avec le code du fichier mememe.xls, je ne sais pas du tout où la mettre!

Je vais surement m'acheter un bouquin, histoire d'avoir les bases et d'éviter ce genre de questions à l'avenir!
 

James007

XLDnaute Barbatruc
Re : VBA: Appeller une textbox créée depuis le code

C'est plus simple que çà ... je viens de regarder ton code ...

Il te suffit de rajouter une condition dans ta boucle i pour Lbl et que
lorsque i > 20 , Left soit égal par exemple au Left de base + 40
et Top soit égal au Top de base - (25 * 20 )

A +
 

mememe

XLDnaute Nouveau
Re : VBA: Appeller une textbox créée depuis le code

Je ne sais pas si on parle du même code....
Ou alors, je suis vraiment naze

Code:
Private Sub CommandButton1_Click()
Dim ctl As Control
Dim liste As String
For Each ctl In Me.Controls
    liste = liste & vbLf & ctl.Name
Next
MsgBox liste

End Sub

Private Sub CommandButton2_Click()
MsgBox Me!TextBox11
'ou
'MsgBox Me.Controls("TextBox1")

End Sub

Public Sub NbMurs_change()
Dim ctl As Control, TLbl As Variant, Lbl As Control, NbLbl As Byte, NbTbx As Byte
For Each ctl In Me.Controls
    If TypeOf ctl Is MSForms.textbox Or TypeOf ctl Is MSForms.Label Then Me.Controls.Remove ctl.Name
Next
pos = Me.Top + (Me.Height / 2)
NbLbl = 1
NbTbx = 1
If NbMurs.ListIndex = -1 Then Exit Sub
TLbl = Array("Coord. X", "Coord. Y", "Teta /X", "Type paroi")
For i = LBound(TLbl) To UBound(TLbl)
    Set Lbl = Me.Controls.Add("forms.Label.1", "Label" & NbLbl)
    With Lbl
        .Object.Caption = TLbl(i)
        .Left = 50 + i * 55
        .Top = 50
        .Width = 50
        .Height = 12
        .TextAlign = 2
        NbLbl = NbLbl + 1
    End With
Next
For i = 1 To NbMurs
    Set Lbl = Me.Controls.Add("Forms.Label.1", "Label" & NbLbl)
    With Lbl
        .Object.Caption = "Paroi" & i
        .Left = 10
        .Top = 74 + (25 * (i - 1))
        .Width = 35
        .Height = 12
        .TextAlign = 1
        NbLbl = NbLbl + 1
    End With
    For j = 1 To 3
        Set Lbl = Me.Controls.Add("Forms.TextBox.1", "TextBox" & i & j)
        With Lbl
            .Left = 50 + (55 * (j - 1))
            .Top = 70 + (25 * (i - 1))
            .Width = 50
            .Height = 18
            NbTbx = NbTbx + 1
            Haut = .Top
        End With
    Next
Next

Me.Height = Haut + 50
Me.Top = pos - (Me.Height / 2)

End Sub

Private Sub UserForm_Activate()
Dim i As Integer
For i = 1 To 40
NbMurs.AddItem i
Next i
 

James007

XLDnaute Barbatruc
Re : VBA: Appeller une textbox créée depuis le code

Re,

Dans ta boucle : For i = 1 To NbMurs
tu as ensuite une section : With Lbl
qui te sert à la création de tes Labels
et c'est là que se trouve .Left et .Top

Corriges moi si je dis une bêtise ... mais ce sont bien ces deux valeurs que tu cherches à modifier depuis le début ....

A +
 

James007

XLDnaute Barbatruc
Re : VBA: Appeller une textbox créée depuis le code

Oui, et aussi la largeur du USF.

Je dois recréer 2 variable non?
Une pour le left de lbl et l'autre pour le left des txtbox? non?

Tu as raison ... puisque tout se décale sur la gauche de 40 ...
L'idéal serait même d'espacer tous tes contrôles depuis un point fixe en haut à droite ...
Tu peux te lancer dans le code ou attendre ...
Car Kjin est un vrai magicien ...

A +
 

mememe

XLDnaute Nouveau
Re : VBA: Appeller une textbox créée depuis le code

Car Kjin est un vrai magicien ...

Oui, j'avoue....
Vous me rendez bien service.

J'aurais une autre question pratique, en attendant kjin!
Je souhaite ensuite déclarer x murs par paroi, et x panneaux par murs.
Le plus simple est de faire un USF dynamique par étape?

Sachant que je compte ensuite incrémenter 3 tableaux:
Un paroi, un mur et un panneau

une question, quand on cache le userform (par .Hide), les valeurs sont conservées?
Jusqu'à quand?
 

kjin

XLDnaute Barbatruc
Re : VBA: Appeller une textbox créée depuis le code

Re, salut James ,
Ton fichier réadapté en PJ

Edit : j'oubliais...les TextBoxes se nomment dorénavant TexBox1_1, TextBox1_2, TextBox1_3 pour Paroi1...etc

Je souhaite ensuite déclarer x murs par paroi, et x panneaux par murs.
Le plus simple est de faire un USF dynamique par étape?
Sachant que je compte ensuite incrémenter 3 tableaux:
Un paroi, un mur et un panneau
Pas vraiment compris
une question, quand on cache le userform (par .Hide), les valeurs sont conservées?
Jusqu'à quand?
Oui, jusqu'au déchargement du formulaire
A+
kjin
 

Pièces jointes

  • mememe_v2.zip
    12 KB · Affichages: 41
Dernière édition:

mememe

XLDnaute Nouveau
Re : VBA: Appeller une textbox créée depuis le code

Ho my god.

C'est génial, merci beaucoup, vraiment! c'est gentil d'aider les débutants!

Pour le bidule que j'ai mal expliqué:

Je souhaite dire après avoir renseigné les parois que la paroi(i) comporte n murs, qui eux même comportent n panneaux.
J'aurais aimé faire un seul userform, mais ça risque d'être très compliqué vu mon niveau.

Qu'en pensez vous?
Une boucle qui fait renseigner le nombre de mur pour chaque paroi, puis une boucle pour le nombre et les dimensions des parois pour chaque mur?
Ou un seul USF c'est gérable?

Et merci encore, surtout!
 

Discussions similaires

Réponses
0
Affichages
352
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…