Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Userform Textfeld-Namen mit Schleife ansprechen

Userform Textfeld-Namen mit Schleife ansprechen
19.02.2009 10:17:00
Uwe
Hi Forum,
ich hab die Frage schon mal vor einiger Zeit eingestellt - leider ohne Ergebnis
(abgesehen von ein paar sehr netten Reisstipps).
Es sollen Werte aus einem Array mehreren Textboxen zugewiesen werden. Die
Textboxen heißen txt1, txt2, ..., txtn. Vorgestellt habe ich mir in etwa Folgendes:
for i = 1 to n
userform.txt(i).value=array(i)
next i
Da der Name der Textbox natürlich keine Integer-Variable ist kann das aber gar nicht funktionieren
(jeden falls läuft der Code so nicht). Auch mein Versuch über eine Variable mit
for i = 1 to n
Variable = txt & i
usreform.variable.value = array(i)
next i
funktionierte leider nicht.
Herzlichen Dank im voraus
Uwe
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform Textfeld-Namen mit Schleife ansprechen
19.02.2009 10:29:00
Oberschlumpf
Hi Uwe
Versuch es so:

Sub sbTxtFill()
Dim lctrTxt As Control, liZaehler As Integer
liZaehler = 1
For Each lctrTxt In UserForm.Controls
If LCase(TypeName(lctrTxt)) = "textbox" Then
lctrTxtCmb.Text = Str(liZaehler)
liZaehler = liZaehler + 1
End If
Next
End Sub


Für UserForm musst du den Namen deines Userforms eintragen.
Hilfts?
Ciao
Thorsten

Anzeige
AW: Userform Textfeld-Namen mit Schleife ansprechen
19.02.2009 10:45:00
Uwe
Hallo Thorsten,
habe mich mit Controls noch nicht auseinander gesetzt aber die Schleife
For Each lctrTxt In UserForm.Controls
ergibt für lctrTxt immer den Wert "".
Es gibt in der Userform auch m.E. keine Controls (außer in meinem Falle einen OK-Button,
der dann den Wert "False" für lctrTxt ausgibt).
Angesprochen werden müssen die TextBoxen, denen dann Werte zugewiesen werden.
Tschüß
Uwe
Anzeige
AW: Userform Textfeld-Namen mit Schleife ansprechen
19.02.2009 10:52:00
Oberschlumpf
Hi Uwe
Sorry, eine Zeile aus meinem Originalcode vergaß ich anzupassen.
Ändere diese Zeile

lctrTxtCmb.Text = Str(liZaehler)


um in


lctrTxt.Text = Str(liZaehler)


Zitatauszug:
...Es gibt in der Userform auch m.E. keine Controls...
Alles, was du in einem Userform siehst, ist ein Control.
Egal, ob Button, Listbox, Frame, Textbox, Label,... es handelt sich immer um Controls.
Und...es heißt....das Userform(ular) und nicht die Userformular.
Funzt mein Code jetzt?
Ciao
Thorsten

Anzeige
AW: Userform Textfeld-Namen mit Schleife ansprechen
19.02.2009 11:07:00
Uwe
Hi Thorsten,
danke für die Belehrung (aber da "Form" im Sinne eines Behältnisses zur Aufnahme weiterer Inhalte ebenso möglich wäre könnte man darüber, da es auch im Englischen nicht spezifiziert ist, notfalls streiten - was ich aber nicht vor habe :-))
Die Änderung der Code-Zeile brachte übrigens nicht den gewünschten Erfolg, da ja, wie gesagt, lctrTxt immer "" ist und damit die Eingangsbedingung
If LCase(TypeName(lctrTxt)) = "TextBox" Then
niemals erfüllt wird (hätte ich vielleicht vorhin noch erwähnen sollen).
Daher kam auch die Irritation mit den Controls.
p.s.: Liege ich richtig, dass der TypeName der Name der TextBox ist?
Viele Grüße
Uwe
Anzeige
AW: Userform Textfeld-Namen mit Schleife ansprechen
19.02.2009 11:32:00
Oberschlumpf
Hi Uwe
Steht nun in deinem Code anstelle von

If LCase(TypeName(lctrTxt)) = "textbox" Then 


wirklich


If LCase(TypeName(lctrTxt)) = "TextBox" Then 


?
Wenn ja, musst du TextBox in textbox zurück ändern.
Denn LCase wandelt den in TypeName enthaltenden Wert in Kleinbuchstaben um.
Und Test ist nun mal nicht test ;-)
Oder TextBox ist auch nicht textbox.
Meinen Code habe ich getestet und er funktioniert.
Bei 6 Controls (3 Textboxen, 3 Labels) erhalten die Textboxen nacheinander die Werte 1 - 3.
Die TypeName-Funktion gibt eine Zeichenfolge zurück, die Informationen über eine Variable enthält
Im aktuellen Fall wird der Controltyp zurückgegeben.
Weitere Infos findest du in der Excel-Hilfe.
Bin neugierig, ob nach Änderung von TextBox in textbox nun der Code auch bei dir funzt.
Ciao
Thorsten

