Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Listbox mit Header

Listbox mit Header
braleta
Hallo Excel-ianer,
ich schlage mich mit einem Problem rum, das ich alleine nicht mehr lösen kann.
Ich habe eine Userform mit drei Rahmen:
Im ersten Rahmen befindet sich eine Listbox
Im zweiten Rahmen befinden sich 12 Textfelder
Im dritten Rahmen sind Aktions-Knöpfe
Die Listbox wird bei Initialize mit Daten gefüllt, und wird dann ein Eintrag ausgewählt (Click), werden die entsprechenden Daten mittels der Routine "Private Sub lstClickAndSelect_Click()" aus dem Worksheet in die Textfelder geschrieben.
Die Listbox wird so gefüllt:
With Me.lstClickAndSelect
.ColumnCount = 7
.ColumnWidths = "50;50;35;30;40;80;50"
.ColumnHeads = False
For i = ErsteZeile To LetzteZeile
    .AddItem Cells(i, "H") 'Nachname
    .List(.ListCount - 1, 1) = Cells(i, "I") 'Vorname
    .List(.ListCount - 1, 2) = Cells(i, "J") 'Gender
    .List(.ListCount - 1, 3) = Cells(i, "K") 'Band
    .List(.ListCount - 1, 4) = Cells(i, "L") 'PBC
    .List(.ListCount - 1, 5) = Cells(i, "M") 'Land
    .List(.ListCount - 1, 6) = Cells(i, "N") 'Activity
Next i
End With
Es funktioniert auch alles, ich kann mappen, ändern, zurückschreiben, refreshen, alles ist OK.
Wenn ich jedoch diesen Code nehme:
With Me.lstClickAndSelect
    .ColumnCount = 7
    .ColumnWidths = "50;50;35;30;40;80;50"
    .ColumnHeads = True
    .RowSource = Range("H" & ErsteZeile & ":N" & LetzteZeile).Address
End With
passiert Folgendes:
Die Listbox wird ganz normal gefüllt, der Header wird angezeigt.
Klicke ich eine Zeile in der Listbox an, werden die Daten richtig in die Textfelder geschrieben. Ich kann Inhalte der Textfelder ändern, aber wenn ich auf "OK" drücke, um die Textfelder wieder zurück in das Spreadsheet zu schreiben, wird - wenn ich Feldinhalte auf Richtigkeit überprüfe - die Routine "Private Sub lstClickAndSelect_Click()" angesprungen und die "Originaldaten aus demSpreadshhet werden wieder geladen, ohne dass ich meine eventuellen Änderungen zurückschreiben kann.
Meine Check-Snipplets sehen in etwa so aus:
'pruefe Gender
If Trim(UCase(txtGender)) = "M" Or Trim(UCase(txtGender)) = "F" Then
    txtGender = UCase(Trim(txtGender))    'schreibe die Textbox neu
    Cells(ActualIndex, "J") = txtGender       'schreibe die Textbox ins Blatt
Else
     MsgBox "Gender is ein Pflichtfeld und darf nur ""M"" oder ""F"" sein!"
     txtGender = ""
    txtGender.SetFocus
     Exit Sub
End If
Was passiert hier? Ich habe keine Events getriggert.
...braleta
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Listbox mit Header
02.10.2011 11:09:28
Tino
Hallo,
durch das schreiben in die Zelle wird dieses Event ausgelöst.
Vorschlag, Du kannst dies abfangen.
Bsp:

    txtGender.Tag = "1" 'Tag Eigenschaft nutzen
txtGender = UCase(Trim(txtGender))    'schreibe die Textbox neu
Cells(ActualIndex, "J") = txtGender       'schreibe die Textbox ins Blatt
txtGender.Tag = ""
In Deiner Listbox als erste Zeile nach der Deklarierung

If txtGender.Tag = "1" Then Exit Sub
Gruß Tino
Anzeige
AW: Listbox mit Header
02.10.2011 13:45:23
braleta
Hallo Tino,
danke für die Antwort, ich habe das "Tag" eingebaut, aber ich habe immer noch die gleichen Probleme.
Vorabinfo:
Die Listbox heißt "lstClickAndSelect"
Ich habe jetzt mal intensiv getestet und Folgendes festgestellt:
1. Die Funktion "lstClickAndSelect_Click" wird immer dann angesprungen, wenn ich den Inhalt eines der Textfelder, die ich über Initialize in die Listbox schreibe, zurück in das Spreadsheet schreibe (oder zurückgeschrieben habe?).
2. Die Funktion "lstClickAndSelect_Click" wird zwei mal hintereinander angesprungen und lädt mir natürlich wieder die Ursprungsdaten, die ich "eigentlich" geändert haben will. Die Felder, die ich nicht in die Listbox lade, sind upgedated, die anderen nicht...
Es sieht fast so aus, als ob .RowSource etwas damit zu tun haben könnte...
Hast Du noch einen Tipp?
...braleta
Anzeige
AW: Listbox mit Header
02.10.2011 14:03:26
Tino
Hallo,
lade mal ein Beispiel hoch.
Gruß Tino
AW: Listbox mit Header
02.10.2011 17:47:19
braleta
Hallo Tino,
sorry, dass es so lange gedauert hat, aber ich habe mir ein bas-Modul zerhauen und musste es gerade neu nachschreiben
ich lade eine Testdatei hoch. Sie heißt: https://www.herber.de/bbs/user/76837.xls

Achtung: die Userform wird über "Workbook_Open" gestartet, kann aber über das "Rote X" gelöscht werden, um in das VBA-Environment zu gelangen. "UserForm_QueryClose" habe ich disabled.
Aktiv ist im Moment das Laden der Listbox mit ".additem".
.RowSource ist direkt darunter auskommentiert...
Es wäre toll, wenn Du den Fehler findest.
...braleta
Anzeige
AW: Listbox mit Header
02.10.2011 16:38:06
Tino
Hallo,
hier mal ein Beispiel wie ich es machen würde.
Habe mal beide Varianten eingebaut, einmal mit Verwendung der Tag Eigenschaft und einmal ohne.
Persönlich würde ich die mit setzen der Tag- Eigenschaft verwenden,
dann wird der Code der Listbox nicht komplett durchlaufen, was man ja nicht braucht.
https://www.herber.de/bbs/user/76836.xls
Gruß Tino
Anzeige
Routinen morgen um und testAW: Listbox mit Header
02.10.2011 22:06:16
braleta
Tino,
danke, auf den ersten Blick sieht das wirklich toll aus, ich baue meine Routinen um und teste sie dann.
Ich melde mich auf alle Fälle!
braleta
AW: Listbox mit Header
03.10.2011 11:55:03
braleta
Tino,
noch ein Mal herzlichen Dank für die Beispiele, ich habe die Lösung mit dem "Tag" umgesetzt und es funktioniert natürlich einwandfrei.
Vielleicht wäre ich auch noch auf diese Lösung gekommen, weil ich die Zellen, deren Inhalt geändert wurde, einfärben will, und das kann ich ja nur über den "_Change"-Event.
Aber vielen Dank, Du warst mir eine große Hilfe!
...braleta
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Listbox mit Header in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Userform erstellen: Öffne den VBA-Editor (ALT + F11) und füge eine Userform hinzu.

  2. Listbox hinzufügen: Ziehe eine Listbox auf die Userform. Nenne sie lstClickAndSelect.

  3. Textfelder und Buttons hinzufügen: Füge 12 Textfelder und die notwendigen Aktions-Knöpfe hinzu.

  4. Daten in die Listbox laden: Verwende den folgenden Code im UserForm_Initialize-Event, um die Listbox zu füllen:

    With Me.lstClickAndSelect
       .ColumnCount = 7
       .ColumnWidths = "50;50;35;30;40;80;50"
       .ColumnHeads = False
       For i = ErsteZeile To LetzteZeile
           .AddItem Cells(i, "H")                      'Nachname
           .List(.ListCount - 1, 1) = Cells(i, "I")      'Vorname
           .List(.ListCount - 1, 2) = Cells(i, "J")      'Gender
           .List(.ListCount - 1, 3) = Cells(i, "K")      'Band
           .List(.ListCount - 1, 4) = Cells(i, "L")      'PBC
           .List(.ListCount - 1, 5) = Cells(i, "M")      'Land
           .List(.ListCount - 1, 6) = Cells(i, "N")      'Activity
       Next i
    End With
  5. Header aktivieren: Um einen Header für die Listbox einzufügen, ändere .ColumnHeads auf True und nutze .RowSource:

    With Me.lstClickAndSelect
       .ColumnCount = 7
       .ColumnWidths = "50;50;35;30;40;80;50"
       .ColumnHeads = True
       .RowSource = Range("H" & ErsteZeile & ":N" & LetzteZeile).Address
    End With
  6. Event-Handling anpassen: Um das Problem mit dem Click-Event zu vermeiden, setze die Tag-Eigenschaft wie folgt:

    If txtGender.Tag = "1" Then Exit Sub
    txtGender.Tag = "1" 'Tag Eigenschaft nutzen
    txtGender = UCase(Trim(txtGender)) 'schreibe die Textbox neu
    Cells(ActualIndex, "J") = txtGender 'schreibe die Textbox ins Blatt
    txtGender.Tag = ""

Häufige Fehler und Lösungen

  1. Event wird unerwartet ausgelöst: Wenn du Änderungen in den Textfeldern vornimmst und das Click-Event der Listbox ausgelöst wird, stelle sicher, dass du die Tag-Eigenschaft korrekt verwendest.

  2. Header wird nicht angezeigt: Überprüfe, ob die ColumnHeads-Eigenschaft auf True gesetzt ist und dass die RowSource richtig definiert ist.

  3. Daten werden zurückgesetzt: Achte darauf, dass du die Tag-Eigenschaft nach dem Schreiben der Werte zurücksetzt, um wiederholte Auslösungen des Events zu vermeiden.


Alternative Methoden

Eine Möglichkeit, die Listbox mit Headern zu erstellen, besteht darin, die Werte manuell hinzuzufügen und dann die ColumnHeads-Eigenschaft auf True zu setzen. Dies kann nützlich sein, wenn du mehr Kontrolle über die Header-Texte benötigst oder wenn du dynamische Daten verwendest.

With Me.lstClickAndSelect
    .ColumnCount = 7
    .ColumnWidths = "50;50;35;30;40;80;50"
    .ColumnHeads = True
    .AddItem "Nachname"
    .List(0, 1) = "Vorname"
    .List(0, 2) = "Gender"
    .List(0, 3) = "Band"
    .List(0, 4) = "PBC"
    .List(0, 5) = "Land"
    .List(0, 6) = "Activity"
End With

Praktische Beispiele

Ein praktisches Beispiel ist die Verwendung einer Listbox, um eine Liste von Mitarbeitern anzuzeigen. Die Spaltenüberschriften könnten "Nachname", "Vorname", "Position" usw. sein. Hier ist ein einfacher Code, um dies zu demonstrieren:

Private Sub UserForm_Initialize()
    With Me.lstClickAndSelect
        .ColumnCount = 3
        .ColumnHeads = True
        .AddItem "Nachname"
        .List(0, 1) = "Vorname"
        .List(0, 2) = "Position"
        ' Füge Daten hinzu
        .AddItem "Müller"
        .List(.ListCount - 1, 1) = "Hans"
        .List(.ListCount - 1, 2) = "Manager"
    End With
End Sub

Tipps für Profis

  • Nutze die Tag-Eigenschaft, um das Triggern unerwünschter Events zu verhindern. Dies ist besonders nützlich bei komplexen Formularen mit mehreren Steuerelementen.
  • Experimentiere mit der RowSource-Eigenschaft, um Daten aus verschiedenen Bereichen dynamisch zu laden.
  • Verwende .ColumnHeads in Kombination mit AddItem für eine benutzerdefinierte Header-Anpassung.

FAQ: Häufige Fragen

1. Wie kann ich die Breite der Spalten in der Listbox anpassen?
Verwende die ColumnWidths-Eigenschaft, um die Breite jeder Spalte festzulegen. Beispiel: .ColumnWidths = "50;50;35;30;40;80;50".

2. Was mache ich, wenn der Header nicht angezeigt wird?
Stelle sicher, dass die ColumnHeads-Eigenschaft auf True gesetzt ist und dass du die RowSource korrekt angegeben hast.

3. Wie kann ich die Listbox nach einer Auswahl aktualisieren?
Du kannst den Click-Event der Listbox verwenden, um die Textfelder mit den entsprechenden Daten zu füllen. Achte darauf, die Tag-Eigenschaft zu verwenden, um unerwünschte Event-Auslösungen zu vermeiden.

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