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

Forumthread: Textbox & Variable

Textbox & Variable
20.10.2004 14:45:22
Franz
Hallo Fachleute,
ich habe mehrere Textboxen in einer UF zu bearbeiten:
TextBox1 = ...
TextBox2 = ...
TextBox3 =
TextBox4 =
TextBox5 =
TextBox6 =
...
...
...
...
Lässt sich das auch irgendwie mit einer Schleife variabel schreiben, so ähnlich wie:

Sub test
For i = 1 to 17
TextBox & i = ...
next
End Sub

So wie's ich geschrieben habe, geht's leider nicht, das gibt 'nen Syntaxfehler. Könnt ihr mir da bitte helfen?
Vielen Dank und Grüße
Franz
Anzeige

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Textbox & Variable
Ramses
Hallo Franz
schon knapp dran:
For i = 1 to 17
Me.Controls("TextBox" & i) = "Eintrag"
next i
Gruss Rainer
Danke!! ... und noch ne Zusatzfrage
20.10.2004 15:14:47
Franz
Hallo Rainer,
besten Dank, klappt natürlich :-)) !! Und während des Probierens ist mir noch was eingefallen: Die Anzahl der Textboxen wird sich noch ändern, sie werden jedoch immer in diese Schleife reinpassen. Gibt es die Möglichkeit, die Zahl der Textboxen in einer UF zu zählen, à la:
For i = 1 to Me.Controls(TextBox...).Count
Danke schon mal und Grüße
Franz
P.S.: werd grad weggerufen, kann erst später wieder antworten..... :-((
Anzeige
AW: Danke!! ... und noch ne Zusatzfrage
Ramses
Hallo Franz
da musst du einen internen Zähler aktivieren
Dim n as Integer
n=0
For n = 1 to Me.Controls.Count
If Left(Me.Controls(n).Name,7) = "Textbox" Then
n = n + 1
End If
next
For i = 1 to n
Me.Controls("TextBox" & i) = "Eintrag"
next i
Ungetestet,... sollte aber tun ;-)
Gruss Rainer
Anzeige
Leider noch nicht...
20.10.2004 17:02:59
Franz
Hallo Rainer,
hab den Code geringfügig geändert, um ihn besser zu kapieren:
Dim n As Integer, m As Integer
m = 0
For n = 1 To Me.Controls.Count
MsgBox Me.Controls(n).Name, , "Name-Control"
If Left(Me.Controls(n).Name, 7) = "Textbox" Then
m = m + 1
MsgBox m, , "Zähler"
End If
Next
- m wird nicht hochgezählt; hab festgestellt, dass er penibel ist mit der Rechtschreibung. Habe "Textbox" geändert in "TextBox", jetzt nimmt er es
- habe mit der ersten MsgBox festgestellt, dass er die Controls nicht in der Reihenfolge nimmt, in der sie in "Ansicht - Aktivierreihenfolge" angeordnet sind. Und das auch nicht bei den TExtboxen, obwohl die sauber von 1 - 7 sortiert sind.
- und nun der Fehler: momentan sind 18 Controls (insgesamt) in der UF, wobei eines davon ein doppeltes ist: eine Combobox in einem Frame. Das wird als 1 angezeigt. Gezählt werden aber beide Teile extra. Also kommt er bei "Me.Controls.Count" auf "19". Aber bei "n = 19" kommt bei der Zeile
" If Left(Me.Controls(n).Name, 7) = "Textbox" Then " die Fehlermeldung "Ungültiges Argument" (bzw schon eine Zeile vorher bei der Msgbox). Irgendwo besteht da Uneinigkeit: sind es nun 18 oder 19 ?!?
Falls du es dir mal anschauen willst, hier mal die Datei (baut auf einem Beispiel von P@ulchen auf:
https://www.herber.de/bbs/user/12377.xls
Grüße
Franz
Anzeige
AW: Leider noch nicht...
Ramses
Hallo Franz
Das mit der Gross- Kleinschreibung ist richtig,... habe ich vergessen :-)
Die Zählung "Controls.Count" hat nichts mit der Aktivierreihenfolge oder mit der Nummerierung zu tun, sondern EXCEL zählt intern die Controls in der Reihenfolge durch, wie sie in die UF eingefügt worden sind.
Kein Workaround dafür.
Das mit dem Frame ist tatsächlich so. Das Frame wird als eigener Container behandelt und die Objecte im Container musst du extra zählen.
Z.B.
For n = 1 To Me.Controls.Count
If InStr(1, Me.Controls(n).Name, "Frame") &gt 0 Then
For j = 1 To Me.Controls(n).Controls.Count
If Left(Me.Controls(n).Name, 7) = "TextBox" Then
m = m + 1
End If
Next j
End If
If Left(Me.Controls(n).Name, 7) = "TextBox" Then
m = m + 1
End If
Next n
Trotzdem musst du sicherstellen, dass die Textboxen dann von entsprechend der Anzahl benannt sind, TextBox1 TextBox2 usw.
Gruss Rainer

Anzeige
Sorry, noch nicht
20.10.2004 21:23:44
Franz
Hallo Rainer,
leider noch dasselbe: n geht bis 19, und dann kommt wieder die Fehlermeldung. Hoffe ich hab nix Wichtiges unterschlagen bei der Problembeschreibung. Hab sicherheitshalber noch mal die Datei angehängt:
https://www.herber.de/bbs/user/12419.xls
Grüße und danke für dein Bemühen!
Franz
Anzeige
Doch, doch...
Ramses
Hallo Franz
Hau Ruck und nicht schön
On Error Resume Next
vor die n-Schleife setzen.
Die Textboxen sprichst du dann ja sowieso mit "m" an ;-)
Alternativ kannst du auch in der j-Schleife für jedes gefundene Control von n 1 subtrahieren :-)
Aber das ist mühsam.
Gruss Rainer
Anzeige
Hmm...
20.10.2004 21:56:18
Franz
Hallo Rainer,
damit hab ich auch schon rumprobiert, komm aber auf nix Gscheites. Falls ich's richtig gesetzt habe, wie du es meinst, ergibt es trotz 7 TextBoxes m = 9 ?!?!?

Sub test
Dim n As Integer, j As Integer, m As Integer
m = 0
On Error Resume Next
For n = 1 To Me.Controls.Count
'MsgBox Me.Controls(n).Name
If InStr(1, Me.Controls(n).Name, "Frame") > 0 Then
For j = 1 To Me.Controls(n).Controls.Count
If Left(Me.Controls(n).Name, 7) = "TextBox" Then
m = m + 1
End If
Next j
End If
If Left(Me.Controls(n).Name, 7) = "TextBox" Then
m = m + 1
End If
Next n
On Error GoTo 0
MsgBox m
End Sub

Grüße
Franz
Anzeige
AW: Hmm...
ypsilon
hi Franz,
meinst du so ?
bestimmt auch nicht besonders hübsch aber funktioniert ;-)
Dim m As Integer, x As Integer, y As Integer
x = Me.Controls.Count
Do While y If InStr(1, Me.Controls(y).Name, "Frame") > 0 Then
x = x - 1
End If
If Left(Me.Controls(y).Name, 7) = "TextBox" Then
m = m + 1
End If
y = y + 1
Loop
MsgBox m, , "Zähler"
cu Micha
Anzeige
AW: Hmm...
20.10.2004 22:52:14
Franz
Hi Micha,
"bestimmt auch nicht besonders hübsch" : bin ja glücklicherweise gar nicht so recht in der Lage, das zu beurteilen :-)). Aber funktionieren tut's, bin begeistert, besten Dank!! (wenngleich mich schon interessiert hätte, warum das von Rainer nicht ganz tut. Vielleicht lern ich's ja mal...)
Danke und Grüße
Franz
P.S.: war diesen Sommer doch nicth in Berlin, schon gemerkt, oder ;-)))
Anzeige
AW: Hmm...
yps
...das rückwärtslaufen war dir bestimmt zu anstrengend ;-)
aber münchen zum oktoberfest soll ja auch ganz hübsch anstrengend sein *immernochkopfschmerzenhab*
cu Micha
AW: Hmm...
20.10.2004 23:02:32
Franz
jaja, da muss man schon frühzeitig mit dem Üben anfangen... *g*
Franz
Etwas eleganter... :-)
Ramses
Hallo Franz

Private Sub CommandButton1_Click()
Dim m As Integer
Dim ctrChk As Control
m = 0
On Error Resume Next
For Each ctrChk In Me.Controls
If Left(ctrChk.Name, 7) = "TextBox" Then
m = m + 1
End If
Next
On Error GoTo 0
MsgBox m
End Sub

Gruss Rainer
Anzeige
Ja! Genau!
20.10.2004 23:20:24
Franz
Hallo Rainer,
das tut perfekt! Vielen Dank! Und wenn du dazu eleganter sagst, dann muss ich wohl das von deinem Mitstreiter (sorry Micha!) wieder ausradieren :-)).
Und falls du noch ganz klein bisschen Lust haben solltest, kannst du dir das bitte anschauen, da geht es um dieselbe Datei. Hab ich heute mal reingestellt, aber noch keine Antwort bekommen:
https://www.herber.de/forum/index.htm?https://www.herber.de/forum/messages/503404.html
Eilt aber nicht, muss auch nicht mehr heute sein!!
Für Obiges auf jeden Fall vielen Dank und Grüße
Franz
Anzeige
So war es nicht gemeint ... :-) Lösung
Ramses
Hallo Franz
Damit wollte ich die Leistung von Micha nicht herabsetzen !!!
Ich habe mit meiner Lösung einfach ein bischen weniger IF-Abfragen :-)
Zu deiner anderen Frage:;
Wenn du den letzten Eintrag anklickst !!! funktioniert es.
Wenn du den Namen eingibst, dann nicht, weil der Listindex nicht initialisiert wird.
Frag mich aber nicht warum :-)
Lösen kannst du das, indem du noch einen leeren Datensatz anhängst
aRow = [A65536].End(xlUp).Row + 1 'Noch einen leeren Datensatz hinzufügen !!!
"+1" ist das Geheimnis.
Excel kann wohl die Index-Zuordnung machen, wenn noch ein zusätzlicher Datensatz vorhanden ist, der nicht dem eingegeben entspricht.
Gruss Rainer
Anzeige
Von mir auch nicht!!
20.10.2004 23:53:07
Franz
Hallo Rainer (und Micha),
war von mir auch nicht so gemeint, akzeptiere Michas Lösung genau so - und das weiß er auch....
Werde deinen letzten Tipp mit dem leeren Datensatz einsetzen, fällt ja keinem (User) auf *hihi*.
Vielen Dank dir auf jeden Fall, zumal du heute eigentlich wohl gar nicht hier/im Forum warst, für deine Hilfe und Grüße
Franz
Anzeige
AW: noch eleganter ...*grins*
yps
hi ihr beide,
was haltet ihr denn davon ?
Dim ctrcheck As MSForms.Control
Dim m As Integer
For Each ctrcheck In Me.Controls
If TypeOf ctrcheck Is MSForms.TextBox Then m = m + 1
Next
MsgBox m
cu Micha
Ihr übertrefft Euch!!
21.10.2004 08:54:03
Franz
Guten Morgen Micha,
wohl an der Ehre gepackt, wa?!? Find deine Lösung aber sehr gut, weil sie nicht nach dem Namen geht, sondern nach der Art des Controls. Und jetzt hab ich die Auswahl. Im vorliegenden Fall werde ich wohl Rainers Lösung einsetzen, weil ich mittlerweile dabei bin die eine oder andere TextBox durch eine ComboBox (z.B. Anrede) zu ersetzen. Wenn ich dieser dann den Namen "TextBox357" gebe, kann ich sie ansonsten unverändert in der Schleife mit drin lassen. Von deiner letzten Idee würde sie aber nicht mehr angesprochen.
Ich staune auf jeden Fall, was euch so alles immer wieder einfällt, und lese sowas mit sehr aufmerksamen Augen!!
Danke und Grüße
Franz
P.S.: hab grade ganz neu eine Frage eingestellt zu derselben Datei, falls du mal Lust hättest, dir das anzuschauen, vielleicht hast du da ja eine Idee dazu... Danke schon mal
Anzeige
Chapeau :-) Gut gemacht. o.T.
Ramses
...
;
Anzeige
Anzeige

Infobox / Tutorial

Arbeiten mit Textboxen in Excel VBA


Schritt-für-Schritt-Anleitung

Um mit mehreren Textboxen in einer UserForm in Excel VBA zu arbeiten, kannst Du eine Schleife verwenden, um die Eingaben in den Textboxen effizient zu handhaben. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor in Excel (Alt + F11).
  2. Füge eine UserForm hinzu und platziere mehrere Textboxen (TextBox1, TextBox2, ...).
  3. Verwende den folgenden Code, um die Textboxen in einer Schleife zu bearbeiten:
Sub test()
    Dim i As Integer
    For i = 1 To 17
        Me.Controls("TextBox" & i).Value = "Eintrag " & i
    Next i
End Sub

Dieser Code setzt den Wert jeder Textbox in der UserForm auf "Eintrag 1", "Eintrag 2" usw.


Häufige Fehler und Lösungen

Wenn Du mit Textboxen in Excel VBA arbeitest, können einige häufige Fehler auftreten:

  • Syntaxfehler: Wenn Du versuchst, auf die Textboxen über TextBox & i zuzugreifen, wird ein Syntaxfehler angezeigt. Stelle sicher, dass Du Me.Controls("TextBox" & i) verwendest.

  • Ungültiges Argument: Dies kann passieren, wenn Du versuchst, auf kontrollierte Objekte zuzugreifen, die nicht existieren. Überprüfe die Anzahl der Textboxen mit Me.Controls.Count und stelle sicher, dass die Namen korrekt sind.

  • Groß- und Kleinschreibung: VBA ist empfindlich gegenüber der Groß- und Kleinschreibung. Verwende daher die korrekte Schreibweise, wie z.B. "TextBox".


Alternative Methoden

Hier sind einige alternative Methoden, um die Anzahl der Textboxen in einer UserForm zu zählen oder darauf zuzugreifen:

  1. Zählung mit Typüberprüfung:

    Dim m As Integer
    Dim ctr As MSForms.Control
    For Each ctr In Me.Controls
       If TypeOf ctr Is MSForms.TextBox Then
           m = m + 1
       End If
    Next ctr
    MsgBox "Anzahl der Textboxen: " & m
  2. Zählung in einem Frame: Wenn Deine Textboxen in einem Frame sind, musst Du die Controls im Frame separat zählen:

    Dim n As Integer
    For Each ctrl In Me.Controls
       If TypeOf ctrl Is MSForms.Frame Then
           For Each subCtrl In ctrl.Controls
               If TypeOf subCtrl Is MSForms.TextBox Then
                   n = n + 1
               End If
           Next subCtrl
       End If
    Next ctrl
    MsgBox "Anzahl der Textboxen im Frame: " & n

Praktische Beispiele

Hier sind einige praktische Beispiele, die die Verwendung von Textboxen in VBA illustrieren:

  1. Alle Textboxen gleichzeitig leeren:

    Sub ClearTextBoxes()
       Dim ctrl As Control
       For Each ctrl In Me.Controls
           If TypeOf ctrl Is MSForms.TextBox Then
               ctrl.Value = ""
           End If
       Next ctrl
    End Sub
  2. Eingaben auf 7 Buchstaben begrenzen:

    Private Sub TextBox1_Change()
       If Len(TextBox1.Value) > 7 Then
           TextBox1.Value = Left(TextBox1.Value, 7)
           MsgBox "Die Eingabe darf maximal 7 Buchstaben lang sein."
       End If
    End Sub

Tipps für Profis

  • Wenn Du mit Me.Controls arbeitest, kannst Du auch Me.Controls.Count verwenden, um die Anzahl der Steuerelemente zu ermitteln.
  • Verwende On Error Resume Next, um Fehler während der Verarbeitung von Controls zu ignorieren, um zu verhindern, dass das Makro abstürzt.
  • Überlege, ob Du UserForm-Kontrollnamen als Variablen speichern kannst, um die Lesbarkeit und Wartbarkeit Deines Codes zu verbessern.

FAQ: Häufige Fragen

1. Wie zähle ich die Textboxen in einer UserForm?
Du kannst die Textboxen zählen, indem Du eine Schleife über Me.Controls verwendest und überprüfst, ob der Typ der Control eine TextBox ist.

2. Warum wird mein Code mit Me.Controls(n).Name fehlerhaft?
Achte darauf, dass die Schreibweise und die Reihenfolge der Controls korrekt sind. VBA ist case-sensitive.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige