Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1868to1872
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Frage zu Treeview

Frage zu Treeview
21.02.2022 00:16:53
Bernd
Hallo Zusammen,
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

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Frage zu Treeview
21.02.2022 09:48:49
Alwin
Hallo Bernd,
das funktioniert erst mal normal. Das Problem sind die versteckten und gesperrten Dateien/Verzeichnisse. Die Radikale Methode ist on error. Dazu muss nur in einer Prozedur das gemacht werden:

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.
On Error GoTo handler
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
Exit Sub
handler:
End Sub
Gruß Uwe
Anzeige
AW: Frage zu Treeview
21.02.2022 12:42:08
Bernd
Hallo Uwe
vielen Dank für deine Antwort. Aber Sie verwirrt mich ehrlich gesagt. Den Eventhandler den du eingebaut hast greift ja nun bei einem Error springt dann zu der Marke Handler: und soll dort etwas anders tun was noch definiert werden müsste.
Da der Code aber bisher funktioniert und mir in den Unterordnern auch sämtliche Dateien angezeigt werden bin ich zwar dankbar für deine Antwort aber dennoch verwirrt. Vielleicht missverstehen wir uns auch :-)
Für mich löst es das Problem noch nicht das ich die im TreeView angezeigten Dateien nach klick auf einen übergeordneten Node. bzw Verzeichnis (Variable TopfolderName im Code habe ich selbst einfach mal auf Verzeichnis C.\ gesetzt, das Original Verzeichnis enthält nur .pdf dateien.) nicht in meine ListBox übertragen bekomme.
Ich denke bin mir aber nicht Sicher das in der TreeView1_NodeClick Prozedur nochmals eine Schleife notiert werden müsste die mir die einzelnen Dateinamen schnappt so viele wie halt unter dem Knoten/Verzeichnis vorhanden ist und in meine Listbox schiebt.
Ohje ich hoffe ich habe das nicht zu komnpliziert ausgedrückt ^^

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
''''''''''''''''  EIGENER erster  VERSUCH ''''''''''''''''''''
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)
ListBox1.List = FileNode
Next OneFile
End If
End Sub
Denn eigentlich habe ich in der Variable FileNode wenn ich diese Auslese meinen Dateinamen einen zwar nur aber immerhin
Anzeige
AW: Frage zu Treeview
21.02.2022 14:21:29
Alwin
an On Error braucht es keine Veränderung.
Den Verzeichnisinhalt in die Listbox holen geht nicht auf direkten Weg.
Mittels

strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
kann man den Pfad auslesen und dann die Dateien hinter dem Pfad in die Listbox einlesen. Wichtig: Das was ich dir liefere liest nur in die Listbox ein. Du musst, falls du die Dateinamen in der Listbox weiter verarbeiten willst, das Array: arrVerzeichnis in der Dimension erweitern und in einer Spalte den Pfad mitliefern.
Die Prozedur:
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim arrVerzeichnis(), sFiles
Dim strPfad As String
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
ReDim Preserve arrVerzeichnis(100000)
sFiles = Dir$(strPfad & "*.*")
Do While sFiles ""
arrVerzeichnis(VzWerte) = sFiles
VzWerte = VzWerte + 1
sFiles = Dir$()
Loop
If VzWerte > 0 Then
ReDim Preserve arrVerzeichnis(VzWerte - 1)
End If
With ListBox1
.Clear
.List = arrVerzeichnis
End With
End Sub
Gruß Uwe
Anzeige
AW: Frage zu Treeview
21.02.2022 14:28:25
Alwin
Sorry hatte vergessen die Variablen ordentlich zu deklarieren
Verwende zum Testen das so:

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim arrVerzeichnis(), sFiles As String, strPfad As String, VzWerte As Long
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
ReDim Preserve arrVerzeichnis(100000)
sFiles = Dir$(strPfad & "*.*")
Do While sFiles  ""
arrVerzeichnis(VzWerte) = sFiles
VzWerte = VzWerte + 1
sFiles = Dir$()
Loop
If VzWerte > 0 Then
ReDim Preserve arrVerzeichnis(VzWerte - 1)
End If
With ListBox1
.Clear
.List = arrVerzeichnis
End With
End Sub
Gruß Uwe
Anzeige
AW: Frage zu Treeview
21.02.2022 16:05:55
Bernd
Hallo Uwe,
WOW das funktioniert Super!
Herzlichen Dank für Deine Mühe!!
Nun ist mein Problem zur hälfte gelöst.
Deinen Code kann ich nach der etwas schöneren Deklaration der Variablen etwas besser nachvollziehen.
Allerdings komme ich hier wie auch bei dem Treeview Code an meine Grenzen. Es ist recht abstrakt bei Leichterem VBA Code wo irgend welche Daten in eine Tabelle
geschrieben werden und aus der Tabelle die Daten weiterverarbeite werden ist das echt einfacher zu verstehen weil es für mich "greifbarer" ist, ich denke du verstehst was ich meine :-)
Um die zweite hälfte meines Problems zu lösen werde ich mir heute Abend und morgen in Ruhe deinen Code angucken und versuchen ihn zu verstehen, man kann ja schön im Lokalen Fenster des VBA Oberfläche gucken was da so passiert.
Mal gucken ob ich es selbst hinbekomme das Array zu erweitern und die Pfade in die Listbox zu Übernehmen.
Falls ich es nicht lösen kann würde ich mich einfach in ein paar tagen hier nochmal melden.
Falls das In Ordnung wäre.
.............Oder muss ich den Beitrag als Gelöst markieren?
Anzeige
AW: Frage zu Treeview
21.02.2022 16:30:35
Alwin
den Beitrag kannst du durch aus offen lassen.
Ich habe mich mit TreeView auch überhaupt noch nicht befasst und musste mir auch erst mal die Möglichkeiten anschauen. Die dicken Probleme kommen aber noch, wenn es um Anwendungssicherheit geht.
Gruß Uwe
Warum immer diese Arrays?
21.02.2022 16:56:08
Yal
Moin Uwe,
ich frage mich, warum man diese Listbox immer über einen Array initialisiert.
Es geht auch direkt und es ist wesentlich "leichter":

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim strPfad As String
Dim sFiles As String
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
sFiles = Dir$(strPfad & "*.xls*")
With ListBox1
.Clear
Do While sFiles  ""
.AddItem sFiles
sFiles = Dir$()
Loop
End With
End Sub
Und wenn schon über Array, dann folgende Vorschlag:

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim arrVerz()
Dim sFiles As String
Dim strPfad As String
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
arrVerz = Array() 'Dummy-Init, sodass UBound -1 ergibt.
sFiles = Dir$(strPfad & "*.*")
Do While sFiles  ""
ReDim Preserve arrVerz(UBound(arrVerz) + 1)
arrVerz(UBound(arrVerz)) = sFiles
sFiles = Dir$()
Loop
With ListBox1
.Clear
.List = arrVerz
End With
End Sub
VG
Yal
Anzeige
AW: Warum immer diese Arrays?
21.02.2022 20:58:49
Alwin
Hallo Yal,
na ja, zum Üben eben. Da kein anderer über den Tag drauf reagiert hatte, habe ich das mal reingestellt. Ich habe das TreeView erst mal selbst nach installieren müssen, um zu sehen was es damit überhaupt auf sich hat bzw. wie man das lösen kann, oder wie du es so treffend schon meintest - Sodoku eben. Hab ich mir gemerkt!
Da sind noch einige Dinge was Excel und VBA betrifft, die ich noch erforschen und ausprobieren will. Das TreeView schein schon eher was Spezielles/Exotisches zu sein.
Ich habe mir natülich deine Vorschläge angeschaut. Da sieht man natürlich klar wer es richtig gelernt hat und wer noch lernen und testen ist.
Gruß Uwe
Anzeige
;-)
22.02.2022 10:57:07
Yal
Da ticken wir gleich.
VG
Yal
AW: Warum immer diese Arrays?
22.02.2022 16:20:31
Bernd
Hallo Yal
Hallo Uwe
Yal danke dir für die Alternative ohne das Array das ist für mich etwas besser nachvollziehbar.
Ich habe deine Lösung auch heute ausprobiert, und sie funktioniert genauso gut wie die von Uwe
Ich habe nun mal ganz kurz Probiert die Pfade der Dateien einfach in eine zweite ListBox eintragen zu lassen,
mit dem Erfolg das Excel bei Ausführen nun regelmäßig abschmiert, irgendwie ne dauerschleife :-)

strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
Ich dachte mir ganz schlau das ich mit der Variable strPfad weiterarbeiten kann da diese ja den kompletten Pfad der Datei beeinhaltet.
Das hat erstmal nicht funktioniert .

Dim strPfad As String
Dim sFiles As String
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
sFiles = Dir$(strPfad & "*.*")
With ListBox1
.Clear
Do While sFiles  ""
.AddItem sFiles
sFiles = Dir$()
Loop
End With
With ListBox2
.Clear
Do While strPfad  ""
.AddItem strPfad
Loop
End With
Das war allerdings ein Schnellschuss ich konnte bisher noch nicht weiter probieren. Mir ist der "Mid" Befehl auch völlig fremd. Das was ich darüber kurz gelesen hatte ist das Eine Byte Position in der Variable durch eine andere Bytes ersetzt wird, wieder etwas sehr abstraktes für mich und ich muss das heute Abend zu hause nochmal gründlicher nachlesen.
Liege ich denn mit meiner Vermutung die strPfad variable weiterzuverarbeiten richtig?
Grüße Bernd
Anzeige
AW: Warum immer diese Arrays?
22.02.2022 21:34:02
Alwin
Hallo Bernd,
Warum eine 2. Listbox? Du musst nur in deiner Listbox z.B. in Spalte 1 den Pfad übertragen, welcher in jeder Zeile ja gleich ist und in Spalte 2 deine gefundenen Dateien reinladen. Mir fehlt heute Abend leider die Zeit, da mich mein Nachbar zum Bier eingeladen hat. Ich hatte gestern aus Neugier einfach noch mit meinem "ArrayKonstrukt" alles fertig gebaut. Da ist schon die Aufteilung in 2 Spalten und Fehlerbereinigung drin. Die Version ohne Array + 2. Spalte setzte ich am Donnerstag noch rein, es sei denn Yal ist da schneller als ich.

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim arrVerzeichnis(), sFiles As String, strPfad As String, VzWerte As Long, i As Long, arrAusgabe As Variant
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
ReDim Preserve arrVerzeichnis(100000)
On Error GoTo handler
sFiles = Dir$(strPfad & "*.*")
Do While sFiles  ""
arrVerzeichnis(VzWerte) = sFiles
VzWerte = VzWerte + 1
sFiles = Dir$()
Loop
If VzWerte > 0 Then
ReDim Preserve arrVerzeichnis(VzWerte - 1)
ReDim arrAusgabe(1 To UBound(arrVerzeichnis, 1) + 1, 1 To LBound(arrVerzeichnis, 1) + 2)
For i = 1 To UBound(arrVerzeichnis, 1) + 1
arrAusgabe(i, 1) = strPfad
arrAusgabe(i, 2) = arrVerzeichnis(i - 1)
Next i
End If
If Not IsEmpty(arrAusgabe) Then
With ListBox1
.Clear
.List = arrAusgabe
End With
Else
With ListBox1
.Clear
.AddItem strPfad
.List(.ListCount - 1, 1) = "Keine Einträge vorhanden"
End With
End If
Exit Sub
handler:
With ListBox1
.Clear
.AddItem "Das ist kein Verzeichnis!"
End With
End Sub
Gruß Uwe
Anzeige
AW: Warum immer diese Arrays?
23.02.2022 08:19:58
Alwin
anbei der Rest, aber noch ohne Fehlerbereinigung:

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim strPfad As String
Dim sFiles As String
Dim i As Long
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
sFiles = Dir$(strPfad & "*.*")
With ListBox1
.Clear
Do While sFiles  ""
.AddItem strPfad
.List(.ListCount - 1, 1) = sFiles
sFiles = Dir$()
i = i + 1
Loop
End With
End Sub
Gruß Uwe
AW: Warum immer diese Arrays?
23.02.2022 11:16:05
Alwin
das i = i + 1 hatte ich vergessen raus zu nehmen, da ohne Funktion.
Mid funktioniert so: Die erste Ziffer gibt an ab welchen Zeichen übergeben wird und die zweite Ziffer wieviel Zeichen maximal übergeben werden. Wenn du das Mid entfernst siehst du, was aus dem Treeview übergeben wird und Mid entfernt was nicht gebraucht wird.
Gruß Uwe
AW: Warum immer diese Arrays?
23.02.2022 12:41:10
Bernd
Hallo Uwe
Die zweite ListBox war nur als Test gedacht. Danke für deine Erklärung von "Mid".
Ich habe grade eben deine Codeteile von Gestern Abend und heute Morgen zusammengefügt,

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim Arr As Variant
Dim SelectedNode As MSComctlLib.Node
Dim S As String
Dim arrVerzeichnis()
Dim sFiles As String
Dim strPfad As String
Dim VzWerte As Long
Dim i As Long
Dim arrAusgabe As Variant
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
Set SelectedNode = Me.TreeView1.SelectedItem
If SelectedNode Is Nothing Then
MsgBox "No Node Selected", vbOKOnly, Me.Caption
Exit Sub
End If
ReDim Preserve arrVerzeichnis(100000)
On Error GoTo handler
sFiles = Dir$(strPfad & "*.*")
Do While sFiles  ""
arrVerzeichnis(VzWerte) = sFiles
VzWerte = VzWerte + 1
sFiles = Dir$()
Loop
If VzWerte > 0 Then
ReDim Preserve arrVerzeichnis(VzWerte - 1)
ReDim arrAusgabe(1 To UBound(arrVerzeichnis, 1) + 1, 1 To LBound(arrVerzeichnis, 1) + 2)
For i = 1 To UBound(arrVerzeichnis, 1) + 1
arrAusgabe(i, 1) = strPfad
arrAusgabe(i, 2) = arrVerzeichnis(i - 1)
Next i
End If
If Not IsEmpty(arrAusgabe) Then
With ListBox1
.Clear
.List = arrAusgabe
End With
Else
With ListBox1
.Clear
Do While sFiles  ""
.AddItem strPfad
.List(.ListCount - 1, 1) = sFiles
sFiles = Dir$()
Loop
End With
End If
Exit Sub
handler:
With ListBox1
.Clear
.AddItem "Das ist kein Verzeichnis!"
End With
Alle drei Teile kombiniert funktionieren nicht so gut wie der Code von gestern abend. Gestern Abend hatte ich die Pfadangabe gesehen und die Datei in der Listbox.
Bei der Kombi von allen Teilen habe ich nur den Pfad.
Grüße Bernd
PS:
Ich freu mich schon auf deine zweite Version ohne Arrays. Da bin ich mal gespannt. :-)
AW: Warum immer diese Arrays?
23.02.2022 12:51:55
Bernd
Sorry Uwe
Mein Fehler. Ich hatte heute vergessen ColumnCount in den Eigenschaften des Objektfensters von der ListBox auf 2 zu setzten.
Nun funktioniert es. In der ersten Spalte sehe ich den Pfad und in der zweiten den Dateinamen.
Grüße Bernd
Version ohne Array 2-spaltig
23.02.2022 16:23:28
Alwin
Hallo Bernd,
die ohne Array aber mit 2 Spalten hatte ich weiter oben schon reingestellt. Schau mal unter:

anbei der Rest, aber noch ohne Fehlerbereinigung:
Da steht auch der Teil i = i + 1 nebst Dim i as long noch drin, was ich vergessen hatte rauszunehmen.
Gruß Uwe
AW: Version ohne Array 2-spaltig
24.02.2022 00:29:12
Bernd
Hallo Uwe
Ja Mensch die Version ohne dieses Array ist ja genial. Mit so wenig Code soviel zu erreichen ist toll. Ich wäre daran aber verzweifelt denn soweit bin ich mit VBA noch lange nicht.
Ich habe also deinen Code eingebaut und auch die Fehlerbereinigung eingefügt, was nicht schwer war.

Dim strPfad As String
Dim sFiles As String
On Error GoTo handler
strPfad = Mid(TreeView1.SelectedItem.Tag, 9, 1000) & "\"
sFiles = Dir$(strPfad & "*.*")
With ListBox1
.Clear
Do While sFiles  ""
.AddItem strPfad
.List(.ListCount - 1, 1) = sFiles
sFiles = Dir$()
Loop
End With
Exit Sub
handler:
With ListBox1
.Clear
.AddItem "Das ist kein Verzeichnis!"
End With
Danach habe ich mir Gedanken gemach wie ich nun die Einträge in der ListBox1 per Doppelklick öffnen kann.
Ich habe das Programm dann schritt für schritt ausführen lassen und lokalen Bereich geschaut was da so alles passiert.
Im Direktfenster habe ich dann zunächst geprüft wie ich die Einträge in den zwei Spalten der ListBox "zusammenkleben" kann damit ich einen vollständigen Pfad zur Datei bekomme. Das hat mit folgenden Zeile funktioniert.

ListBox1.Text + ListBox1.List(ListBox1.ListCount -1, 1)
Anschließend habe ich im doppelklick event der Listbox folgendes geschrieben

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Pfad As String
Dim Datei As String
Pfad = ListBox1.Text
Datei = ListBox1.List(ListBox1.ListCount - 1, 1)
Dateiname = Pfad & Datei
Application.Workbooks.Open Dateiname
End Sub
Das funktioniert zwar soweit allerdings öffnet er eine dann eine excel Datei und fügt Kauderwelsch auf das Excel Blatt ein, ja klar weil ich ja eigentlich eine .pdf öffne.
Ich denke ich bin aber kurz vor der Lösung. Ich gucke mir Morgen nochmal an durch was ich das

Application.Workbooks.Open Dateiname
ersetzen muss damit mir die Dateien geöffnet werden ich vermute über FSO oder Shell.
Grüße Bernd
AW: Version ohne Array 2-spaltig
24.02.2022 09:19:18
Bernd
Guten Morgen Uwe
Das hat mir nun in der nacht keine Ruhe gelassen.
Mit folgendem Befehl ist es nun möglich die Dateien die in der ListBox aufgelistet werden zu öffnen.

ActiveWorkbook.FollowHyperlink Dateiname

Ich habe nun noch die Breite der ersten Spalte der Listbox auf 1 gesetzt, einfach damit man die Pfad Angabe nicht sieht sondern nur die Datei. Funktioniert ebenfalls wunderbar.
Grüße Bernd

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige