|
Der Inhalt eines ListView-Steuerelements aus den Microsoft Common Controls ist über die ListItems und die ListSubItems (Version 6) bzw. die SubItems (Version 5) verstreut. Das ListView-Steuerelement selbst bietet Ihnen keine Möglichkeit, den Inhalt aus einer eigenen Eigenschaft auszulesen oder über eine Methode zu erhalten. Dabei wäre es doch ganz praktisch, den Inhalt in einem String zu erhalten, um ihn etwa in eine Excel-Tabelle (oder in ein anderes Grid) zu kopieren, oder um ihn etwa in einer CSV-Datei abzulegen.
Abhilfe schafft die folgende Funktion ListViewContents, die den Inhalt eines ListView-Steuerelements in einem Rutsch ausliest. Sie können dabei festlegen, ob die Spaltenköpfe (ColumnHeaders) ebenfalls ausgelesen und als erste Zeile vorangestellt werden sollen, und ob dann eine Leerzeile danach eingefügt werden soll. Weiterhin können Sie sowohl die Start- und Endzeile als auch die Start- und Endspalte festlegen. Als Zeilentrenner (RowSeparator) voreingestellt ist die übliche Kombination (vbCrLf) von CarriageReturn (Ascii 13) und LineFeed (Ascii 10), als Spaltentrenner (ColSeparator) das Tabulatorzeichen (vbTab, Ascii 9). Sie können aber auch für beides beliebige andere Zeichen oder Zeichenketten angeben.
Die Versionen dieser Funktion für ListViews der Version 5 und der Version 6 unterscheiden sich lediglich in dadurch, dass für die Version 6 der optionale Parameter UseSubItems hinzukommt, in dem Sie angeben können, ob Sie die ListSubItems oder die SubItems der ListItems verwendet haben (ListSubItems ist voreingestellt), und entsprechend auch der Block zum Auslesen der ListSubItems.
' Version 5:
Public Function ListViewContents(ListView As ListView, _
Optional ByVal IncludeColumnHeaders As Boolean, _
Optional ByVal StartRow As Long = 1, _
Optional ByVal EndRow As Long, _
Optional ByVal StartCol As Long = 1, _
Optional ByVal EndCol As Long, _
Optional ByVal EmptyLineAfterHeaders As Boolean, _
Optional RowSeparator As String = vbCrLf, _
Optional ColSeparator As String = vbTab) As String
' Version 6:
Public Function ListViewContents(ListView As ListView, _
Optional ByVal IncludeColumnHeaders As Boolean, _
Optional ByVal StartRow As Long = 1, _
Optional ByVal EndRow As Long, _
Optional ByVal StartCol As Long = 1, _
Optional ByVal EndCol As Long, _
Optional ByVal EmptyLineAfterHeaders As Boolean, _
Optional RowSeparator As String = vbCrLf, _
Optional ColSeparator As String = vbTab, _
Optional ByVal UseSubItems As Boolean) As String
' Beide Versionen:
Dim nStartRow As Long
Dim nStartCol As Long
Dim nEndRow As Long
Dim nEndCol As Long
Dim nRow As Long
Dim nCol As Long
Dim nContents As String
Dim nLine As String
With ListView
If .View = lvwReport Then
With .ListItems
Select Case StartRow
Case Is < 1
nStartRow = 1
Case Is > .Count
nStartRow = .Count
Case Else
nStartRow = StartRow
End Select
Select Case EndRow
Case 0
nEndRow = .Count
Case Is < nStartRow
nEndRow = nStartRow
Case Is < 1
nEndRow = 1
Case Is > .Count
nEndRow = .Count
Case Else
nEndRow = EndRow
End Select
With ListView.ColumnHeaders
Select Case StartCol
Case Is < 1
nStartCol = 1
Case Is > .Count
nStartCol = .Count
Case Else
nStartCol = StartCol
End Select
Select Case EndCol
Case 0
nEndCol = .Count
Case Is < nStartCol
nEndCol = nStartCol
Case Is < 1
nEndCol = 1
Case Is > .Count
nEndCol = .Count
Case Else
nEndCol = EndCol
End Select
If IncludeColumnHeaders Then
For nCol = nStartCol To nEndCol - 1
nContents = nContents & .Item(nCol).Text & ColSeparator
Next 'ncol
If EmptyLineAfterHeaders Then
nContents = nContents & .Item(nEndCol).Text & _
RowSeparator & RowSeparator
Else
nContents = nContents & .Item(nEndCol).Text & _
RowSeparator
End If
End If
End With
' Version 5:
For nRow = nStartRow To nEndRow
nLine = ""
For nCol = nStartCol To nEndCol
If nCol = 1 Then
nLine = .Item(nRow).Text
ElseIf nCol - 1 <= ListView.ColumnHeaders.Count Then
nLine = nLine & ColSeparator & _
.Item(nRow).SubItems(nCol - 1)
End If
Next 'nCol
If nStartCol > 1 Then
nLine = Mid$(nLine, 2)
End If
nContents = nContents & nLine & RowSeparator
Next nRow
' Version 6:
If UseSubItems Then
For nRow = nStartRow To nEndRow
nLine = ""
For nCol = nStartCol To nEndCol
If nCol = 1 Then
nLine = .Item(nRow).Text
ElseIf nCol - 1 <= ListView.ColumnHeaders.Count Then
nLine = nLine & ColSeparator & _
.Item(nRow).SubItems(nCol - 1)
End If
Next 'nCol
If nStartCol > 1 Then
nLine = Mid$(nLine, 2)
End If
nContents = nContents & nLine & RowSeparator
Next nRow
Else
For nRow = nStartRow To nEndRow
nLine = ""
For nCol = nStartCol To nEndCol
If nCol = 1 Then
nLine = .Item(nRow).Text
ElseIf nCol - 1 <= .Item(nRow).ListSubItems.Count Then
nLine = nLine & ColSeparator & _
.Item(nRow).ListSubItems(nCol - 1)
End If
Next 'nCol
If nStartCol > 1 Then
nLine = Mid$(nLine, 2)
End If
nContents = nContents & nLine & RowSeparator
Next nRow
End If
' Beide Versionen:
End With
ListViewContents = nContents
End If
End With
End Function
|