Dynamisch erstellte (Textboxen oder andere Steuerelemente) ansprechen

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Abisana.

    Dynamisch erstellte (Textboxen oder andere Steuerelemente) ansprechen

    Hallo zusammen,

    Kann mir jemand weiterhelfen, wie ich dynamisch erstellte Textboxen ansprechen kann?
    Habe ein Sub geschreiebn bei dem bei jedem Klick auf einen Button eine Textbox erstellt wird.
    Wenn ich dann beim abschicken des Formulars beispielsweise 4 Textboxen habe, möchte ich den Inhalt irgendwo wieder geben zb in einer anderen Textbox...
    Wie kann ich die erstellten Textboxen ansprechen? Habe denen beim generieren einen Namen gegeben, aber Excel kann damit nix anfangen.

    Bitte um Rat.

    Visual Basic-Quellcode

    1. Public klick As Integer
    2. Sub addAsExpense_Click()
    3. Dim exp As MSForms.TextBox
    4. Dim exp_value As MSForms.TextBox
    5. klick = klick + 1
    6. Set exp = StartForm.Controls.Add("Forms.TextBox.1") ' add textbox
    7. With exp ' set parameter
    8. .Left = 12 ' position left side
    9. .Width = 138 ' width
    10. .Top = klick * 24 + 270 ' Startposition + (klick) sum of all already pasted boxes
    11. .Value = StartForm.epensesBox.Value ' take description value (what kind of expenses)
    12. .BackColor = &H80FFFF ' color choosen
    13. .Name = "exp" & (klick) ' name of the created textbox
    14. End With
    15. StartForm.testbox.Value = StartForm.exp(klick).Value
    16. End Sub
    -.- sry hab zuspät gesehen das es Excel ist -.-

    VB.NET-Quellcode

    1. Private TextBoxen As List(Of MSForms.TextBox)
    2. Private Count As Integer = 0
    3. Sub addAsExpense_Click
    4. Count += 1
    5. Dim exp As New MSForms.TextBox() With {
    6. .Width = 138,
    7. .Left = 12,
    8. .Top = Count * 24 + 270,
    9. .Value = StartForm.epensesBox.Value,
    10. .BackColor = &H80FFFF,
    11. .Name = "exp" & (Count)
    12. }
    13. TextBoxen.Add(exp)
    14. Controls.Add(exp)
    15. End Sub
    16. Sub Senden()
    17. Dim txt As New StringBuilder()
    18. TextBoxen.ForEach(Sub(x) txt.AppendLine(x.Text))
    19. Dim outtxt As String = txt.ToString()
    20. End Sub


    ja so ähnlich
    Hallo Abisana,
    eine Variable besser nicht exp nennen, das ist
    ein reserviertes Basicwort. Du musst ein Array
    für die Textboxen anlegen und kannst sie dann
    darüber ansprechen. Hier der geänderte Code:

    Visual Basic-Quellcode

    1. Public klick As Integer
    2. Public expenses() As MSForms.TextBox
    3. Private Sub UserForm_Initialize()
    4. ReDim expenses(0)
    5. End Sub
    6. Sub addAsExpense_Click()
    7. 'Dim exp_value As MSForms.TextBox
    8. klick = klick + 1
    9. ReDim Preserve expenses(klick)
    10. Set expenses(klick) = StartForm.Controls.Add("Forms.TextBox.1") ' add textbox
    11. With expenses(klick) ' set parameter
    12. .Left = 12 ' position left side
    13. .Width = 138 ' width
    14. .Top = klick * 24 + 270 ' Startposition + (klick) sum of all already pasted boxes
    15. .Value = StartForm.epensesBox.Value ' take description value (what kind of expenses)
    16. .BackColor = &H80FFFF ' color choosen
    17. .Name = "expenses" & (klick) ' name of the created textbox
    18. End With
    19. StartForm.testbox.Value = expenses(klick).Value
    20. End Sub
    Gruss,

    Neptun
    Hallo Zusammen,

    vielen Dank für eure Posts,
    Mit der Antwort von Facebamm konnte ich als Neuling leider nicht viel anfangen, da ich keins der Befehle im Sub Senden verstehe ;(
    Zur Antwort von Neptun, erstmal Danke für die Erklärung bezüglich exp ! (sehr hilfreich für mich)
    Die Antwort von Neptun habe ich mal im Programm eingepfleft, doch hier wird in der Zeile

    Visual Basic-Quellcode

    1. Public expenses() As MSForms.TextBox

    Ein Fehler von Excel angezeigt
    "Benutzerdefinierte Datenfelder sind als Public-Elemente von Objektmodulen nicht zugelassen"
    Da ich die abfrage der Werte aber in einer anderen Funktion oder Sub (Formular absenden Button) abfragen möchte, werde ich das expenses() Array als public benötigen.
    So wie ich über google herausfinden konnte ist das problem mit Klassen zu lösen? daher werde mich mal in nächster Zeit mit dem Thema Klassen beschäftigen müssen.
    Hallo Neptun,
    Ich hab scheinbar irgendwas falsch eigetippt gehabt, jetzt funktioniert der Code!

    Visual Basic-Quellcode

    1. Public klick As Integer
    2. Public WithEvents expenses As MSForms.TextBox
    3. Private Sub UserForm_Initialize()
    4. ReDim expenses(0)
    5. klick = 0
    6. End Sub
    7. Sub addAsExpense_Click()
    8. klick = klick + 1
    9. ReDim expenses(klick) ' Preserve
    10. Set expenses(klick) = StartForm.Controls.Add("Forms.TextBox.1") ' add textbox
    11. With expenses(klick) ' set parameter
    12. .Left = 12 ' position left side
    13. .Width = 138 ' width
    14. .Top = klick * 24 + 270 ' ' Startposition + (klick) sum of all already pasted boxes
    15. .Value = StartForm.epensesBox.Value ' take description value (what kind of expenses)
    16. .BackColor = &H80FFFF ' color choosen
    17. .Name = "expenses" & (klick) ' name of the created textbox
    18. End With
    19. StartForm.testbox.Value = expenses(klick).Value
    20. End Sub


    Das einzige Problem ist, dass ich eine Fehlermeldung: Fehler beim Kompelieren: Variable nicht Definiert bekomme, wenn ich Preserve in der Zeile 11 Benutze:

    Visual Basic-Quellcode

    1. ReDim Preserve expenses(klick)

    Ohne das Preserve funktioniert der Code, bzw er lässt sich Ausführen, das Array wird jedoch bei jedem durchgang gelöscht und somit habe ich keinen zugriff mehr auf die erstellten Textboxen, wenn ich später mit einem anderen (Führe aus button) arbeiten möchte.
    Jemand eine Idee warum es ohne preserve funktioniert und mit nicht?