Frage zu Treeview
21.02.2022 00:16:53
Bernd
Meine VBA Kenntnisse bestehen bisher aus einfachen Basic´s die mich bisher gut durch meinen Excel Alltag gebracht haben.
Nun soll ich allerdings eine Aufgabe lösen die mich Stunden an Recherche in Foren, Google und Youtube gekostet haben ohne das ich
mir behelfen konnte. Da ich bisher als Stiller Mitleser in diesem Forum meine meisten VBA Proleme lösen konnte dachte ich das ich hier
mal nach Hilfe nachfragen könnte.
Problem:
Ein Mini Dokumentenmanagement für einige Dokumente bzw. Anleitungen und Serviceunterlagen für eine Hausmeisterabteilung soll erstellt werden.
Lösung:
ein Treeview mit seiner Schönen Baumansicht sollte reichen. Die Ordner Unterordner und Dateien sollen Dargestellt werden ein Klick auf einen Node sollte
sämtliche Dateien unterhalb des Nodes in eine Listbox schreiben. In der Listbox sollten die Dateien dann mit Doppelklick zu öffnen sein (.pdf).
Mittlerweile habe ich gelernt einen Normalen Treeview zu erstellen und zu füllen. Allerdings ein eingriff in das Dateisystem und die gewünschten Ordner und Dateien in den Treeview zu Übertragen übersteig etwas mein wissen, mittels dem FileScriptingObject habe ich zwar in meinen kleinen Projekten schon einfache Datei Operaionen durchgeführt aber mit einem Treeview kann ich das nicht zusammen bringen.
Folgenden Code habe ich hier schonmal im Forum gefunden. Bzw. Der Code stammte von Irgendwo aus dem Netzt und wurde etwas geändert.
Ich habe den Originalen Code gefunden. Das Programm macht schonmal das was ich benötige. Nachdem im Programm der Pfad angegeben wird listet der Code sämtliche Ordner, Unterordner und Datein in einem treeview auf. Der Code ist für einen Hobbyprogrammierer schon sehr Professionell geschrieben, finde ich zumindest.
Ich kann Ihn leider nicht so erweitern das ein Node und dessen Inhalt ausgelesen wird und diese Daten in eine Listbox geschrieben werden wo wiederum diese Einträge in ausführbare Links eingetragen werden.
Ich weis nun natürlich nicht ob mir jemand helfen könnte mein Problem zu lösen oder ob das zu zeitaufwendig ist.
Wenn jemand von euch zeit hat würde ich mir wünschen, wenn das nicht zu vermessen ist, da mal drüber zu gucken und mir zu sagen ob das was ich eigentlich möchte überhaupt machbar ist. Ob das Machbar ist mit diesem Codeschnipsel. Und mir Tips zur Lösung an die Hand zu geben.
Private Sub btnClose_Click()
Unload Me
End Sub
Private Sub btnLoadTree_Click()
' Dies ist das Click-Ereignis einer Schaltfläche in der UserForm.
' Es setzt einige Optionen und ruft dann die Prozedur auf
' CreateFolderTreeView, das tatsächlich die erstellt
' Baum.
Dim TVX As MSComctlLib.TreeView
Dim TopFolderName As String
Dim ShowFullPaths As Boolean
Dim ShowFiles As Boolean
Dim ItemDescriptionToTag As Boolean
' Options
' Wenn ShowFullPaths True ist, wird die
' vollständig qualifizierter Ordner und Datei
' Namen erscheinen im Baum. Wenn
' ShowFullpaths ist False, nur die
' Name des Ordners oder der Datei ist
' im Baum angezeigt.
ShowFullPaths = False
' Wenn ShowFiles True ist, werden Dateien aufgelistet
' unterhalb des Ordners, in dem sie sich befinden.
' Wenn ShowFiles False ist, sind es die Dateien nicht
' im Baum aufgelistet und nur Ordner
' aufgeführt sind.
ShowFiles = True
' Wenn ItemDescriptionToTag True ist, wird die
' Tag-Eigenschaft jedes Knotens enthält
' folgte das Wort FOLDER oder FILE.
' von vbCrLf, gefolgt von dem vollständig qualifizierten
' Name des Ordners oder der Datei. Diese Information
' kann verwendet werden, um den Ordner oder die Datei zu identifizieren
', auf die sich der Knoten bezieht.
ItemDescriptionToTag = True
' NACH ORDNERCODE SUCHEN
' VERFÜGBAR UNTER www.cpearson.com/Excel/BrowseFolder.aspx
' http://www.cpearson.com/Excel/BrowseFolder.aspx
', damit der Benutzer den Ordner der obersten Ebene auswählen kann.
' In Ihrem Code können Sie einen expliziten Ordner zuweisen
' Name in die Variable TopFolderName oder abrufen
' den Ordnernamen mit einem beliebigen Mechanismus.
' Wie auch immer Sie es tun, TopFolderName muss gesetzt sein
' zum Namen eines vorhandenen Ordners.
TopFolderName = ("C:\") 'Dateipfad ANGEBEN
If TopFolderName = vbNullString Then
MsgBox "Operation Cancelled", vbOKOnly, Me.Caption
Exit Sub
End If
' Stellen Sie sicher, dass der Ordner vorhanden ist.
If Dir(TopFolderName, vbDirectory) = vbNullString Then
MsgBox "Folder: '" & TopFolderName & "' does not exist.", vbOKOnly, Me.Caption
Exit Sub
End If
' Erstellen Sie den eigentlichen Baum
' Knoten.
CreateFolderTreeView TVX:=Me.TreeView1, _
TopFolderName:=TopFolderName, _
ShowFullPaths:=ShowFullPaths, _
ShowFiles:=ShowFiles, _
ItemDescriptionToTag:=ItemDescriptionToTag
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim Arr As Variant
Dim SelectedNode As MSComctlLib.Node
Dim S As String
Set SelectedNode = Me.TreeView1.SelectedItem
If SelectedNode Is Nothing Then
MsgBox "No Node Selected", vbOKOnly, Me.Caption
Exit Sub
End If
End Sub
Private Sub btnNodeInfo_Click()
' Dies zeigt Informationen über den Knoten an.
Dim Arr As Variant
Dim SelectedNode As MSComctlLib.Node
Dim S As String
Set SelectedNode = Me.TreeView1.SelectedItem
If SelectedNode Is Nothing Then
MsgBox "No Node Selected", vbOKOnly, Me.Caption
Exit Sub
End If
With SelectedNode
S = .Text & vbCrLf
If Len(.Tag) > 0 Then
Arr = Split(.Tag, vbCrLf)
S = S & "Item Is: " & Arr(LBound(Arr)) & vbCrLf
S = S & "Refers To: " & Arr(LBound(Arr) + 1) & vbCrLf
S = S & "Count Of Children: " & CStr(.Children) & vbCrLf
Else
S = .Text & vbCrLf
S = S & "Count Of Children: " & CStr(.Children)
End If
MsgBox S, vbOKOnly, .Text
End With
End Sub
Public Sub CreateFolderTreeView(TVX As MSComctlLib.TreeView, _
TopFolderName As String, _
ShowFullPaths As Boolean, _
ShowFiles As Boolean, _
ItemDescriptionToTag As Boolean)
' Diese Prozedur lädt das TreeView mit Datei und Ordner
'Elemente.
'Parameter:
' TVX: Das zu ladende TreeView-Steuerelement.
' TopFolderName: Der vollständig qualifizierte Ordnername
', deren Inhalt aufgelistet werden soll.
' ShowFullPaths: Wenn True, werden die Elemente im Baum angezeigt
' den vollständig qualifizierten Ordner- oder Dateinamen anzeigen. Wenn
' Falsch, nur der Name, ohne Pfadangabe, wird
' angezeigt werden.
' ShowFiles: Wenn True, werden Dateien innerhalb eines Ordners aufgelistet.
' Bei False werden nur Ordner, keine Dateien im angezeigt
' Baumliste.
' ItemDescriptionToTag: Wenn True, Informationen über die
' Datei oder Ordner wird in der Tag-Eigenschaft von gespeichert
'Knoten. Diese Information ist entweder das Wort "ORDNER"
' oder "FILE" gefolgt von einem vbCrLf gefolgt von dem Fully
' Qualifizierter Name des Ordners oder der Datei.
' Dieser Code kann sich in einem Standardcodemodul befinden - it
' muss nicht im Codemodul der UserForm enthalten sein.
Dim TopFolder As Scripting.Folder
Dim OneFile As Scripting.File
Dim FSO As Scripting.FileSystemObject
Dim TopNode As MSComctlLib.Node
Dim S As String
Dim FileNode As MSComctlLib.Node
Set FSO = New Scripting.FileSystemObject
' Löschen Sie den Baum
TVX.Nodes.Clear
Set TopFolder = FSO.GetFolder(folderpath:=TopFolderName)
' Erstellen Sie den obersten Knoten der
' Baumsicht.
If ShowFullPaths = True Then
S = TopFolder.Path
Else
S = TopFolder.Name
End If
Set TopNode = TVX.Nodes.Add(Text:=S)
If ItemDescriptionToTag = True Then
TopNode.Tag = "FOLDER" & vbCrLf & TopFolder.Path
End If
' CreateNodes aufrufen. Dieses Verfahren erstellt
' alle Knoten des Baums mit a
' rekursive Technik - also der Code
' ruft sich selbst auf, um untergeordnete Knoten zu erstellen, Kind
' von untergeordneten Knoten usw.
CreateNodes TVX:=TVX, _
FSO:=FSO, _
ParentNode:=TopNode, _
FolderObject:=TopFolder, _
ShowFullPaths:=ShowFullPaths, _
ShowFiles:=ShowFiles, _
ItemDescriptionToTag:=ItemDescriptionToTag
' Nachdem alle Unterordner erstellt wurden,
' müssen wir die Ordner hinzufügen, die
' befinden sich direkt unter dem TopFolder.
If ShowFiles = True Then
For Each OneFile In TopFolder.Files
If ShowFullPaths = True Then
S = OneFile.Path
Else
S = OneFile.Name
End If
Set FileNode = TVX.Nodes.Add(relative:=TopNode, relationship:=tvwChild, Text:=S)
If ItemDescriptionToTag = True Then
FileNode.Tag = "FILE" & vbCrLf & OneFile.Path
End If
Next OneFile
End If
' Endlich, jetzt, wo alles hat
' zur TreeView hinzugefügt wurde, erweitern
' der oberste Knoten.
With TVX.Nodes
If .Count > 0 Then
.Item(1).Expanded = True
End If
End With
End Sub
Private Sub CreateNodes(TVX As MSComctlLib.TreeView, _
FSO As Scripting.FileSystemObject, _
ParentNode As MSComctlLib.Node, _
FolderObject As Scripting.Folder, _
ShowFullPaths As Boolean, _
ShowFiles As Boolean, _
ItemDescriptionToTag As Boolean)
'Dieses Verfahren erstellt die Knoten im Baum. Dies
' Prozedur kann sich in einem Standardcodemodul befinden --
' muss sich nicht im Codemodul der UserForm befinden.
' Diese Prozedur verwendet eine rekursive Technik zum Erstellen
' untergeordnete Knoten. Das heißt, es ruft selbst zum Bauen auf
' Kinder, Kinder von Kindern und so weiter.
'Parameter:
' TVX: Das TreeView steuert, wozu die Knoten werden
' hinzugefügt werden.
' FSO: Ein FileSystemObject, das zum Auflisten von Unterordnern verwendet wird
' und Dateien von FolderObject.
' ParentNode: Der Knoten, der der übergeordnete Knoten sein wird
' alle Knoten, die durch die aktuelle Iteration davon erstellt wurden
' Verfahren.
' FolderObject: Das Folder-Objekt, dessen Inhalt wir
' werden aufgelistet. Das TreeView-Element für
' FolderObject wurde bereits zum Baum hinzugefügt.
' ShowFullPaths: Wenn True, werden Elemente im Baum angezeigt
' den vollständig qualifizierten Ordner- oder Dateinamen anzeigen. Wenn
' Falsch, nur der Name des Ordners oder der Datei wird
' erscheinen im Baum. Es werden keine Pfadinformationen angezeigt
' angezeigt.
' ShowFiles: Wenn True, werden Dateien innerhalb eines Ordners aufgelistet
' im Baum. Bei False werden keine Dateien aufgelistet und
' In der Baumstruktur werden nur Ordner angezeigt.
' ItemDescriptionToTag: Wenn True, Informationen über die
'-Ordner oder -Datei wird in der Tag-Eigenschaft von gespeichert
' Knoten. Die Information ist das Wort "FOLDER" oder "FILE"
', gefolgt von einem vbCrLF, gefolgt von dem vollständig qualifizierten
' Name des Ordners oder der Datei. Wenn falsch, keine Informationen
' wird in der Tag-Eigenschaft gespeichert.
Dim SubNode As MSComctlLib.Node
Dim FileNode As MSComctlLib.Node
Dim OneSubFolder As Scripting.Folder
Dim OneFile As Scripting.File
Dim S As String
'Verarbeiten Sie jeden Ordner direkt unter FolderObject.
For Each OneSubFolder In FolderObject.SubFolders
If ShowFullPaths = True Then
S = OneSubFolder.Path
Else
S = OneSubFolder.Name
End If
'Fügen Sie den Knoten dem Baum hinzu.
Set SubNode = TVX.Nodes.Add(relative:=ParentNode, relationship:=tvwChild, Text:=S)
If ItemDescriptionToTag = True Then
SubNode.Tag = "FOLDER" & vbCrLf & OneSubFolder.Path
End If
' Rekursiver Code. CreateNodes ruft sich selbst auf
', um dem Baum Unterknoten hinzuzufügen. Diese Rekursion
' erschafft die Kinder, Kinder von Kindern,
' und so weiter.
CreateNodes TVX:=TVX, _
FSO:=FSO, _
ParentNode:=SubNode, _
FolderObject:=OneSubFolder, _
ShowFullPaths:=ShowFullPaths, _
ShowFiles:=ShowFiles, _
ItemDescriptionToTag:=ItemDescriptionToTag
' Wenn ShowFiles True ist, Knoten hinzufügen
' für alle Dateien.
If ShowFiles = True Then
For Each OneFile In OneSubFolder.Files
If ShowFullPaths = True Then
S = OneFile.Path
Else
S = OneFile.Name
End If
Set FileNode = TVX.Nodes.Add(relative:=SubNode, relationship:=tvwChild, Text:=S)
If ItemDescriptionToTag = True Then
FileNode.Tag = "FILE" & vbCrLf & OneFile.Path
End If
Next OneFile
End If
Next OneSubFolder
End Sub
Für jegliche Tips bin ich dankbar!Eine Bespielmappe habe ich hochgeladen.
https://www.herber.de/bbs/user/151254.xlsm