Verknüpfung (.lnk) in Tabelle einlesen und automatisch verlinken

  • Excel

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Marco123.

    Verknüpfung (.lnk) in Tabelle einlesen und automatisch verlinken

    Hallo Forum,

    ich versuche mich schon längerem an folgender Aufgabe:

    - Alle SubOrdner und Dateien aus einem Verzeichnis in eine Excel-Tabelle einlesen und automatisch verlinken

    Bei meiner Suche in den unendlichen Weiten des Internets bin ich auch auf einen sehr guten VBA-Code gestoßen, wobei ich zugeben muss, dass ich nicht mehr genau weiß wo ich ihn gefunden habe.
    Diesen Code hab ich entsprechend am meine Bedürfnisse angepasst und er macht auch genau das was er soll.
    Sämtliche Subordner werden aufgelistet und alle darin enthaltenen Dateien (Excel, Word, PP, etc) werden automatisch verlinkt.

    Soweit so gut.

    Eine kleine Zusatzfunktion würde das ganze jedoch noch abrunden:
    - eine funktionierende automatische Verlinkung einer Verknüpfung (.lnk)

    Alle in den Ordnern vorhandene Verknüpfung (.lnk) werden eingelesen, aufgelistet und auch mit einem Hyperlink versehen, aber dieser lässt sich dann nicht nutzen.

    Visual Basic-Quellcode

    1. Sub Ordner_auslesen()
    2. On Error GoTo ENDE
    3. 'Hauptordner auflisten
    4. Dim FileSystem As Object
    5. Dim Unterordner
    6. Dim Datei
    7. Dim Zeile As Long
    8. Dim Spalte As Long
    9. Dim Ordner
    10. Set Ws = Tabelle003
    11. Set FileSystem = CreateObject("Scripting.FileSystemObject")
    12. Spalte = 5
    13. Zeile = 14
    14. 'Alter Inhalt l?schen
    15. Ws.Range("E15:E1000").ClearContents
    16. 'Aktualisierung ausschalten
    17. With Application
    18. .ScreenUpdating = False
    19. .Calculation = xlCalculationManual
    20. .EnableEvents = False
    21. End With
    22. ' Ordner ausw?hlen
    23. 'Ordner = GetFolder()
    24. ' Festen Ordner definieren
    25. Ordner = Ws.Cells(10, 5) 'Ordnerpfad einlesen
    26. If FileSystem.FolderExists(Ordner) Then
    27. Set Ordner = FileSystem.GetFolder(Ordner)
    28. For Each Datei In Ordner.Files
    29. Zeile = Zeile + 1
    30. ' Dateiname mit Pfad wird aufgelistet
    31. ' Ws.Cells(Zeile, Spalte).Value = Datei
    32. ' Nur der Dateiname wird aufgelistet
    33. Ws.Cells(Zeile, Spalte).Value = Datei.Name
    34. 'Ws.Cells(Zeile, Spalte - 2).Value = Datei.DateCreated
    35. 'Ws.Cells(Zeile, Spalte - 1).Value = Datei.DateLastModified
    36. 'Ws.Cells(Zeile, Spalte + 1).Value = Datei
    37. ' Wenn mit Hyperlink zur Datei dann
    38. Ws.Hyperlinks.Add Ws.Cells(Zeile, Spalte), Ordner
    39. Next
    40. ListOrdner Ordner, Zeile, 5 'Versatz f?r die Auflistung der Unterordner
    41. End If
    42. 'Aktualisierung einschalten
    43. With Application
    44. .ScreenUpdating = True
    45. .Calculation = xlCalculationAutomatic
    46. .EnableEvents = True
    47. End With
    48. Range("A1").Select
    49. ENDE:
    50. End Sub
    51. Sub ListOrdner(Ordner, Zeile, Spalte)
    52. 'Unterordner auflisten
    53. Dim FileSystem As Object
    54. Dim Unterordner
    55. Dim Datei
    56. Set Ws = Tabelle003
    57. Set FileSystem = CreateObject("Scripting.FileSystemObject")
    58. If FileSystem.FolderExists(Ordner) Then
    59. Set Ordner = FileSystem.GetFolder(Ordner)
    60. For Each Unterordner In Ordner.subfolders
    61. Zeile = Zeile + 1
    62. With Ws.Cells(Zeile, Spalte)
    63. ' Ordner mit Pfad angeben
    64. ' .Value = Unterordner
    65. ' nur Ordnernamen angeben
    66. .Value = Unterordner.Name
    67. ' Zellformatierung
    68. .Font.Bold = True
    69. .Font.Underline = False
    70. .Font.Color = RGB(0, 0, 0)
    71. '.Interior.Color = RGB(255, 255, 0)
    72. End With
    73. For Each Datei In Unterordner.Files
    74. Zeile = Zeile + 1
    75. ' Dateiname mit Pfad wird aufgelistet
    76. ' Ws.Cells(Zeile, Spalte).Value = Datei
    77. ' Nur der Dateiname wird aufgelistet
    78. Ws.Cells(Zeile, Spalte).Value = Datei.Name
    79. 'Ws.Cells(Zeile, Spalte - 2).Value = Datei.DateCreated
    80. 'Ws.Cells(Zeile, Spalte - 1).Value = Datei.DateLastModified
    81. 'Ws.Cells(Zeile, Spalte + 1).Value = Datei
    82. ' Wenn mit Hyperlink zur Datei dann
    83. Ws.Hyperlinks.Add Ws.Cells(Zeile, Spalte), Datei
    84. Next
    85. ListOrdner Unterordner, Zeile, Spalte
    86. Next
    87. End If
    88. End Sub
    89. Private Function GetFolder() As String
    90. 'Funktion um den Ordner auszuw?hlen
    91. Dim objShell As Object
    92. Dim strPath As String
    93. Set objShell = CreateObject("Shell.Application")
    94. Set varFolder = objShell.BrowseForFolder(0, "Folder", &H4000, 17)
    95. If varFolder Is Nothing Then
    96. Set varFolder = Nothing
    97. Set objShell = Nothing
    98. Exit Function
    99. End If
    100. GetFolder = varFolder.Self.Path
    101. Set objShell = Nothing
    102. End Function



    Hat sich evtl. einer von Euch schonmal mit einer ähnlichen Herausforderung rumgeplagt?Falls ja, was war die Lösung des ganzen?
    Kann man überhaupt einen funktionierenden Hyperlink auf eine Verknüpfung setzen?

    Ich bin gespannt auf Eure Rücklmeldungen.Vielen Dank im Voraus :)

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Hast Du mal die Adresse überprüft? Was gibt er denn aus für 'Ordner' bzw. in Deiner zweiten Sub für 'Datei'?

    Visual Basic-Quellcode

    1. Ws.Hyperlinks.Add Ws.Cells(Zeile, Spalte), Ordner


    Visual Basic-Quellcode

    1. Ws.Hyperlinks.Add Ws.Cells(Zeile, Spalte), Datei


    die Farbe Rot ist der Moderation vorbehalten und wurde ersetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo cry.baby,

    der Code im Sub Ordner_auslesen (Zeile 45) hat eigentlich keine Auswirkungen.
    Auch wenn ich den Part rausnehme, läuft alles wie gewohnt.
    Ist wohl ein Überbleibsel vor Originalcode.

    Der Code im Sub ListOrdner (Zeile 100) beeinflusst, worauf verlinkt wird
    - Ws.Hyperlinks.Add Ws.Cells(Zeile, Spalte), Datei bewirkt eine Verlinkung auf direkt auf die Datei im Unterordner
    - Ws.Hyperlinks.Add Ws.Cells(Zeile, Spalte), Ordner bewirkt eine Verlinkung auf den Ordner in dem sich der Unterordner befindet

    Wie gesagt, die automatischen Verlinkungen laufen eigentlich einwandfrei, bis halt auf das Thema .lnk.
    Ich befürchte jedoch, dass ein Hyperlink auf eine Verknüpfung nicht möglich zu sein scheint.
    Hab es grade nochmal mit der Formel =Hyperlink() versucht.
    Hierbei kommt es zum gleichen Problem:
    - Hyperlink wird erzeugt
    - MS Office fragt, ob ich wirklich öffnen möchte
    - nach Bestätigung blauer Ladekreis und das war es dann

    Evtl. übersehe ich auch etwas ganz einfaches.
    Wenn mich also jemand wieder auf Spur bringen kann, darf er/sie das gerne machen :)

    CodeTags gesetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hi cry.baby,

    Sämtliche innerhalb des auszulesenden Ordners abgelegte Dateien werden eingelesen, aufgelistet und erhalten einen Hyperlink.
    Der o.g. Code setzt eigenständig die jeweiligen Hyperlinks, halt automatisch ohne manuellen Aufwand.

    Was mit einzelnen Dateien (xlsx., docx, .ppt, etc.) wunderbar funktioniert soll nach Möglichkeit auch mit Verknüpfungen (.lnk) geschehen, welche in dem ausgelesenen Ordner vorhanden sind.

    Es sollen also auch Verlinkungen verlinkt werden.
    Ich verstehe Deinen Vorschlag, muss jedoch zugeben das ich anscheinend nicht in der Lage bin, diesen umzusetzen.
    Hab jetzt mit meinem Anfängerwissen einige Male probiert umzusetzen, scheitere jedoch jedes Mal.

    Um mein Unwissen irgendwie mit Laub zu bedecken hab ich parallel noch nach einem Plan B gesucht … und hab zumindest einen Ansatz gefunden:

    Mit dem Code lässt sich das Ziel einen Verknüpfung auslesen:

    Visual Basic-Quellcode

    1. Public Sub Verknuepfungen_auslesen()
    2. Dim objShell As Object
    3. Dim Unterordner As Object
    4. Dim Datei As Object
    5. Dim Link As Object
    6. Set objShell = CreateObject("Shell.Application")
    7. Set Unterordner = objShell.Namespace("hier Pfad einfügen")
    8. For Each Datei In Unterordner.items
    9. If Datei.IsLink Then
    10. Set Link = Datei.GetLink
    11. Call MsgBox(Link.Path)
    12. End If
    13. Next
    14. Set Link = Nothing
    15. Set Unterordner = Nothing
    16. Set objShell = Nothing
    17. End Sub



    Mein Gedanke war halt: Wenn ich was auslesen kann, kann ich doch auch benutzen.
    Aber, was soll ich sagen, dann stellte mir meine Unfähigkeit wieder ein Bein.
    Ich habs nicht hinbekommen, den Code in meinen bestehenden Code (s.o.) einzubauen.

    Was meinst Du?
    Wie ließe sich sowas miteinander verbinden?

    Korrekte Code-Tags gesetzt ~ EaranMaleasi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EaranMaleasi“ ()

    Es geht sogar noch einfacher. Wenn Du bei der Adressierung Deines Hyperlinks anstelle dem Datei-Namen einfach ShortPath verwendest, funktioniert es auch (Code Zeil 100):

    Visual Basic-Quellcode

    1. Ws.Hyperlinks.Add Ws.Cells(Zeile, Spalte), Datei.ShortPath


    Die Code-Zeile 94 kannst Du Dir übrigens sparen:

    Visual Basic-Quellcode

    1. Ws.Cells(Zeile, Spalte).Value = Datei.Name
    Sorry für meine verspätete Rückmeldung.
    Habe Deinen Vorschlag umgesetzt und musste leider erkennen, musste aber leider erkennen, dass das Ergebnis anscheinend das gleiche ist.

    Dennoch habe ich die Aufgabe auf andere Art lösen können, wenn diese auch etwas mehr der Vorgehensweise "von hinten durch die Brust in Auge" gleicht.
    Hier mein Lösungsweg:
    1. Entfernung der Code-Zeile 100 (Erstellung Hyperlink)
    2. Datenübernahme in ListBox (Dateiname, Pfad)
    3. Übertrag Auswahl ListBox in fixe Zellen (Dateiname = A1, Pfad = B1)
    4. Öffnen des Pfads (Zelle B1) mit folgendem Code:

    Visual Basic-Quellcode

    1. Sub Öffnen()
    2. On Error GoTo ENDE
    3. Dim Pfad As String
    4. Pfad = Tabelle003.Range("B1")
    5. Shell "explorer.exe /e, " & Pfad, vbMaximizedFocus
    6. ENDE:
    7. End Sub



    Hätte man sicherlich eleganter lösen können, aber es funktioniert bisher tadellos.
    Alle Dateien und Verlinkungen innerhalb des ausgelesenen Ordners lassen sich nun ohne weiteres öffnen.

    Besten Dank für Deine Hilfe.
    Auch wenn ich letztendlich einen anderen Weg gegangen bin, hast Du mir die nötigen Impulse gegeben.

    Korrekte Code-Tags gesetzt ~ EaranMaleasi

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „EaranMaleasi“ ()

    @Marco123 Nimm dir die Links die @VaporiZed und ich dir geschickt haben zu Herzen. Korrektes Auswählen der Code-Tags (entweder über die Buttons im Editor, oder händisches Einfügen des korrekten Tags) erhöht die Lesbarkeit des Codes für alle Beteiligten. Es sollte nicht unsere Aufgabe sein, hinter jedem einzelnen User aufräumen zu müssen.
    @EaranMaleasi Vielen Dank für den Hinweis.
    Ich hab die Korrekturen und die "Einfärbungen" gesehen und mich schon gefragt wie das geht.
    Hab nun auch die Verlinkung erkannt, mir die nötigen Infos besorgt und anhand eines Beispiels getestet => funktioniert.

    Ab nun muss man hoffentlich nicht mehr hinter mir aufräumen :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marco123“ ()