Anzeige
AW: Userform Textfeld-Namen mit Schleife ansprechen
19.02.2009 11:39:00
Uwe
Hi Thorsten,
hatte jetzt mal 10 Minuten. Dein Vorschlag hat mich auf die Lösung gebracht:

Sub sbTxtFill()
Dim lctrTxt As Control, liZaehler As Integer
liZaehler = 1
For Each lctrTxt In UserForm1.Controls
If InStr(1, lctrTxt.Name, "TextBox") Then
lctrTxt.Value = Str(liZaehler)
liZaehler = liZaehler + 1
End If
Next
UserForm1.Show
End Sub


Damit habe ich mein Grundgerüst...
Danke
Uwe

Anzeige
freut mich...owT
19.02.2009 11:52:00
Oberschlumpf
;
Anzeige
Anzeige

Infobox / Tutorial

Userform Textfeld-Namen mit Schleife ansprechen


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  2. Erstelle ein Userform: Füge ein neues Userform hinzu, indem du mit der rechten Maustaste auf "VBAProject" in der Projektansicht klickst und "Einfügen" > "UserForm" wählst.

  3. Füge Textboxen hinzu: Ziehe mehrere Textboxen (z.B. TextBox1, TextBox2, ...) auf das Userform.

  4. Füge einen Button hinzu: Füge einen Button hinzu, um den Code auszuführen.

  5. Füge den VBA-Code ein: Klicke doppelt auf den Button und füge den folgenden Code ein:

    Sub sbTxtFill()
       Dim lctrTxt As Control, liZaehler As Integer
       liZaehler = 1
       For Each lctrTxt In UserForm1.Controls
           If InStr(1, lctrTxt.Name, "TextBox") Then
               lctrTxt.Value = Str(liZaehler)
               liZaehler = liZaehler + 1
           End If
       Next
       UserForm1.Show
    End Sub
  6. Führe das Userform aus: Klicke auf "Run" (F5), um dein Userform anzuzeigen. Klicke dann auf den Button, um die Textboxen mit Werten zu befüllen.


Häufige Fehler und Lösungen

  • Fehler: lctrTxt gibt immer "" aus: Stelle sicher, dass du die richtige Userform und die Textboxen hinzugefügt hast. Überprüfe, ob die Textboxen korrekt benannt sind und im Code korrekt referenziert werden.

  • Fehler: TypeName gibt nicht "TextBox" zurück: Achte darauf, dass du den Groß-/Kleinschreibung beim Vergleich in der If-Bedingung beachtest. Verwende LCase(TypeName(lctrTxt)) für den Vergleich.

  • Fehler: Userform zeigt sich nicht: Stelle sicher, dass dein Userform korrekt initialisiert und angezeigt wird.


Alternative Methoden

  • Direkte Zuweisung über Index: Statt mit einer Schleife kannst du die Textboxen direkt ansprechen, wenn du weißt, wie viele es sind:

    UserForm1.TextBox1.Value = "Wert1"
    UserForm1.TextBox2.Value = "Wert2"
  • Verwendung von Arrays: Speichere die Werte in einem Array und weise sie dann den Textboxen zu.


Praktische Beispiele

Nehmen wir an, du hast 3 Textboxen (TextBox1, TextBox2, TextBox3). Der folgende Code weist diesen Textboxen die Werte 1 bis 3 zu:

Sub sbTxtFill()
    Dim lctrTxt As Control, liZaehler As Integer
    liZaehler = 1
    For Each lctrTxt In UserForm1.Controls
        If InStr(1, lctrTxt.Name, "TextBox") Then
            lctrTxt.Value = liZaehler
            liZaehler = liZaehler + 1
        End If
    Next
End Sub

Tipps für Profis

  • Verwende Option Explicit: Füge am Anfang deines Moduls Option Explicit hinzu, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.

  • Verwende Debug.Print: Nutze Debug.Print, um Werte während der Ausführung zu überprüfen und Fehler leichter zu identifizieren.

  • Testen: Teste deinen Code in einer isolierten Umgebung, bevor du ihn in ein größeres Projekt integrierst.


FAQ: Häufige Fragen

1. Frage
Warum wird die Bedingung If LCase(TypeName(lctrTxt)) = "textbox" nicht erfüllt?
Antwort: Stelle sicher, dass du den Text genau so schreibst, wie er im TypeName zurückgegeben wird. Achte auf die Groß- und Kleinschreibung.

2. Frage
Wie kann ich die Anzahl der Textboxen dynamisch ermitteln?
Antwort: Du kannst eine Zählvariable verwenden, die bei jedem Durchlauf um eins erhöht wird, wenn eine Textbox gefunden wird, oder einfach die Anzahl der Controls im Userform zählen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige