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

Forumthread: ListView - Spaltenanzahl ?!

ListView - Spaltenanzahl ?!
kle
Hallo,
...habe eine Userform mit einem ListView-Steuerelement. (Siehe Musterdatei)
Ich möchte gern, dass diese Liste eine Kopfspalte trägt und "Nur" eine Spalte
angezeigt wird. Vor allem, bei mehrmaligem Klick - erscheinen immer mehr... ;o(
https://www.herber.de/bbs/user/69622.xls
Hier eine verkürzte Musterdatei - Klick auf Button löst das einlesen der Daten aus.
Bei Wiederholtem Klick, fügt es leider immer weiter Spaltenköpfe hinzu...will ich aber
nicht !
Ziel: Nur eine Listviewspalte - Punkt !
Wo habe ich noch den Fehler im Code ? Kann mir jemand helfen ?!?
Habe im Archiv so einiges gefunden, aber leider noch nicht die Lösung für mein
Problem.
Vielen Dank für Eure schnelle Hilfe !
Gruß
Kay
Anzeige
AW: ListView - Spaltenanzahl ?!
17.05.2010 21:53:18
kle
OK, habe eine Zeile vergessen - was hilft um nicht noch mehr Spaltenüberschriften zu haben.
LVWG.ColumnHeaders.Clear
vor der With-Anweisung mit dem schreiben der Headers...
Aber das Problem, dass 2 Spalten (eine mit "WG" die andere ohne Überschrift) bleibt leider...
Wer kann helfen ?!
Gruß
Kay
Anzeige
AW: ListView - Spaltenanzahl ?!
17.05.2010 22:20:42
Josef

Hallo Kay,
mach die Spalte einfach so breit wie das ListView.
".ColumnHeaders(1).Width = .Width - 4", wobei das -4 vom Zoomfaktor und der Schriftgröße abhängt.

Gruß Sepp

Anzeige
AW: ListView - Spaltenanzahl ?!
17.05.2010 21:56:22
Josef

Hallo Kay,
mit ".ColumnHeaders.Add" fügst du ja jedesmal einen Spaltenköpf hinzu.
Setze davor ".ColumnHeaders.Clear", dann sollte es passen.

Gruß Sepp

Anzeige
AW: ListView - Spaltenanzahl ?!
17.05.2010 22:31:34
kle
Hallo Sepp,
...vielen Dank. Habe die Spaltenbreite nun entsprechend angepasst und solange man nicht ein doppelklick auf den rechten Rand des spaltenkopfes macht - passt alles, wenn doch, gut - dann passt sich halt die Spaltenbreite wieder der Spaltenwerte an... aber damit kann ich immernoch leben.
Das mit dem .clear hatte ich schon gemacht. Danke !
Gruß
Kay
Anzeige
NEU: ListView - doppelte Einträge verhindern !
17.05.2010 22:33:48
kle
Hallo - ich nochmal,
Wollte kein neuen Beitrag schreiben, da hier ja auch noch die Musterdatei dran hängt.
Kann mir jemand helfen ? Wie kann ich es verhindern, dass Einträge mehrfach auftauchen ?
Siehe Musterdatei "Warengruppe1" z.B. !
Vielen Dank !
Gruß
Kay
AW: NEU: ListView - doppelte Einträge verhindern !
17.05.2010 22:50:27
Josef

Hallo Kay,
da gibt's viele Wege.

' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private Sub CommandButton1_Click()
  Testebene "Ursprung"
End Sub


Private Sub Testebene(Optional varFilter As Variant = 0)
  Dim lngIndex As Long
  Dim arrTmp As Variant, meArray As Variant
  Dim objDic As Object
  
  Set objDic = CreateObject("Scripting.Dictionary")
  
  meArray = Sheets("DB").UsedRange
  
  With LVWG
    .ColumnHeaders.Clear
    .ListItems.Clear
    .ColumnHeaders.Add 1, , "WG"
    .ColumnHeaders(1).Width = .Width - 4
    .View = lvwReport
    
    For lngIndex = 2 To UBound(meArray, 1)
      If (varFilter) = 0 Or CStr(meArray(lngIndex, 4)) = (varFilter) Then
        objDic(meArray(lngIndex, 5)) = 0
      End If
    Next
    
    arrTmp = objDic.keys
    
    For lngIndex = 0 To UBound(arrTmp)
      .ListItems.Add lngIndex + 1, , arrTmp(lngIndex)
    Next
  End With
  
  Set objDic = Nothing
End Sub

Gruß Sepp

Anzeige
AW: Danke, geht es auch mit 2 Spalten ?
17.05.2010 23:03:54
kle
Vielen Dank Sepp,
..darf ich noch 2 Fragen stellen - in der Hoffnung auf Antwort ?! ;o)
1) was genau ist dieses objDic ? Habe es nicht in meinen Büchern gefunden ?
2) Wie kann ich dieses verwenden, wenn ich 2 Spalten ( 5 & 6) einlesen möchte in die Listview ?!
Vielen Dank und Gruß
Kay
Anzeige
AW: Danke, geht es auch mit 2 Spalten ?
17.05.2010 23:21:31
Josef

