Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

UNC-Pfad

Forumthread: UNC-Pfad

UNC-Pfad
24.01.2018 10:13:05
Robert
Hallo,
ich möchte jeden Netzwerk-Pfad in einen UNC Pfad umwandeln. Es kommt vor, dass auf dem PC von dem aus die Datei geöffnet wird, nicht immer der selbe Laufwerksbuchstabe eingebunden ist oder nur eine Verknüpfung existiert. In diesen Fällen funktioniert der Code nicht. Ansonsten funktioniert er wie gewünscht. Ziel ist es, dass sich die Datei selber löscht wenn Sie von einem anderen Speicherort geöffnet wird. Gibt es eine Möglichkeit immer den UNC-Path zu ermitteln?
Private Sub Workbook_Open()
Dim intSh As Integer
Dim blnOK As Boolean
Dim strFile As String
If ThisWorkbook.FullName  "\\Server\test.xlsm" Then
Application.DisplayAlerts = False
ActiveWorkbook.ChangeFileAccess xlReadOnly
Kill ActiveWorkbook.FullName
ThisWorkbook.Close False
End If
Application.DisplayAlerts = True
End Sub
Grüsse Robert
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: UNC-Pfad
24.01.2018 11:03:56
Michael
Hallo!
Function GETNETWORKPATH(ByVal DriveName$) As String
Dim objNtWork As Object, objDrives As Object, lngLoop&
Set objNtWork = CreateObject("WScript.Network")
Set objDrives = objNtWork.enumnetworkdrives
For lngLoop = 0 To objDrives.Count - 1 Step 2
If UCase(objDrives.Item(lngLoop)) = UCase(DriveName) Then
GETNETWORKPATH = objDrives.Item(lngLoop + 1)
Exit For
End If
Next
End Function
LG
Michael
Anzeige
AW: UNC-Pfad
24.01.2018 11:30:10
Robert
Hallo Michael,
Danke für die Funktion. ich habe jedoch Schwierigkeiten diese korrekt einzubinden. Wie muss ich mein Code anpasen damit er mit der Funktion funktioniert?
Gruss Robert
AW: UNC-Pfad
24.01.2018 12:26:55
Michael
Hallo!
Private Sub Workbook_Open()
Const UNCDEFAULT$ = "\\Server\"
If GETNETWORKPATH(Left(ThisWorkbook.FullName, 2)) & "\"  UNCDEFAULT Then
Application.DisplayAlerts = False
ActiveWorkbook.ChangeFileAccess xlReadOnly
Kill ActiveWorkbook.FullName
ThisWorkbook.Close False
End If
Application.DisplayAlerts = True
End Sub
Private Function GETNETWORKPATH(ByVal DriveName$) As String
Dim objNtWork As Object, objDrives As Object, lngLoop&
Set objNtWork = CreateObject("WScript.Network")
Set objDrives = objNtWork.enumnetworkdrives
For lngLoop = 0 To objDrives.Count - 1 Step 2
If UCase(objDrives.Item(lngLoop)) = UCase(DriveName) Then
GETNETWORKPATH = objDrives.Item(lngLoop + 1)
Exit For
End If
Next
End Function
LG
Michael
Anzeige
AW: UNC-Pfad
24.01.2018 13:19:31
Robert
Hallo Michael,
Danke. Ich habe den Code getestet. Jedoch schlägt der Positivtest wenn er den UNCDEFAULT übergibt fehl. Ich meine damit, er führt den Code aus obwohl er gleich dem angegebenen UNC Pfad ist. Der Code soll aber nur bei ungleichem Ergebnis ausgeführt werden. Was kann die Ursache dafür sein? Spielt die Dateiendung vielleicht eine Rolle? Ohne Dateinamen wäre auch ok. Hauptsache der Pfad wird geprüft.
Gruss Robert
Anzeige
AW: UNC-Pfad
24.01.2018 12:31:41
EtoPHG
Hallo Robert,
Die Funktion, gibt dir den UNC-Pfad zurück, wenn du sie mit einem Drive-Letter fütterst.
Ich finde dein Angaben jedoch reichlich suspekt:
1. In diesen Fällen funktioniert der Code nicht.
Die Frage stellt sich warum? Anscheinend benutzt du also Drive-Letters im Code, statt UNC-Notationen.
2. Gehst du anscheinend davon aus, dass alle Anwender den glichen Drive-Letter für eine Server-Lokation verwenden, bzw. willst sie dazu zwingen. Ein aussichtsloses Unterfangen!
3. Kannst du eine Mappe nicht löschen, wenn sie aktiv geöffnet ist.
4. Kann mit gehaltener Shift-Taste beim Öffnen der Mappe, dein Code sehr einfach ausgehebelt werden.
Gruess Hansueli
Anzeige
@toPHG
24.01.2018 12:37:20
Rudi
Hallo Hansueli,
>
Das geht sehr wohl, da sie schreibgeschützt ist.
Gruß
Rudi
Ja dann, natürlich @Rudi (owT)
24.01.2018 13:10:44
EtoPHG

AW: UNC-Pfad
24.01.2018 13:27:17
Robert
Hallo Hansueli,
zu1) als Vergleich verwende ich den vollständigen UNC Pfad "\\Server\X\XX\Ordner\test.xlsm"
zu2) Die Anwender haben alle unterschiedlich das Laufwerk verbunden. Deswegen öffnet sich bei User A z.B. Laufwerk D: und bei User B z.B. Laufwerk Z: jedoch erkennt der Code nicht den eigentlich gleichen UNC Pfad.
zu3)wurde bereits beantwortet
zu4) Diese Aktion ist bekannt genauso wie das Aktivieren der Inhalte. Jedoch muss ein User diese aktivieren um die Funktionen zu nutzen und die Arbeitsblätter einzublenden.
Gruss Robert
Anzeige
AW: UNC-Pfad
24.01.2018 14:42:28
EtoPHG
Hallo Robert,
zu 2. aber mit der Funktion von Michael wird dir doch der UNC-Pfad geliefert, egal wie auf was für einen Drive-Letter der User diesen Pfad gemapped hat. Darum verstehe ich nicht, was jetzt dein Problem ist.
Gruess Hansueli
AW: UNC-Pfad
24.01.2018 15:36:08
Rudi
Hallo,
bist du so oder tust du nur so?
Die Function gibt \\Server zurück und sonst nichts, da \\Server als D: bzw. Z: gemapped ist.
genauere Prüfung z.B.
Sub aaa()
Dim x
x = GETNETWORKPATH(Left(ThisWorkbook.Path, 2))
'nur der Server muss stimmen
If LCase(x)  "\\server" Then
End If
'Server und Pfad müssen stimmen
If LCase(x & Mid(ThisWorkbook.Path, 3))  "\\server\ordner\unterordner" Then
End If
'Server, Pfad und Dateiname müssen stimmen
If LCase(x & Mid(ThisWorkbook.FullName, 3))  "\\server\ordner\unterordner\test.xlsm" Then
End If
End Sub
Gruß
Rudi
Anzeige
AW: UNC-Pfad
25.01.2018 16:36:07
Ralf
Hallo Rudi,
vielen Dank. Die Sub ist wirklich sehr übersichtlich mit den 3 Optionen. Ich habe nun mehrere Tests gemacht, jedoch funktioniert es bei mir einfach nicht. Selbst wenn ich nur den Server verwende, ist das Ergebnis negativ, also auch wenn der Pfad identisch ist erkennt er ihn als ungleich. Habe auch versucht (x) als Ergebnis der Funktion mal ausgeben zu lassen. Es wurde immer "nichts" angezeigt.
Arbeitet die Funktion korrekt? Wie kann ich herausfinden was ob die Funktion korrekt arbeitet?
Gruss Robert
Anzeige
AW: UNC-Pfad
25.01.2018 18:43:46
Anton
Hallo Robert,
so?:
Code:

Private Sub Workbook_Open()  
  Dim fso As Object, sLWB As String, sServer As String    
  sServer = "\\server\freigabe" 'anpassen
  Set fso = CreateObject("Scripting.FileSystemObject")  
  sLWB = fso.GetDriveName(ThisWorkbook.Path)
  With fso.getdrive(sLWB)
    If .drivetype = 1 Or .drivetype = 2 Then loeschen  
    If .drivetype = 3 Then  
      If LCase(.ShareName) <> LCase(sServer) Then loeschen  
    End If  
  End With  
  Set fso = Nothing  
End Sub  
Sub loeschen()
  Application.DisplayAlerts = False
  ThisWorkbook.ChangeFileAccess xlReadOnly  
  Kill ThisWorkbook.FullName
  Application.DisplayAlerts = True
  ThisWorkbook.Close False  
End Sub  

mfg Anton
Anzeige
AW: UNC-Pfad
27.01.2018 11:19:39
Ralf
Hallo Anton,
habe Deinen Code getestet, jedoch ohne das gewünschte Ergebnis. Er erkennt den eingebunden Server-Pfad nicht. Habe sämtliche Schreibweisen auch durchprobiert. Auch wenn die Datei von dem "richtigen" Pfad geöffnet wird, kommt ungleich raus.
Nochmal zur Erläuterung: Die Datei soll das Makro nur ausführen, wenn der Pfad nicht der hinterlegte ist, egal auf welchem User-Pc also auch egal wie das Netzlaufwerk eingebunden ist. Um das zu prüfen muss er jedes Netzlaufwerk als UNC Pfad umwandeln und überprüfen.
Eventuell ist die Ursache, das er aufgrund der Anzahl an Netzlaufwerken nicht korrekt arbeitet? Habe mit "ShareName" mal geschaut und er zählt mir an meinem PC schon 10 verschiedenen Netzlaufwerke auf. Dies kann natürlich bei anderen Usern auf dem PC anders aussehen.
Gruss Robert
Anzeige
AW: UNC-Pfad
27.01.2018 13:29:30
Anton
Hallo Robert(Ralf?),
Habe sämtliche Schreibweisen auch durchprobiert.
Kannst du hier einige davon posten?
mfg Anton
AW: UNC-Pfad
27.01.2018 14:12:25
Robert
Hallo Anton,
ja Schreibweise gem. ShareName ist:
\\ABC.ab.de\ab\ab_001\LW_12\Ordner_XYZ
probiert mit Code auch:
\\ABC.ab.de\ab\ab_001\LW_12\Ordner_XYZ\
\\ABC.ab.de\
\\ABC.ab.de
Auch die anderen verbundenen Netzlaufwerke haben den gleichen Aufbau.
Habe unter Verweise auch schon Microsoft Scripting Runtime aktiviert.
Was mache ich falsch?
Gruß Robert & Bruder Ralf
Anzeige
AW: UNC-Pfad
27.01.2018 17:57:49
Anton
Hallo Robert,
Sub b()
Dim fso As Object, sLWB As String, sServer As String
Set fso = CreateObject("Scripting.FileSystemObject")
sLWB = fso.GetDriveName(ThisWorkbook.Path)
sServer = fso.getdrive(sLWB).ShareName
Debug.Print sServer
MsgBox sServer
Set fso = Nothing
End Sub

