Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema ListBox
BildScreenshot zu ListBox ListBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

Liste füllen und mit Combobox erweitern

Betrifft: Liste füllen und mit Combobox erweitern von: Alex
Geschrieben am: 16.09.2020 15:50:59

Hallo zusammen

Ich baue mir eine Userform, was eigentlich auch sehr gut funktioniert.

Nun habe ich aber folgende Probleme:

Bei meinem Code werden in der Userform die Textboxen 1-4 und die Comboboxen 1-4 mit den gleichen Inhalten gefüllt.
Leider kann ich nicht ganz nachvollziehen warum.

Mein anderes Problem ist, dass ich nicht genau weis wie die Textboxen und Comboboxen auf die Tabelle Bezug nimmt.

Also Textbox1 wird gefüllt mit A1.

Vielleicht kann mir ja hier jemand einen Tipp geben.

Herzlichen Dank Alex


Private Const lCONST_STARTZEILENNUMMER_DER_TABELLE As Long = 5




Private Sub UserForm_Initialize()

'With UF
'.MaxButton = True
'.MinButton = True
'.BorderStyle = xlSolid
'.Create Me
'End With
'Set g_UserForm = Me

With Me.ComboBox1
ComboBox1.Clear
.AddItem ("Administration")
.AddItem ("Hauswirtschaft")
.AddItem ("Lingerie")
.AddItem ("Pflege")
.AddItem ("Restauration")
.AddItem ("Technik")
.AddItem ("Verwaltung")
.AddItem ("Küche")
.AddItem ("")
End With

With Me.ComboBox2
ComboBox2.Clear
.AddItem ("zwingend")
.AddItem ("zu erwarten")
.AddItem ("gewünscht")
.AddItem ("")

End With



Call LISTE_LADEN_UND_INITIALISIEREN 'Aufruf der entsprechenden Verarbeitungsroutine


End Sub

Private Sub LISTE_LADEN_UND_INITIALISIEREN()
Dim lZeile As Long
Dim lZeileMaximum As Long
Dim i As Integer

'Alle TextBoxen leer machen
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
Me.Controls("TextBox" & i) = ""

Next i

For i = 1 To 4
Me.Controls("Combobox" & i) = ""

Next i


ListBox1.Clear 'Liste leeren

'4 Spalten einrichten
'Spalte 1: Zeilennummer des Datensatzes
'Spalte 2: Name (Spalte A)
'Spalte 3: Telefon (Spalte B)
'Spalte 4: E-Mail (Spalte C)
ListBox1.ColumnCount = 6

'Spaltenbreiten der Liste anpassen (0=ausblenden, nichts=automatisch)
'";;;"
ListBox1.ColumnWidths = "0;;;;"
'Feste Breiten: ListBox1.ColumnWidths = "0;100;100;100"

'Um eine Schleife für alle Datensätze zu erhalten, benötigen wir die letzte verwendete _
Zeile
lZeileMaximum = Tabelle3.UsedRange.Rows.Count 'Benutzer Bereich auslesen

For lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE To lZeileMaximum

'Nur wenn die Zeile benutzt / nicht leer ist, zeigen wir etwas an:
If IST_ZEILE_LEER(lZeile) = False Then

'Spalte 1 der Liste mit der Zeilennummer füllen
ListBox1.AddItem lZeile

'Spalten 2 bis 4 der Liste füllen
ListBox1.List(ListBox1.ListCount - 1, 2) = CStr(Tabelle3.Cells(lZeile, 1).Text)
ListBox1.List(ListBox1.ListCount - 1, 1) = CStr(Tabelle3.Cells(lZeile, 2).Text)
ListBox1.List(ListBox1.ListCount - 1, 3) = CStr(Tabelle3.Cells(lZeile, 3).Text)
ListBox1.List(ListBox1.ListCount - 1, 4) = CStr(Tabelle3.Cells(lZeile, 4).Text)
ListBox1.List(ListBox1.ListCount - 1, 5) = CStr(Tabelle3.Cells(lZeile, 7).Text)
'ListBox1.List(ListBox1.ListCount - 1, 6) = CStr(Tabelle3.Cells(lZeile, 6).Text)
'ListBox1.List(ListBox1.ListCount - 1, 7) = CStr(Tabelle3.Cells(lZeile, 7).Text)
'ListBox1.List(ListBox1.ListCount - 1, 8) = CStr(Tabelle3.Cells(lZeile, 8).Text)
'ListBox1.List(ListBox1.ListCount - 1, 9) = CStr(Tabelle3.Cells(lZeile, 9).Text)
' ListBox1.List(ListBox1.ListCount - 1, 10) = CStr(Tabelle3.Cells(lZeile, 10).Text)
'ListBox1.List(ListBox1.ListCount - 1, 11) = CStr(Tabelle3.Cells(lZeile, 11).Text)
'ListBox1.List(ListBox1.ListCount - 1, 12) = CStr(Tabelle3.Cells(lZeile, 12).Text)