Hallo Kay,
zum "Scripting.Dictionary" siehe http://tinyurl.com/24tvt63
Wenn due Spalte 5+6 in einer Spalte des Listviews willst, dann so.

Private Sub Testebene(Optional varFilter As Variant = 0)
  Dim lngIndex As Long
  Dim arrTmp As Variant, meArray As Variant
  Dim objDic As Object
  
  Set objDic = CreateObject("Scripting.Dictionary")
  
  meArray = Sheets("DB").UsedRange
  
  With LVWG
    .ColumnHeaders.Clear
    .ListItems.Clear
    .ColumnHeaders.Add 1, , "WG"
    .ColumnHeaders(1).Width = .Width - 4
    .View = lvwReport
    For lngIndex = 2 To UBound(meArray, 1)
      If (varFilter) = 0 Or CStr(meArray(lngIndex, 4)) = (varFilter) Then
        objDic(meArray(lngIndex, 5) & " - " & meArray(lngIndex, 6)) = 0
      End If
    Next
    
    arrTmp = objDic.keys
    
    For lngIndex = 0 To UBound(arrTmp)
      .ListItems.Add lngIndex + 1, , arrTmp(lngIndex)
    Next
  End With
  
  Set objDic = Nothing
End Sub

Gruß Sepp

Anzeige
AW: Danke, geht es auch mit 2 Spalten ?
17.05.2010 23:32:20
kle
Danke für den Link, und - sorry, wohl falsch ausgedrückt.
Meinte natürlich - 2 Spalten mit 2 Überschriften...
Nicht eine "Verkettung" von 2 Teilen...
Gruß und Danke Kay
AW: Danke, geht es auch mit 2 Spalten ?
18.05.2010 00:03:42
Josef

Hallo Kay,
dann wird es natürlich unschlüssig in Bezug auf die Doppelten!

Private Sub Testebene(Optional varFilter As Variant = 0)
  Dim lngIndex As Long
  Dim arrTmp As Variant, meArray As Variant
  Dim objDic As Object
  
  Set objDic = CreateObject("Scripting.Dictionary")
  
  meArray = Sheets("DB").UsedRange
  
  With LVWG
    .ColumnHeaders.Clear
    .ListItems.Clear
    .ColumnHeaders.Add 1, , "WG"
    .ColumnHeaders.Add 2, , "WGB"
    .ColumnHeaders(1).Width = .Width / 2 - 2
    .ColumnHeaders(2).Width = .Width / 2 - 2
    .View = lvwReport
    For lngIndex = 2 To UBound(meArray, 1)
      If (varFilter) = 0 Or CStr(meArray(lngIndex, 4)) = (varFilter) Then
        objDic(meArray(lngIndex, 5) & ";" & meArray(lngIndex, 6)) = 0
      End If
    Next
    
    arrTmp = objDic.keys
    
    For lngIndex = 0 To UBound(arrTmp)
      .ListItems.Add lngIndex + 1, , Split(arrTmp(lngIndex), ";")(0)
      .ListItems(lngIndex + 1).ListSubItems.Add 1, , Split(arrTmp(lngIndex), ";")(1)
    Next
  End With
  
  Set objDic = Nothing
End Sub

Gruß Sepp

Anzeige
AW: Danke - Klappt perfekt !!! ;o)
18.05.2010 00:26:14
kle
Hallo Sepp,
...vielen Dank, dass Du auch nicht schlafen kannst und mir so enorm hilfst !
Es klappt wunderbar...
mehrere Spalten, ohne Dopplungen !
Genau wie ich es mir vorgestellt hatte. Vielen Lieben Dank und ein "Bier" für Dich !
Gruß
Kay
;
Anzeige
Anzeige

Infobox / Tutorial

ListView in Excel: Spaltenanzahl festlegen und doppelte Einträge verhindern


Schritt-für-Schritt-Anleitung

Um die Spaltenanzahl in einem Excel ListView zu steuern und doppelte Einträge zu vermeiden, folge diesen Schritten:

  1. UserForm Erstellen: Füge ein ListView-Steuerelement zu deiner UserForm hinzu.
  2. ColumnHeaders Löschen: Stelle sicher, dass die Spaltenüberschriften vor dem Hinzufügen neuer Spalten gelöscht werden. Verwende dazu folgende Zeile:
    LVWG.ColumnHeaders.Clear
  3. Spalte Hinzufügen: Füge eine Spalte mit .ColumnHeaders.Add hinzu. Beispiel:
    LVWG.ColumnHeaders.Add 1, , "Deine Kopfspalte"
  4. Spaltenbreite Anpassen: Setze die Breite der Spalten, damit sie dem ListView entspricht:
    LVWG.ColumnHeaders(1).Width = LVWG.Width - 4
  5. Daten Einfügen: Verwende eine Schleife, um Daten in die ListView einzufügen. Achte darauf, doppelte Einträge zu verhindern, indem du ein Dictionary verwendest.
  6. Listenitems Hinzufügen: Füge die Items zur ListView hinzu:
    LVWG.ListItems.Add , , "Dein Eintrag"

Häufige Fehler und Lösungen

  • Doppelte Kopfspalten: Wenn du bei mehrmaligem Klicken immer mehr Kopfspalten siehst, hast du wahrscheinlich vergessen, die ColumnHeaders zu löschen. Verwende:

    LVWG.ColumnHeaders.Clear
  • Falsche Spaltenbreite: Wenn die Spaltenbreite nicht richtig angepasst ist, könnte dies an einem falschen Wert für die Berechnung liegen. Stelle sicher, dass du den Wert korrekt setzt.


Alternative Methoden

Falls du mehrere Spalten in einem Excel ListView anzeigen möchtest, kannst du dies tun, indem du einfach zusätzliche Spalten hinzufügst. Beispiel für zwei Spalten:

LVWG.ColumnHeaders.Add 1, , "Spalte 1"
LVWG.ColumnHeaders.Add 2, , "Spalte 2"

Vergiss nicht, die Breite entsprechend anzupassen:

LVWG.ColumnHeaders(1).Width = LVWG.Width / 2 - 2
LVWG.ColumnHeaders(2).Width = LVWG.Width / 2 - 2

Praktische Beispiele

Hier ist ein einfaches Beispiel, das die oben genannten Schritte zeigt:

Private Sub CommandButton1_Click()
    Dim objDic As Object
    Set objDic = CreateObject("Scripting.Dictionary")

    ' Daten einlesen und in ein Array speichern
    Dim meArray As Variant
    meArray = Sheets("DB").UsedRange

    With LVWG
        .ColumnHeaders.Clear
        .ListItems.Clear
        .ColumnHeaders.Add 1, , "WG"
        .ColumnHeaders.Add 2, , "WGB"
        .ColumnHeaders(1).Width = .Width / 2 - 2
        .ColumnHeaders(2).Width = .Width / 2 - 2

        Dim lngIndex As Long
        For lngIndex = 2 To UBound(meArray, 1)
            If Not objDic.Exists(meArray(lngIndex, 5)) Then
                objDic.Add meArray(lngIndex, 5), Nothing
                .ListItems.Add , , meArray(lngIndex, 5)
                .ListItems(.ListItems.Count).ListSubItems.Add , , meArray(lngIndex, 6)
            End If
        Next lngIndex
    End With

    Set objDic = Nothing
End Sub

Tipps für Profis

  • Verwendung von Scripting.Dictionary: Nutze das Dictionary, um doppelte Einträge effizient zu überprüfen und zu vermeiden.

  • Code-Optimierung: Halte deinen Code sauber und gut kommentiert, um spätere Änderungen zu erleichtern.

  • Testen: Teste regelmäßig deine UserForm, besonders nach Änderungen, um sicherzustellen, dass alles wie erwartet funktioniert.


FAQ: Häufige Fragen

1. Wie verhindere ich doppelte Einträge in einem ListView?
Verwende ein Scripting.Dictionary, um bereits hinzugefügte Elemente zu überprüfen und nur neue Einträge hinzuzufügen.

2. Wie kann ich mehrere Spalten in einem Excel ListView darstellen?
Füge einfach mehrere ColumnHeaders mit .ColumnHeaders.Add hinzu und passe die Breite entsprechend an.

3. Was ist der Unterschied zwischen ListView und ListBox in Excel?
ListView bietet mehr Anpassungsmöglichkeiten, wie z.B. Spalten und Subitems, während ListBox einfacher und unkomplizierter ist.

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