Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listview Spalten dazufügen und Anzeige erweitern

Forumthread: Listview Spalten dazufügen und Anzeige erweitern

Listview Spalten dazufügen und Anzeige erweitern
k
Hallo,
...in dem Beitrag: https://www.herber.de/forum/archiv/1088to1092/t1090132.htm
erhielt ich eine tolle Lösung von Tino. Leider stoße ich hier noch an 2 Probleme im Nachgang. Wollte aber den alten Beitrag nicht noch unötig erweitern, daher heut ein neuer Eintrag.
Problem:
Wie kann ich den Code von Tino so anpassen, dass ich mehr wie 2 Spalten angezeigt bekomme ?
Und
Kann ich die Spalte in der derSuchbegriff gefunden wird mit anzeigen lassen ? Wenn ja, Wie ?
Nun, es ist so, dass in meiner jetztigen Datei die Tabellen unterschiedliche Strukturen haben vom Aufbau - eine 67 Spalten, die andere 98 und die dritte "nur" 24...
Was das Anzeigen der Spaltenüberschriften bei der Option über "alle" Suchen nur beschränkt geeignet ist...
> Hier würde ich dann nur die Spalten Anzeigen lassen wollen - die in allen Vorkommen. Die Stammdaten...
Spalten 1,3,4,11,12,15 und 21 !
Wäre Super wenn man mir da helfen könnte. Vor allem der folgende Teil des Codes erweist sich für mich schwieriger als Gedacht:
Private Sub LeseDaten(ParamArray oSh() As Variant)
Dim oDic1 As Object, oDim2 As Object
Dim meAr, myArTemp
Dim i As Integer, A As Long, B As Long
Set oDic1 = CreateObject("Scripting.Dictionary")
'Daten Sammeln ohne doppelte
'LBound() kleinster verfügbaren Index der Array
'UBound() kleinster verfügbaren Index der Array
'### ist nur ein Hilfsmittel um Spalte 1 von Spalte 2 wieder trennen zu können
For i = LBound(oSh) To UBound(oSh)
With oSh(i)
meAr = .Range("B2:C" & .Cells(.Rows.Count, 2).End(xlUp).Row)
For A = 1 To UBound(meAr)
oDic1(meAr(A, 1) & "###" & meAr(A, 2)) = 0
Next
End With
Next i
myArTemp = oDic1.keys
ListView1.ListItems.Clear
With ListView1
'ListView Überschrift erstellen
.ColumnHeaders.Add 1, , oSh(0).Range("B1")
.ColumnHeaders.Add 2, , oSh(0).Range("C1")
.View = lvwReport
'Listview mit Daten füllen
For A = LBound(myArTemp) To UBound(myArTemp)
meAr = Split(myArTemp(A), "###")
.ListItems.Add B + 1, , meAr(0)
.ListItems(B + 1).SubItems(1) = meAr(1)
B = B + 1
Next A
End With
LVColumnWidth ListView1, True 'optimale Spalte einstellen
End Sub

Dachte an diesen Weg...aber klappt nicht:
Private Sub LeseDaten(ParamArray oSh() As Variant)
Dim oDic1 As Object, oDim2 As Object
Dim meAr, myArTemp
Dim i As Integer, A As Long, B As Long
Set oDic1 = CreateObject("Scripting.Dictionary")
'Daten Sammeln ohne doppelte
'LBound() kleinster verfügbaren Index der Array
'UBound() kleinster verfügbaren Index der Array
'### ist nur ein Hilfsmittel um Spalte 1 von Spalte 2 wieder trennen zu können
For i = LBound(oSh) To UBound(oSh)
With oSh(i)
meAr = .Range("B2:DD" & .Cells(.Rows.Count, 2).End(xlUp).Row)
For A = 1 To UBound(meAr)
oDic1(meAr(A, 1) & "###" & meAr(A, 3) & "###" & meAr(A, 11) & "###" & meAr(A, 12) _
& "###" & meAr(A, 15) & "###" & meAr(A, 21)) = 0   '
' Erweiterung der Spalten aus denen gelesen werden soll
Next
End With
Next i
myArTemp = oDic1.keys
ListView1.ListItems.Clear
ListView1.ColumnHeaders.Clear  ' habe ich ergänzt, da sonst mit jedem Suchklick die Ü _
berschrift zusätzlich auftaucht....
With ListView1
'ListView Überschrift erstellen
.ColumnHeaders.Add 1, , oSh(0).Range("A1")   ' Dachte so könnte man die SpaltenNamen  _
gezielt setzten...
.ColumnHeaders.Add 2, , oSh(0).Range("C1")
.ColumnHeaders.Add 3, , oSh(0).Range("K1")
.ColumnHeaders.Add 4, , oSh(0).Range("L1")
.ColumnHeaders.Add 5, , oSh(0).Range("N1")
.ColumnHeaders.Add 6, , oSh(0).Range("T1")
.View = lvwReport
' Den folgenden Teil kann ich ncht genau zerlegen in dem was es macht und kann es daher nicht    _
_
_
erweitern.
' Wie muss er lauten, wenn ich weitere Spalten einbeziehen möchte ? wie oben aufgeführt ?
'Listview mit Daten füllen
For A = LBound(myArTemp) To UBound(myArTemp)
meAr = Split(myArTemp(A), "###")
.ListItems.Add B + 1, , meAr(0)
.ListItems(B + 1).SubItems(1) = meAr(1)
B = B + 1
Next A
End With
LVColumnWidth ListView1, True 'optimale Spalte einstellen
End Sub

Vielen Dank und Gruß
Kay
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Listview Spalten dazufügen und Anzeige erweitern
30.07.2009 14:14:01
Tino
Hallo,
so wie ich Dich verstanden habe, müsste es so gehen.
Option Explicit
'Für ListView-Spalten 
Private Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long
 
Private Const LVM_SETCOLUMNWIDTH = &H1000 + 30
Private Const LVSCW_AUTOSIZE = -1
Private Const LVSCW_AUTOSIZE_USEHEADER = -2
 
'Für ListView-Spalten auf optimale Breite setzen 
Private Sub LVColumnWidth(oListView As MSComctlLib.ListView, _
  Optional AccountForHeaders As Boolean = False)
 
  Dim col As Long
  Dim LParm As Long
 
  On Error GoTo Error
  If AccountForHeaders Then
    LParm = LVSCW_AUTOSIZE_USEHEADER
  Else
    LParm = LVSCW_AUTOSIZE
  End If
 
  For col = 0 To oListView.ColumnHeaders.Count - 1
    SendMessage oListView.hwnd, LVM_SETCOLUMNWIDTH, _
      col, ByVal LParm
  Next col
  Exit Sub
 
error:
End Sub

Private Sub LeseDaten(ParamArray oSh() As Variant)
Dim oDic1 As Object, oDim2 As Object
Dim meAr, myArTemp
Dim i As Integer, A As Long, B As Long
Set oDic1 = CreateObject("Scripting.Dictionary")

'Daten Sammeln ohne doppelte ********************************************** 
'LBound() kleinster verfügbaren Index der Array 
'UBound() größter verfügbaren Index der Array 
'### ist nur ein Hilfsmittel um die Spalten wieder zu trennen 
For i = Lbound(oSh) To Ubound(oSh)
   With oSh(i)
        meAr = .Range("B2:T" & .Cells(.Rows.Count, 2).End(xlUp).Row)
        For A = 1 To Ubound(meAr)
          oDic1( _
            meAr(A, 1) & "###" & meAr(A, 2) & "###" & meAr(A, 10) & "###" & meAr(A, 11) & "###" & meAr(A, 13) & "###" & meAr(A, 19) _
          ) = 0
        Next
   End With
Next i
'*************************************************************************** 
myArTemp = oDic1.keys

ListView1.ListItems.Clear

 With ListView1
  'ListView Überschrift erstellen *********** 
  .ColumnHeaders.Add 1, , oSh(0).Range("B1")
  .ColumnHeaders.Add 2, , oSh(0).Range("C1")
  .ColumnHeaders.Add 3, , oSh(0).Range("K1")
  .ColumnHeaders.Add 4, , oSh(0).Range("L1")
  .ColumnHeaders.Add 5, , oSh(0).Range("N1")
  .ColumnHeaders.Add 6, , oSh(0).Range("T1")

  .View = lvwReport
  
  'Listview mit Daten füllen 
        For A = Lbound(myArTemp) To Ubound(myArTemp)
            meAr = Split(myArTemp(A), "###") 'gesammelte Daten wieder Splitten 
            .ListItems.Add B + 1, , meAr(0)
            .ListItems(B + 1).SubItems(1) = meAr(1)
            .ListItems(B + 1).SubItems(2) = meAr(2)
            .ListItems(B + 1).SubItems(3) = meAr(3)
            .ListItems(B + 1).SubItems(4) = meAr(4)
            .ListItems(B + 1).SubItems(5) = meAr(5)
            B = B + 1
        Next A
End With
 LVColumnWidth ListView1, True 'optimale Spalte einstellen 
End Sub
Gruß Tino
Anzeige
AW: Listview Spalten dazufügen und Anzeige erweitern
04.08.2009 11:26:49
k
Hallo Tino,
Du hast recht, habe in den letzten Tage zwar Deine/Eure Hilfe in Anspruch genommen, aber nur selten Feedback gegeben. Lag sicherlich daran, dass ich mit Eurer Hilfe in meinem Tool schnel weiterkam und somit sich das nächste Problem auftat - wo ich ggf. (da meine VBA-Kenntnisse noch eher bescheiden sind) erneut auf Euch zuging, ohne auf die zuvor gestellte Frage und Antwort zu reagieren.
SORRY !
Ja, das was Du oben geschrieben hast - hat genau das getroffen was ich wissen wollte. Mit der List Subitem - Methode konnte ich nun die Listview meinen Anforderungen entsprechend anpassen und das finde ich klasse.
Vielen Dank !
Gruß
Kay
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Listview Spalten dazufügen und Anzeige erweitern


Schritt-für-Schritt-Anleitung

Um in Excel eine Listview zu erstellen und Spalten dazuzufügen, kannst Du den folgenden VBA-Code verwenden. Der Code ermöglicht es, Daten aus verschiedenen Arbeitsblättern zu sammeln und in einer Listview anzuzeigen.

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel.

  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf „VBAProject (deineDatei.xlsx)“ > Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Private Sub LeseDaten(ParamArray oSh() As Variant)
       Dim oDic1 As Object, meAr, myArTemp
       Dim i As Integer, A As Long, B As Long
       Set oDic1 = CreateObject("Scripting.Dictionary")
    
       For i = LBound(oSh) To UBound(oSh)
           With oSh(i)
               meAr = .Range("B2:T" & .Cells(.Rows.Count, 2).End(xlUp).Row)
               For A = 1 To UBound(meAr)
                   oDic1(meAr(A, 1) & "###" & meAr(A, 2) & "###" & meAr(A, 10) & "###" & meAr(A, 11)) = 0
               Next
           End With
       Next i
    
       myArTemp = oDic1.keys
       ListView1.ListItems.Clear
       With ListView1
           .ColumnHeaders.Add 1, , oSh(0).Range("B1")
           .ColumnHeaders.Add 2, , oSh(0).Range("C1")
           .ColumnHeaders.Add 3, , oSh(0).Range("K1")
           .View = lvwReport
    
           For A = LBound(myArTemp) To UBound(myArTemp)
               meAr = Split(myArTemp(A), "###")
               .ListItems.Add B + 1, , meAr(0)
               .ListItems(B + 1).SubItems(1) = meAr(1)
               B = B + 1
           Next A
       End With
       LVColumnWidth ListView1, True
    End Sub
  4. Füge zusätzliche Spalten hinzu: Du kannst den Bereich in der Range-Anweisung anpassen, um mehr Spalten anzuzeigen, z.B. Range("B2:DD"...), je nach deinen Anforderungen.

  5. Führe den Code aus: Nutze die Schaltfläche oder ein eigenes Makro, um die Funktion LeseDaten aufzurufen.


Häufige Fehler und Lösungen

  • Fehler: Listview bleibt leer: Überprüfe den Bereich, den Du im Code angibst. Stelle sicher, dass die Daten korrekt eingelesen werden. Ein häufiges Problem ist ein falscher Bereich oder leere Zellen.

  • Fehler: Spaltenüberschrift wird nicht angezeigt: Stelle sicher, dass die Spaltenüberschrift in der ColumnHeaders.Add-Anweisung korrekt referenziert wird.

  • Fehler: VBA-Code läuft nicht: Überprüfe, ob Du die Referenz zu Microsoft Windows Common Controls in den VBA-Referenzen aktiviert hast.


Alternative Methoden

Eine alternative Methode zur Anzeige von Daten ist die Verwendung von UserForms. Hier kannst Du eine Listbox anstelle eines Listview verwenden, die einfacher zu implementieren ist, jedoch nicht so viele Funktionen bietet.

  1. Erstelle ein UserForm: Füge ein UserForm zu deinem VBA-Projekt hinzu.
  2. Füge eine ListBox hinzu: Ziehe eine ListBox auf das UserForm.
  3. Benutze den selben Code: Du musst den Code leicht anpassen, um die ListBox anstelle des Listviews zu füllen.

Praktische Beispiele

Hier ist ein einfaches Beispiel zur Nutzung der LeseDaten-Funktion:

Sub Beispiel()
    Call LeseDaten(Sheets("Tabelle1"), Sheets("Tabelle2"))
End Sub

In diesem Beispiel werden die Daten aus „Tabelle1“ und „Tabelle2“ in die Listview geladen.


Tipps für Profis

  • Optimierung der Spaltenbreite: Verwende die Funktion LVColumnWidth nach dem Füllen der Listview, um die Spaltenbreiten automatisch anzupassen.

  • Daten filtern: Füge Filterfunktionen hinzu, um nur relevante Daten anzuzeigen. Dies kann mithilfe von einfachen If-Anweisungen im Code erfolgen.

  • Event-Handling: Nutze Event-Handling für die Listview, um auf Benutzerinteraktionen zu reagieren, z.B. Doppelklicks auf Listeneinträge.


FAQ: Häufige Fragen

1. Frage
Wie kann ich mehr Spalten zu einer Listview in Excel hinzufügen?
Antwort: Du kannst die ColumnHeaders.Add-Anweisungen im Code erweitern, um mehr Spalten hinzuzufügen.

2. Frage
Kann ich die Listview mit VBA füllen?
Antwort: Ja, mit dem ListItems.Add-Befehl kannst Du die Listview dynamisch mit Daten füllen.

3. Frage
Was mache ich, wenn die Listview nicht korrekt angezeigt wird?
Antwort: Überprüfe die Sichtbarkeit des Listviews und stelle sicher, dass alle notwendigen Steuerelemente korrekt konfiguriert sind.

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