End If

Next lZeile

End Sub



Private Sub EINTRAG_LADEN_UND_ANZEIGEN()

Dim lZeile As Long

Dim i As Integer



'Eingabefelder resetten

For i = 1 To iCONST_ANZAHL_EINGABEFELDER

Me.Controls("TextBox" & i) = ""



Next i



For i = 1 To 4

Me.Controls("Combobox" & i) = ""



Next i

'Nur wenn ein Eintrag selektiert/markiert ist

If ListBox1.ListIndex >= 0 Then



'Die Zeilennummer des Datensatzes steht in der ersten ausgeblendeten Spalte der Liste,

'somit können wir direkt zugreifen.

lZeile = ListBox1.List(ListBox1.ListIndex, 0)



For i = 1 To iCONST_ANZAHL_EINGABEFELDER

Me.Controls("TextBox" & i) = CStr(Tabelle3.Cells(lZeile, i).Text)



Next i



For i = 1 To 4

Me.Controls("Combobox" & i) = CStr(Tabelle3.Cells(lZeile, i).Text)



Next i

End If



End Sub



Private Sub EINTRAG_SPEICHERN()

Dim lZeile As Long

Dim i As Integer



'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet

If ListBox1.ListIndex = -1 Then Exit Sub



'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes

lZeile = ListBox1.List(ListBox1.ListIndex, 0)



For i = 1 To iCONST_ANZAHL_EINGABEFELDER

Tabelle3.Cells(lZeile, i) = Me.Controls("TextBox" & i)

Tabelle3.Cells(lZeile, 7) = CDbl(TextBox3.Value)

Next i



For i = 1 To 4

Tabelle3.Cells(lZeile, i) = Me.Controls("Combobox" & i)

Next i



'Der Benutzer könnte die angezeigten Werte in der Liste geändert haben,

'daher aktualisieren wir den ausgewählten Eintrag entsprechend.

ListBox1.List(ListBox1.ListIndex, 2) = ComboBox1

ListBox1.List(ListBox1.ListIndex, 1) = TextBox2

ListBox1.List(ListBox1.ListIndex, 3) = TextBox3

ListBox1.List(ListBox1.ListIndex, 4) = ComboBox2

ListBox1.List(ListBox1.ListIndex, 5) = TextBox7

'ListBox1.List(ListBox1.ListIndex, 6) = TextBox3

'ListBox1.List(ListBox1.ListIndex, 7) = TextBox4

'ListBox1.List(ListBox1.ListIndex, 8) = TextBox5

'ListBox1.List(ListBox1.ListIndex, 9) = TextBox6

'ListBox1.List(ListBox1.ListIndex, 10) = TextBox8

'ListBox1.List(ListBox1.ListIndex, 11) = TextBox9

'ListBox1.List(ListBox1.ListIndex, 12) = TextBox10







End Sub



Private Sub EINTRAG_LOESCHEN()

Dim lZeile As Long



'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet

If ListBox1.ListIndex = -1 Then Exit Sub



'Beim Löschen fragen wir zuerst den Benutzer noch einmal sicherheitshalber:

If MsgBox("Sie möchten den markierten Datensatz wirklich löschen?", _

vbQuestion + vbYesNo, "Sicherheitsabfrage!") = vbYes Then



'Nur wenn er mit antwortet, löschen wir auch!



'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes

lZeile = ListBox1.List(ListBox1.ListIndex, 0)



'Die ganze Zeile wird nun gelöscht

Tabelle3.Rows(CStr(lZeile & ":" & lZeile)).Delete



'Und den Eintrag in der Liste müssen wir auch noch entfernen

ListBox1.RemoveItem ListBox1.ListIndex



End If



End Sub



Private Sub EINTRAG_ANLEGEN()

Dim lZeile As Long



lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE

'Schleife bis eine leere ungebrauchte Zeile gefunden wird

Do While IST_ZEILE_LEER(lZeile) = False

lZeile = lZeile + 1 'Nächste Zeile bearbeiten

Loop



'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1

Tabelle3.Cells(lZeile, 2) = CStr("Neuer Eintrag Zeile " & lZeile)



'Und neuen Eintrag in die UserForm eintragen

ListBox1.AddItem lZeile

ListBox1.List(ListBox1.ListCount - 1, 1) = CStr("Neuer Eintrag Zeile " & lZeile)

ListBox1.List(ListBox1.ListCount - 1, 2) = ""

ListBox1.List(ListBox1.ListCount - 1, 3) = ""

ListBox1.List(ListBox1.ListCount - 1, 4) = ""

ListBox1.List(ListBox1.ListCount - 1, 5) = ""

'ListBox1.List(ListBox1.ListCount - 1, 6) = ""

'ListBox1.List(ListBox1.ListCount - 1, 7) = ""

'ListBox1.List(ListBox1.ListCount - 1, 8) = ""

'ListBox1.List(ListBox1.ListCount - 1, 9) = ""

'ListBox1.List(ListBox1.ListCount - 1, 10) = ""

'ListBox1.List(ListBox1.ListCount - 1, 11) = ""

'ListBox1.List(ListBox1.ListCount - 1, 12) = ""



'Den neuen Eintrag markieren mit Hilfe des ListIndex

ListBox1.ListIndex = ListBox1.ListCount - 1

'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen



'Und dem Benutzer direkt noch den Cursor in das erste Eingabefeld stellen und alles _

vorselektieren,

'so kann der Benutzer direkt loslegen mit der Dateneingabe.

TextBox1.SetFocus

TextBox1.SelStart = 0

TextBox1.SelLength = Len(TextBox1)



End Sub


' ************************************************************************************************

' HILFSFUNKTIONEN

' ************************************************************************************************


'Ermittelt, ob eine Zeile in Benutzung ist...


Private Function IST_ZEILE_LEER(ByVal lZeile As Long) As Boolean
   Dim i As Long
   Dim sTemp As String
  
     'Hilfsvariable initialisieren
     sTemp = ""
    
     'Um zu erkennen, ob eine Zeile komplett leer/ungebraucht ist
     'verketten wir einfach alle Spalteninhalte der Zeile miteinander.
     'Ist die zusammengesetzte Zeichenkette aller Spalten leer,
     'ist die Zeile nicht genutzt...
     For i = 1 To iCONST_ANZAHL_EINGABEFELDER
         sTemp = sTemp & Trim(CStr(Tabelle3.Cells(lZeile, i).Text))
     Next i
    
     'Rückgabewert festlegen
     If Trim(sTemp) = "" Then
         'Die Zeile ist leer
         IST_ZEILE_LEER = True
     Else
         'Die Zeile ist mindestens in einer Spalte gefüllt
         IST_ZEILE_LEER = False
     End If
    
End Function

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: ralf_b
Geschrieben am: 16.09.2020 16:08:19

bitte eine beispieldatei mit dem code und den betreffenden controls hochladen.

wenndu wissen willst wie man mit userform und den controls arbeit dann lies erstmal die beispiel und hilfen durch, die hier z.b. unter dem Menüpunkt Excel-Materialien zu finden sind.

zitat"Bei meinem Code werden in der Userform die Textboxen 1-4 und die Comboboxen 1-4 mit den gleichen Inhalten gefüllt.Leider kann ich nicht ganz nachvollziehen warum."
dafür gibt es das Debugging. indem man schritt für schritt durch den Code geht und feststellt wo der hase im Pfeffer liegt. Haltepunkte kennst du sicher auch. Damit stopt der Code an dieser Stelle und du kannst die Werte checken.

zitat: "Mein anderes Problem ist, dass ich nicht genau weis wie die Textboxen und Comboboxen auf die Tabelle Bezug nimmt."

mit Listbox.rowsource oder listbox.list kannst du ganze bereiche einer tabelle hinzufügen.
bei rowsource ist die tabelle mit den einträgen verknüpft. Änderungen wirken direkt
Bei .additem fügst du nur die werte in eine liste und mußt dann die Tabellenzellen erst wieder durchsuchen um die passende Zeile zum Listeintrag zu finden.

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Alex
Geschrieben am: 16.09.2020 18:46:41

Sorry bin neu hier ;-)

Also ich habe die Datei angehängt.
Das Problem ist bei der Userform "Eingabe_Beschaffung_Hotellerie".
Ich bekomme es nicht hin, dass Textboxen und Comboxen richtig funktionieren.
Eigentlich sollte diese Userform in die Tabelle Beschaffungen Hotellerie schreiben und von dort auch wieder holen. Es sind ein paar Testdaten drin.
Ich habe erst angefangen mit VBA.
Danke für die Hilfe.
https://www.herber.de/bbs/user/140271.xlsm


LG
Alex

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Nepumuk
Geschrieben am: 16.09.2020 19:06:07

Hallo Alex,

deine Datei ist Lesegeschützt.

Gruß
Nepumuk

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Alex
Geschrieben am: 16.09.2020 19:13:00

Sorry😳. Passwort ist „viva“

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Alex
Geschrieben am: 16.09.2020 19:13:03

Sorry😳. Passwort ist „viva“

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Nepumuk
Geschrieben am: 16.09.2020 19:45:57

Hallo Alex,

ok, und was muss ich dann machen?

Gruß
Nepumuk

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Alex
Geschrieben am: 16.09.2020 20:01:33

Die userform Eingabe_Beschaffungen_Hotellerie laufen lassen?

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: ralf_b
Geschrieben am: 16.09.2020 20:09:42

da hast du dir ja was aufgehalst.

du hast also ein fertiges Produkt und versuchst es an deine Tabelle anzupassen.

da die Controls z.b. textboxen in einer schleife befüllt werden , sind sie durchnumeriert. Diese passen aber nicht zu deiner Tabelle.
Also stelle fest wieviele Spalten deine Tabelle hat.
lege fest zu welchem Control welche Spalte zugeordnet wird.
und dann änderst du die namen der Controls(Textboxen) der Reihen nach aufsteigend nach den Spaltennumern. Alle nicht benötigten Controls löschst du aus der Userform.

EINTRAG_SPEICHERN()
 For i = 1 To iCONST_ANZAHL_EINGABEFELDER  'dieser wert steht auf 12, du brauchst nur soviele  _
wie du textboxen hast 
         Tabelle3.Cells(lZeile, i) = Me.Controls("TextBox" & i)
         Tabelle3.Cells(lZeile, 7) = CDbl(TextBox3.Value) 'das kann aus der schleife raus und  _
darunter einfügen
     Next i


die for schleife danach mit dem Comboboxen überschreibt deine ersten 4 Spalten in der Tabelle, die du mit den Werten der Textboxen bereits gefüllt hast.

der Listboxbereich darunter erhält die werte deiner Controls, Das hast du schon angepasst.

So gesehen ein Zuordnungs und Dimensionierungsproblem.

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Alex
Geschrieben am: 16.09.2020 20:40:04

Danke dir

Ja ich hab mir da ein grosses Projekt angetan. Auf der anderen Seite ist es gut zum lernen😉.

Wie kann ich das Problem am besten lösen? Und wo kann ich mich gescheit weiterbilden im Bereich VBA😂.

P.s. Es sind doch 12 Textboxen und 4 Comboboxen und drei Listboxen🤔

Lg

Alex

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: ralf_b
Geschrieben am: 16.09.2020 21:06:19

aaah ja, ich habs doch beschrieben. die Zuordnung auf der UF stimmen nicht. Weiterbildung hast du nicht nötig. ;) Zum Lernen nimmt man leichte überschaubare Aufgaben. Damit man bei solchen Dingern weis was man vor sich hat und nachvollziehen kann was dort passiert.

Betrifft: AW: Liste füllen und mit Combobox erweitern
von: Alex
Geschrieben am: 16.09.2020 21:14:07

Ok, danke erstmal. Dann werde ich mich mal mit dem Thema Zuordnung befassen🤔.
Warum meinst du das ich keine Weiterbildung nötig habe?
Danke für die Hilfe.

Beiträge aus dem Excel-Forum zum Thema "Liste füllen und mit Combobox erweitern"