Herbers Excel-Forum - das Archiv

VBA Links im Verzeichnis auslesen


Betrifft: VBA Links im Verzeichnis auslesen
von: ImpCaligula

Geschrieben am: 09.09.2019 15:27:34
Salve!
Ich habe folgendes Problem. Ich möchte auf meiner Arbeit ein Excel Makro erstellen, bei dem ich bei Aufruf / Start ein Verzeichnis / Ordner auswähle und er mir alle Dateien - als Beispiel - von A1 bis A100 auflistet.
Das klappt auch bei "normalen" Verzeichnissen wunderbar.
Wenn ich den Ordner Test auf dem Desktop auswähle, bekomme ich als Ergebnis in den Zellen die Auflistung aller Dateien in diesem Ordner.
A1: textdatei1.doc
A2: textdatei2.docx
A3: textdatei3.rtf
A4: exceldatei1.xlsx
Und so weiter.
Nun aber zum eigentlichen Problem. Wir haben da ein Dokumenten Management System (ECM) welches Word und Excel Dateien archiviert werden. Im Windows Explorer kann ich mir das ECM Verzeichnis auch anschauen und bei allen Anwendungen auch über Datei / Öffnen auch auf dieses Verzeichnis zugreifen.
/ecm/meinefirma/Dokumente/Datei12345
/ecm/meinefirma/Dokumente/Datei12346
/ecm/meinefirma/Dokumente/Datei12347
/ecm/meinefirma/Dokumente/einetestdatei.docx
/ecm/meinefirma/Dokumente/Datei12348
/ecm/meinefirma/Dokumente/Datei12349
Wenn man als Beispiel die Datei "Datei12345" im Windows Explorer anklickt wird auch WOPRD geöffnet und nicht erst das ECM System und darin die Word Datei. Wenn ich mein Makro starte nun auf dieses Beispiel Verzeichnis - dann bekomme ich als Ergebnis nur einen Treffer.
A1: einetestdatei.docx
Die anderen Dateien werden nicht aufgelistet.
Hat jemand eine Idee wie ich unter VBA mir diese "Dateien" anzeigen lassen kann?
Es scheint so als handle es sich hier um hinterlegte "Links" in dem Verzeichnis.
Für jede Hilfe sehr dankbar.

Betrifft: AW: VBA Links im Verzeichnis auslesen
von: 1712045.html

Geschrieben am: 09.09.2019 16:17:54
Hallo,
versuch es mal so:
Option Explicit

Public Sub Verknuepfungen_auslesen()
    
    Dim objShell As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim objLink As Object
    
    Set objShell = CreateObject(Class:="Shell.Application")
    
    Set objFolder = objShell.Namespace("C:\Dokumente und Einstellungen\HP\Desktop\")
    
    For Each objFile In objFolder.Items
        
        If objFile.IsLink Then
            
            Set objLink = objFile.GetLink
            
            With objLink
                
                Call MsgBox(.Path & vbLf & .Target.Path & vbLf & .Description)
                
            End With
        End If
    Next
    
    Set objLink = Nothing
    Set objFolder = Nothing
    Set objShell = Nothing
    
End Sub

Gruß
Nepumuk

Betrifft: AW: VBA Links im Verzeichnis auslesen
von: 1712095.html

Geschrieben am: 09.09.2019 20:16:46
Hallo Nepumuk,
erst einmal ganz herzlichen Dank, dass Du Dich meines Problems angenommen hast. An sich scheint das Makro zu funktionieren, jedoch nur, wenn ich den Pfad "Hardcode" eingebe.
Funktioniert:
Set objFolder = objShell.Namespace("C:\Dokumente und Einstellungen\HP\Desktop\")
Funktioniert nicht:
MyPath = ""C:\Dokumente und Einstellungen\HP\Desktop\"
Set objFolder = objShell.Namespace(MyPath)
Hintergrund ist, dass ich den Verzeichnis Pfad gerne über den FolderDialog relativ mit einer Variablen halten möchte. Hier noch eine Idee?

Betrifft: AW: VBA Links im Verzeichnis auslesen
von: 1712100.html
Geschrieben am: 09.09.2019 20:41:06
Hallo,
als welcher Variablentyp hast du MyPath dimensioniert? Das muss unbedingt ein String sein!
Gruß
Nepumuk

Betrifft: AW: VBA Links im Verzeichnis auslesen
von: 1712110.html

Geschrieben am: 09.09.2019 21:55:31

Dim objShell As Object
Dim objFolder As Object
Dim objFile As Object
Dim objLink As Object
Dim strPfad As String
strPfad = "C:\Users\Hans Meier\Desktop\"
Set objShell = CreateObject(Class:="Shell.Application")
Set objFolder = objShell.Namespace(strPfad)
For Each objFile In objFolder.Items
If objFile.IsLink Then
Set objLink = objFile.GetLink
With objLink
intI = intI + 1
MsgBox (.Path & vbLf & .Target.Path & vbLf & .Description)
End With
End If
Next
Set objLink = Nothing
Set objFolder = Nothing
Set objShell = Nothing

Schau mal bitte Nepumuk. So lautet der Code im Original.
Wenn ich den Pfad in Anführungszeichen direkt bei Namespace rein schreibe - geht das Makro durch. Wenn ich eine Variable nehme, dann blockiert er. Deklariert ist es als String.
Die Fehlermeldung ist:
Laufzeitfehler 91 - Objektvariable oder With Blockvariable nicht festgelegt.
Fehler tritt aber erst auf, sobald in der Namespace Zeile statt Hardcode die Variable der Platzhalter ist.

Betrifft: AW: VBA Links im Verzeichnis auslesen
von: 1712151.html
Geschrieben am: 10.09.2019 08:22:32
Hallo,
mein Fehler, tut mir leid. Die Variable muss als Variant deklariert sein. Also:

Option Explicit

Public Sub Verknuepfungen_auslesen()
    
    Dim objShell As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim objLink As Object
    Dim vntFolder As Variant
    
    vntFolder = "H:\0909\"
    
    Set objShell = CreateObject(Class:="Shell.Application")
    
    Set objFolder = objShell.Namespace(vntFolder)
    
    For Each objFile In objFolder.Items
        
        If objFile.IsLink Then
            
            Set objLink = objFile.GetLink
            
            With objLink
                
                Call MsgBox(.Path & vbLf & .Target.Path & vbLf & .Description)
                
            End With
        End If
    Next
    
    Set objLink = Nothing
    Set objFolder = Nothing
    Set objShell = Nothing
    
End Sub

Gruß
Nepumuk
Excel-Beispiele zum Thema "VBA Links im Verzeichnis auslesen"
Alle Dateien im Verzeichnis öffnen Verzeichnisbaum anlegen
Unterverzeichnisse mit Inhalt löschen Alle Dateien eines Verzeichnisses drucken
Ordner eines Verzeichnisses in ListBox übernehmen Dateinamen eines Verzeichnisses als HTML-Datei
Feststellen, ob eine Datei in einem Verzeichnis existiert xlSaveAs-Dialog in einem bestimmten Verzeichnis aufrufen
Verzeichnisbaum aufrufen und Dateien in ListBox auflisten Ordnernamen eines Verzeichnisses in Zelle einfügen