erstelle eine Test-Datei mit diesem Code und speichere die auf dem Netzlaufwerk,
von wo die gestartet werden darf und starte den Code.Dann siehst du, wie sServer sein muss.
mfg Anton
Anzeige
AW: UNC-Pfad
27.01.2018 18:44:48
Robert
Hallo Anton,
es funktioniert! Dein Code ergibt: "\\ABC.ab.de\ab" und dieser Pfad in Deiner Formel läuft tatsächlich und bringt das gewünschte Ergebnis. Danke
Ist es möglich den Code noch erweitern wie im Code von Rudi? ('Server und Pfad müssen stimmen)
Gruss Robert
AW: UNC-Pfad
28.01.2018 10:28:14
Anton
Hallo Robert,
irgendwie so:
Code:

Private Sub Workbook_Open()  
  Dim fso As Object, sLWB As String    
  Dim sServer As String, sPfad As String  
  sServer = "\\ABC.ab.de\ab\ab_001\LW_12\Ordner_XYZ"  'anpassen
  Set fso = CreateObject("Scripting.FileSystemObject")  
  sLWB = fso.GetDriveName(ThisWorkbook.Path)
  sPfad = Mid(ThisWorkbook.Path, 3)
  With fso.getdrive(sLWB)
    If .drivetype = 1 Or .drivetype = 2 Then loeschen  
    If .drivetype = 3 Then  
      If LCase(.ShareName) & LCase(sPfad) <> LCase(sServer) Then loeschen  
    End If  
  End With  
  Set fso = Nothing  
End Sub  

mfg Anton
Anzeige
;
Anzeige

Infobox / Tutorial

UNC-Pfad richtig ermitteln und verwenden


Schritt-für-Schritt-Anleitung

Um einen UNC-Pfad zu ermitteln, kannst Du die folgende Schritt-für-Schritt-Anleitung verwenden:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Ein neues Modul erstellen: Klicke auf Einfügen > Modul.
  3. Füge den folgenden Code ein:
Function GETNETWORKPATH(ByVal DriveName As String) As String
    Dim objNtWork As Object, objDrives As Object, lngLoop As Long
    Set objNtWork = CreateObject("WScript.Network")
    Set objDrives = objNtWork.EnumNetworkDrives
    For lngLoop = 0 To objDrives.Count - 1 Step 2
        If UCase(objDrives.Item(lngLoop)) = UCase(DriveName) Then
            GETNETWORKPATH = objDrives.Item(lngLoop + 1)
            Exit For
        End If
    Next
End Function
  1. Ein weiteres Modul für den Workbook_Open-Ereignis hinzufügen:
Private Sub Workbook_Open()
    Const UNCDEFAULT As String = "\\Server\"
    If GETNETWORKPATH(Left(ThisWorkbook.FullName, 2)) & "\" <> UNCDEFAULT Then
        Application.DisplayAlerts = False
        ActiveWorkbook.ChangeFileAccess xlReadOnly
        Kill ActiveWorkbook.FullName
        ThisWorkbook.Close False
    End If
    Application.DisplayAlerts = True
End Sub
  1. Speichern und testen: Speichere Deine Datei und teste die Funktionalität.

Häufige Fehler und Lösungen

  • Das angegebene Laufwerk bzw. der UNC-Pfad existiert nicht: Stelle sicher, dass der Drive-Letter korrekt ist und dass das Laufwerk verbunden ist. Überprüfe, ob Du den richtigen UNC-Pfad verwendest.

  • Die Funktion gibt keinen korrekten UNC-Pfad zurück: Überprüfe Deine Netzwerkeinstellungen und stelle sicher, dass die Netzlaufwerke korrekt gemapped sind.

  • Code läuft trotz identischem Pfad: Achte darauf, dass die Vergleichsoperatoren korrekt verwendet werden. Eine falsche Schreibweise kann dazu führen, dass der Code nicht wie gewünscht funktioniert.


Alternative Methoden

Falls die obige Methode nicht funktioniert, kannst Du die Scripting.FileSystemObject-Klasse verwenden, um den UNC-Pfad zu ermitteln:

Sub ErmittelnUNC()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    MsgBox fso.GetDriveName(ThisWorkbook.Path)
End Sub

Diese Methode zeigt Dir den Laufwerksnamen und kann helfen, den entsprechenden UNC-Pfad herauszufinden.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie Du den UNC-Pfad in verschiedenen Situationen nutzen kannst:

  1. UNC-Pfad anzeigen:
Sub ZeigeUNCPfad()
    MsgBox "Der UNC-Pfad ist: " & GETNETWORKPATH("D:")
End Sub
  1. Mit einer UNC-Freigabe arbeiten:
Sub MitUNCArbeiten()
    Dim uncPfad As String
    uncPfad = GETNETWORKPATH("Z:")
    If uncPfad <> "" Then
        MsgBox "Der UNC-Pfad lautet: " & uncPfad
    Else
        MsgBox "Kein gültiger UNC-Pfad gefunden."
    End If
End Sub

Tipps für Profis

  • Verwende die LCase-Funktion, um sicherzustellen, dass die Pfadvergleiche nicht durch unterschiedliche Schreibweisen gestört werden.

  • Achte darauf, dass Du vor dem Löschen einer Datei immer die richtigen Zugriffsrechte hast.

  • Stelle sicher, dass Du die Microsoft Scripting Runtime-Bibliothek aktiviert hast, um Fehler zu vermeiden.


FAQ: Häufige Fragen

1. Was ist ein UNC-Pfad?
Ein UNC-Pfad (Universal Naming Convention) ist eine Möglichkeit, auf Ressourcen in einem Netzwerk zuzugreifen, ohne einen Laufwerksbuchstaben zu verwenden. Er hat das Format \\Server\Freigabe\Pfad.

2. Wie kann ich den UNC-Pfad ermitteln?
Du kannst den UNC-Pfad ermitteln, indem Du den GETNETWORKPATH-Code verwendest, um den Drive-Letter in einen UNC-Pfad umzuwandeln.

3. Warum funktioniert mein Code nicht?
Überprüfe, ob die Laufwerksbuchstaben korrekt gemapped sind und ob Du die richtigen Berechtigungen hast, um auf den UNC-Pfad zuzugreifen. Achte auch auf die Schreibweise und den Vergleichsoperator.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige