Vba excel

Hi ich habe ein Problem bei Excel.

Ich ein Userform mit 100 Textboxen.
20 davon haben den Namen POS1 bis POS20

Wie kann ich nun mit einer Schleife den Inhalt dieser 20 Textboxen in ein Variablen Array speichern.

So in dieser Art:

Dim i as integer
dim strTextbox(20) as string

For i = 1 to Userform1.contols.count
if userform1.contorls.name = „pos“ & i then
strTextbox(i) = userform1.[pos & i].value
end if
next i

Ich komme da einfach nicht weiter.
Der einzige Weg, den ich momentan sehe ist der 20 Zeilen Code zu schreiben. In jeder Zeile spreche ich jede Textbox direkt mit ihrem Namen an.

In etwa so:

strTextbox(1) = userform1.pos1.value
.
.
.
strTextbox(20) = userform1.pos20.value

Dass dies der einzige Weg sein soll, der zum Ziel führt kann ich mir nun allerdings nicht vorstellen.

Hast du eine Idee, wie es ebend eleganter mit einer Schleife geht?

Dank im Voraus!

Freundlicher
Gruß
Ralph Hoffmann

Dim i as long
dim J as long
dim strTextbox(20) as string

For i = 1 to Userform1.contols.count
for J = 1 to 20
if userform1.contorls(i).name = „pos“ & J then
strTextbox(J) = userform1.[pos & J].value
end if
next J
next i

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Servus Ralph,

solche Abfragen löse ich gerne mit einer Gruppierung. Hierfür nutze ich das Feld „TAG“ in den Eigenschaften der Textboxen. Dort schreibe ich z.B. für die Textboxen Pos1 bis Pos20 den Text „Gruppe1“ und für die Textboxen Pos21 bis 40 den Text „Gruppe2“. Mit Hilfe einer Function lese ich dann die Daten in ein Array.

Hier mal ein Beispiel:

Option Explicit

Private Sub UserForm_Click()

Dim strTextbox As Variant, i As Long
'Hier die Verwendung der Funktion im Code
If Not TextboxenEinlesen(strTextbox, „Gruppe1“) Then Exit Sub

For i = LBound(strTextbox) To UBound(strTextbox)
Debug.Print i, strTextbox(i)
Next i

End Sub

Private Function TextboxenEinlesen(ByRef Arr As Variant, ByVal strTAG As String) As Boolean
Dim i As Long
Dim c As Control

For Each c In UserForm1.Controls
'Abfrage, ob das Control eine Textbox ist
If TypeOf c Is MSforms.TextBox Then
'Hier wird der TAG des Controls abgefragt
If c.Tag = strTAG Then
'Hier wird das Array dimensioniert
If Not IsArray(Arr) Then
ReDim Arr(1 To 1)
Else
ReDim Preserve Arr(1 To UBound(Arr) + 1)
End If
'Hier wird der Wert aus der Textbox in das Array geschrieben
Arr(UBound(Arr)) = c.Value
End If
End If
Next c

TextboxenEinlesen = IsArray(Arr)
End Function

Beste Grüße
Gerd

Hi ich habe ein Problem bei Excel.

Ich ein Userform mit 100 Textboxen.
20 davon haben den Namen POS1 bis POS20

Wie kann ich nun mit einer Schleife den Inhalt dieser 20
Textboxen in ein Variablen Array speichern.

So in dieser Art:

Dim i as integer
dim strTextbox(20) as string
dim aktName as string
For i = 1 to Userform1.controls.count

aktname= „pos“ & i

if userform1.controls.name = „pos“ & i then
strTextbox(i) = aktName
end if
next i

Ich komme da einfach nicht weiter.
Der einzige Weg, den ich momentan sehe ist der 20 Zeilen Code
zu schreiben. In jeder Zeile spreche ich jede Textbox direkt
mit ihrem Namen an.

In etwa so:

strTextbox(1) = userform1.pos1.value
.
.
.
strTextbox(20) = userform1.pos20.value

Dass dies der einzige Weg sein soll, der zum Ziel führt kann
ich mir nun allerdings nicht vorstellen.

Hast du eine Idee, wie es ebend eleganter mit einer Schleife
geht?

Dank im Voraus!

Freundlicher
Gruß
Ralph Hoffmann

Hallo Ralph,

da ich unter der Woche ziemlich unterwegs bin und erst spät abends komme, heir ein rester Versuch von einem Rechner ohne Excel.

Ich habe sowas schon gemacht, schick mir deine Datei ich mach es dir fertig - kann aber ein zwei Tage dauern

Jürgen

Jetzt habe ich doch noch ein wenig Zeit gehabt, bei mir funktioniert es!
Dim ctl As Control
For Each ctl In Me.Controls
If Left(ctl.Name, 3) = „pos“ Then
a = ctl.Value
End If
b = b + a
Next

MsgBox b

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Ralph, ich werde mich im Laufe der Woche mit dem Problem beschäftigen. Du hörst dann von mir. Am besten ist, Du sendest mir eine Datei mit den Boxen zu, dass ich genau sehen kann, was gemacht werden muss! Gruß Bodo

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Ralph,

zum Auflisten der Controls eignet siche am besten eine For Each-Schleife

For Each co In Me.Controls
Debug.Print co.Name ’ hier nur ausgabe des Namens
Next

innerhalb dieser Schleife suchst du dann mit einer unterlagerten Schleife nach den Passenden Conttrols

z.B.:
Dim co As TextBox
For Each co in Me.Controls
For i = 0 To 20
if co.Name=„POS“ & i then
'…
'Hier dann dein Code zum Lesen oder Schreiben der Werte
end if
Next i
Next ’ foreach

Andere und fehleranfälligere Variante währe, dass du die Controls direkt Indizierst:
Me.Controls(„POSxx“).Text 'xx - Nummer des Controls

Wenn du die Zweite Methode wählst, darfst du die Fehlerbehandlung nicht vergessen

MfG
Waldemar

//****************************************************
//**
Hallo Ralph!

Probiere mal diese Schleife aus. Ich benutze hier Item, um auf die festgelegte Reihenfolge der Textboxen zuzugreifen. Mit der MsgBox gebe ich den Inhalt der Textbox aus. Du kannst hier dann diese in einen String schieben:

For i = 1 To 20
For j = 0 To UserForm1.Controls.Count – 1
If UserForm1.Controls.Item(j).Name = „pos“ & i Then
MsgBox UserForm1.Controls.Item(j).Text
End If
Next j
Next i

Gruß Ersin.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Ralph,

tut mir leid, da habe ich auch keine andere Idee, VBA lässt keine Indizierung von Steuerobjekten zu, ich habe da auch immer „auscodiert“. Bei Visual Basic geht das, aber leider nicht bei VBA. Wenn ein anderer Dir eine besseren Tipp, ich wäre für eine WQeiterleizung dankbar.
Viele Erfol
Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Ralf,

verstehe ich es richtig, dass Du die Werte in einer einzigen Variablen haben möchtest? Falls ja, dann so:

For i = 1 to Userform1.contols.count
if userform1.contorls.name = „pos“ & i then
Ausgabe = Ausgabe & „;“ & userform1.[pos & i].value
end if
next i

Gruß,
Jochen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Grüezi Ralph

Sorry, ich komme erst jeztz dazu, deine Anfrage zu lesen.

Hast Du inzwischen eine Lösung gefunden?


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -