Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1088to1092
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
For Schleife über Tesxtboxen, Checkboxen etc.
k
Hallo,
ich habe mal eine Frage: In einer Userform habe ich 92 aktive (also ohne Labels etc.) Elemente. Von Comboboxen, Textboxen, Optionsbuttons bis Checkboxen alles vertreten. Ich habe entsprechend der Eingabe von 1 - 92 allen folgende Logik im Namen gegeben:
Textbox = TB
Checkbox = CB
Optionsbutton = OB
und Comboboxen = CBox
...so hat z.B. die erste Eingabemöglichkeit folgenden Namen: TB1 und die danach TB2. Dann komme einige Checkboxen die CB3-11 heißen usw.
D.h. ich habe von vorn beginnend jedes Element mit seinem passenden Kürzel und die entsprechende Nr. (Position der Reihenfolge in der Userform) bezeichnet.
Dachte es wäre so einfacher bei der Programmierung den richtigen Platz des Feldes auch in der dahinterliegenden Datentabelle (Pos-Nr. = Spalte x) zu finden. Wie kann ich nun die "Speichern" -Funktion am besten schreiben um die Eingaben in das Datenblatt zu schreiben, bzw. aus dem Datenblatt in die Userform zu lesen ?!
Dachte da an eine For i - Schleife auf alle 4 Arten (TB, CB etc.) von 1-92 --- mit einer On Error Resume Next i - Variante (da ja nicht alle Nr. bei jeder Art vorkommen!)... und i = Spalte...
Geht das - oder gibt es da einen Gedankenfehler, bzw. eine bessere Möglichkeit den Code so kurz wie Möglich zu halten und bei Fehlern (nicht vorkommen) einfach mit dem nächsten weiter zu machen ?!
Gruß und Danke für alle Anregungen und Hinweise !
Kay
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 09:24:15
Beverly
Hi Kay,
schreibe die Zelladresse (oder Spaltenbuchstabe, falls die Zeile variabel sein soll) in die Tag-Eigenschaft der Steuerelemente, dann kannst du die Daten nach diesem Prinzipo in das Tabellenblatt übergeben:
    Dim coElement As Control
For Each coElement In Me.Controls
Range(coElement.Tag) = coElement
Next



AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 09:59:45
k
Hallo Karin,
vielen Dank, scheint schön "kurz" zu sein. Aber da meine Kenntnisse noch nicht so optimal sind, würde ich gern noch 2 Fragen stellen:
- Muss man jedes Control-Element per Hand anfassen und den Tag "Tablle1 A" etc. eintragen ? Oder lässt sich das per Marko ebenso mal erledigen ? So in der Art laufe alle Controls einmal durch, und schreibe in das jeweilige Tag-Feld des Controls "Tabelle1" und Spalte = Nr. aus Namen des Controls !?
- Wie kann ich dann in meinem Code Deine Zeilen verwenden und um die ZeilenNr. (Datensatzzeile) ergänzen ?
Habe derzeit es so gehabt:
LZeile = Combobox1.listindex +2
For i = 1 to 15 ' für die Textboxen als Beispiel)
Me("TB" & i).Value = Worksheets("Tabelle1").Cells(Lzeile, i)
next i
Wie würde es nun mit Deiner Variante aussehen für alle 1-92 Controls in einem Lauf ?
Gruß und Danke Kay
Anzeige
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 10:23:06
Beverly
Hi Kay,
1. per Makro lässt sich der Eintrag in die Tag-Eigenschaft nicht machen, du musst es also von Hand machen. Man könnte es vielleicht mittels Klassenprogrammierung lösen, ist aber sicher aufwendiger.
2. den Tabellennamen musst du nicht mit angeben, das kannst du dann im Code machen - also nur den Spaltenbuchstaben eintragen.
3. alle Daten in die Steuerelemente eintragen:
    Dim coElement As Control
For Each coElement In Me.Controls
coElement= Worksheets("Tabelle1").Range(coElement.Tag & Lzeile)
Next



Anzeige
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 10:27:09
k
OK, werde ich gleich mal ausprobieren - aber zuvor alle Controls mit Tags versorgen ,o) Dauert eine Weile, habe 4 Userformen mit 68, 76, 83 und 92 Elementen ...
Melde mich sobald ich es laufen hab.
Gruß und vielen Dank !
Kay
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 10:49:12
k
Hi Karin,
habe es mit der ersten Userform probiert (unten der Code) klappt super.
Aber, ich habe da eine Frage:
Wenn ich den Code einsetze um alle Felder zu leeren - werden auch die "Labels" in der Anzeige gelöscht ?!
Wie kann ich das verhindern ?
Gruß
Kay
Private Sub CB1_AfterUpdate()
TB2.Text = CB1.Text
s = TB2.Text
If s  "" Then
On Error Resume Next
Worksheets("ATE").Activate
ActiveWorkbook.Names("Kd").RefersToR1C1 = "=OFFSET(ATE!R2C3:R2C3,0,0,COUNTA(ATE!C3)-1)"
Application.Goto Reference:="Kd"
Set Found = Selection.Find(s, after:=ActiveCell, lookat:=xlPart)
If Found Is Nothing Then
MsgBox "Kunde konnte nicht gefunden werden, bitte NEU anlegen!"
'LZeile = Cells(Rows.Count, 1).End(xlUp).Row + 1 ' Letzte Zeile / erste freie/ setzen
'LPos.Caption = LZeile
' For Each coElement In Me.Controls ' alle Felder leeren
'  coElement = ""
' Next
Else
If Not Found Is Nothing Then
LZeile = CB1.ListIndex + 2
LPos.Caption = LZeile
For Each coElement In Me.Controls
coElement = Worksheets("ATE").Range(coElement.Tag & LZeile)
Next
End If
End If
End If
End Sub

Anzeige
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 11:06:02
Beverly
Hi Kay,
du kannst erreichen dass bestimmte Steuerelemente nicht geleert werden, indem du sie explizit ausschließt:
       For Each coElement In Me.Controls ' alle Felder leeren
If TypeName(coElement)  "Label" Then coElement = ""
Next



AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 11:43:02
Beverly
Hi Kay,
und hier noch eine Prinzip-Lösung ohne Tag mittels Array (dem Vorschlag von Tino folgend):
Option Explicit
Dim arrSpaltenTextBoxen()
Dim arrSpaltenComboBoxen()
Private Sub UserForm_Activate()
arrSpaltenTextBoxen = Array(Array("Tb1", "Tb2", "Tb3", "Tb4"), Array("A", "B", "C", "D"))
arrSpaltenComboBoxen = Array(Array("Cb1", "Cb2"), Array("E", "F"))
End Sub
Private Sub CommandButton1_Click()
Dim coElement As Control
Dim loZeile As Long
Dim strSpalte As String
loZeile = 1
For Each coElement In Me.Controls
If TypeName(coElement) = "TextBox" Then
strSpalte = arrSpaltenTextBoxen(1)(Application.Match(coElement.Name,  _
arrSpaltenTextBoxen(0), 0) - 1)
ElseIf TypeName(coElement) = "ComboBox" Then
strSpalte = arrSpaltenComboBoxen(1)(Application.Match(coElement.Name,  _
arrSpaltenComboBoxen(0), 0) - 1)
End If
If strSpalte  "" Then
Worksheets("Tabelle1").Range(strSpalte & loZeile) = coElement
strSpalte = ""
End If
Next
End Sub

Anzeige
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 12:18:38
k
Hallo Karin,
...auch Dir noch einmal vielen Dank. Ich bin total von diesem Forum begeistert. Was man hier lernt, schnelle Hilfe bekommt und dabei nie als "Depp" behandelt wird, nur weil man noch "Anfänger" ist - einfach einzigartig !!!
Habe Deine Lösung bis ejtzt erstmal verbaut, werde aber auch die Version von Tino noch probieren. Mal schauen, mit welcher ich besser klar komme...
Gruß und vielen Dank !
Kay
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 09:50:27
Tino
Hallo,
hier mal ein Beispiel um in die nächste freie Zeile zu schreiben, Referenz ist hier Spalte A.
Dim LCol As Long, LRow As Long

'nächste freie Zelle, Referenz in Spalte A 
LRow = Cells(Rows.Count, 1).End(xlUp).Row + 1

'Schleife über TextBox1 bis TextBox24 
For LCol = 1 To 24
 Cells(LRow, LCol) = Me("TextBox" & LCol)
Next i
Gruß Tino
Anzeige
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 10:07:07
k
Hallo Tino,
...danke, aber ich meinte was anderes. Ich wollte wissen, wie ich per Schleife alle Control-Elemente der Userform auslesen und in die entsprechende Zeile der Tabelle schreiben kann mit einer "Fehler-Abfang-Methode" wenn ein Control-Element mit i nicht vorhanden ist ?!
Habe z.B.: TB1, TB2, CB3, CB4, CB5...CB11, TB12, TB13, OB14, OB15, OB16, TB17 etc. bis TB92 in meiner Userform. Die Nr. = die Spalte in der der Wert steht, bzw. geschrieben werden soll...
Wollte es per Schleife machen, bekomme aber immer eine Fehlermeldung wenn z.B. TB3 nicht da ist !
LZeile = CBoxKunden.listindex +2
For i = 1 to 92
Me("TB" & i).Value = Worksheets("ATE").Cells(LZeile, i)
next i
For i = 1 to 92
Me("CB" & i).Value = Worksheets("ATE").Cells(LZeile, i)
next i
For i = 1 to 92
Me("OB" & i).Value = Worksheets("ATE").Cells(LZeile, i)
next i
etc.
...
Gruß und Danke Kay
Anzeige
AW: For Schleife über Tesxtboxen, Checkboxen etc.
27.07.2009 10:43:35
Tino
Hallo,
normalerweise wählt man seine Schleifen so,
dass man nur Objekte anspricht die auch vorhanden sind.
Eventuell müsstest Du in die Schleife sowas mit einbauen.
i= iif(i=4,i=17,i)
Hier mal eine Möglichkeit für Deine Version.
Private Sub CommandButton1_Click()
LZeile = CBoxKunden.ListIndex + 2
For i = 1 To 92
i= iif(i=4,i=17,i)
If CheckControl("TB" & i) Then
Me("TB" & i).Value = Worksheets("ATE").Cells(LZeile, i)
Next i
Next i
End Sub

Oder du machst es über Array wo Deine Controls darin gespeichert sind und durchläufst diese,
so würde ich es wahrscheinlich machen.
Dies würde aber wahrscheinlich den Rahmen hier sprengen.
Gruß Tino
Anzeige
falscher Code...
27.07.2009 10:46:07
Tino
Hallo,
hier der richtige
LZeile = CBoxKunden.ListIndex + 2
For i = 1 To 92
i = IIf(i = 4, 17, i)
Me("TB" & i).Value = Worksheets("ATE").Cells(LZeile, i)
Next i
Gruß Tino
hier mal ein Beispiel mittels Array...
27.07.2009 11:11:25
Tino
Hallo,
die Controls werden beim Initialisieren der UF im Array gespeichert,
beim Schreiben brauchst Du dann nur eine Schleife, weil die Nummer für die Spalte aus dem Namen genommen wird. Vorraussetzung ist natürlich der Aufbau wie von Dir oben beschrieben.
Option Explicit
Dim meControl() As Control
Private Sub CommandButton1_Click()
Dim i As Integer, LCol As Long, LZeile As Long
LZeile = CBoxKunden.ListIndex + 2
For i = LBound(meControl) To UBound(meControl)
LCol = Right(meControl(i).Name, Len(meControl(i).Name) - 2)
meControl(i).Value = Worksheets("ATE").Cells(LZeile, LCol)
Next i
End Sub
Private Sub UserForm_Initialize()
Dim meCon As Control, i As Integer
For Each meCon In Me.Controls
If (meCon.Name Like "TB*") Or (meCon.Name Like "CB*") Or (meCon.Name Like "OB*") Then
ReDim Preserve meControl(i)
Set meControl(i) = meCon
i = i + 1
End If
Next meCon
End Sub
Gruß Tino
Anzeige
AW: hier mal ein Beispiel mittels Array...
27.07.2009 12:16:44
k
Super und vielen Dank, werde es heut noch ausprobieren...scheint aber schon beim Lesen für mich "Laien" nachvollziehbar zu sein.
Vielen Dank !
Gruß
Kay

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige