2016-12-11 2 views
0

Ich erstelle dynamisch eine Benutzerform namens UserForm1. Darin erzeuge ich Textfelder, die manuell von einem Benutzer ausgefüllt werden. Danach möchte ich ihren Wert lesen, aber ich weiß nicht, wie ich die (Wert der) Textbox aufrufen soll.Syntax, um dynamisch benannte Textfeld in Benutzerformular in VBA Excel zu lesen?

Der folgende Code wird verwendet, um die Textfelder zu erstellen und benennen:

With UserForm1 'scaling userform 
    .Height = max_width 
    .Width = 600 
End With 

For test1 = 1 To nr_of_zeros + 1 'create textboxes 
    Set ctextbox = Controls.Add("forms.textbox.1", test1) 'creating textbox 
    With ctextbox 'scaling textbox 
     .Height = 20 
     .Width = 40 
     .Top = 40 + 25 * test1 
     .Left = 400 
    End With 

Also das Feld wird den Namen der Nummer haben von test1 (integer oder lang?).

Ich habe versucht die folgenden Sätze zu versuchen, den Wert der Textbox zu lesen in: absorb_text aber bisher nicht erfolgreich. Kennt jemand den korrekten vollständigen Weg, um die oben erstellte Textbox aufzurufen?

'ctextbox.name = Controls.Add("forms.textbox.1", test1) 'creating textbox 
    'absorb_text = forms("textbox").Controls(test1).Value 

    'absorb_text = forms.("UserForm1").textbox.(test1).value 
    forms.textbox.1.(test1) 
    strname = TextBox1(test1).Text 

.range("A2") 

aber mit

Thisworkbook.worksheets("sheetname").range("A2").text 
Thisworkbook.worksheets("sheetname").range("A2").value 
Thisworkbook.worksheets("sheetname").cells(2,1).text 
Thisworkbook.worksheets("sheetname").cells(2,1).value 

Vielen Dank (Analog, muss man nicht Zelle "A2" von nennen)! Ich habe mich immer noch gewundert, warum/was die 1 in "forms.textbox.1" tut Ich kopierte es, weil es funktionierte, aber bin durch seine Funktion verwirrt.

Auch im Lichte Ihrer Diskussion unten: Ich glaube, technisch sucht der Code nicht nach einem Kontrollnamen, der gleich ist/a Nummer 1, sondern zu einem String-Zeichen, das das Zeichen 1 gleich ist. Daher ist es nicht gleich einer Zahl, sondern ein Zeichen.

* Argument dagegen ist, dass es immer noch funktioniert mit: `Wenn ctrl.Name = 1 Dann 'in diesem Fall würde ich denken, dass die 1 als eine Zahl behandelt wird.

+0

versuchen, den Code in meine Antwort unten –

Antwort

2

Wenn Sie erstellt Ihre TextBox es in Ihrem Code Zeile: Set ctextbox = Controls.Add("forms.textbox.1", test1) die Namen Ihrer Textfelder 1, 2, 3 usw.

Um Ihre TextBox es zu lesen (zur Laufzeit erstellt) I Durchlaufen Sie alle Steuerelemente des User_Form, überprüfen Sie, ob es sich um den Typ TextBox handelt, und überprüfen Sie die Eigenschaft Name des Controls.

-Code

Option Explicit 

Private Sub ReadRunTimeTextBox() 

Dim ctrl   As Control 
Dim absorb_text  As String 

' loop through all control in user form 
For Each ctrl In Me.Controls 
    ' check if control is type TextBox 
    If TypeName(ctrl) = "TextBox" Then 
     ' if control name is 1 (first created TextBox in your array) 
     If ctrl.Name = "1" Then 
      absorb_text = ctrl.Text 

      ' the message box is for debug only 
      MsgBox absorb_text 
     End If 
    End If 
Next ctrl 

End Sub 
+1

@ThomasInzina versuchen diesen Code ausgeführt wird, es funktioniert gut –

+0

Ich hoffe, dass Sie meine Entschuldigung akzeptieren. Kommentar zurückgezogen –

+0

@ThomasInzina LOL, nur wenn du +1 :) –

1

Hier sind zwei weitere Möglichkeiten, um verweisen die dynamische Steuerung hinzugefügt

Const nr_of_zeros = 4 
For test1 = 1 To nr_of_zeros + 1 'create textboxes 
    Debug.Print Controls(test1) 
Next 

Debug.Print Me![1] 
Debug.Print Me![2] 
Debug.Print Me![3] 
Debug.Print Me![4] 
Verwandte Themen