VBA - wenn .open methode fehlschlägt, weitermachen
Hallo, ich habe eine Frage zu VBA.
Ich stehe vor der Aufgabe einen ziemlich großen Fileserver mit duzenden von Freigaben zu migrieren. Nun bin ich grade bei einem Laufwerk auf dem tausende von Word Dokumenten liegen. Das Problem ist, das in diesen Dokumenten sehr viele Hyperlinks sind, die als Ziel den absoluten Pfad zum alten Fileserver verwenden (beispiel: \\alterfilserver\freigabe\dokument.doc). Als Lösung für dieses Problem habe ich mir ein vba makro geschrieben welches im gewählten Laufwerk alle doc-dateien ausliest, und jeden einzelnen hyperlink sozusagen umbiegt (beispiel: \\neuerfileserver\freigabe\dokument.doc).
Das Makro funktioniert fast fehlerfrei und ich habe schon sehr viele GigaByte an Daten erfolgreich migriert, nur manchmal schlägt mein makro beim aufruf dieser Zeile fehl:
"wrd.Documents.Open(FileName)"
Die Instanz meines Word Objekts öffnet hier die nächste word datei. Der Fehler ist folgender:
"Laufzeitfehler 6295:
Office hat ein Probleme mit dieser Datei erkannt. Zum Schutz des Computers darf die Datei nicht geöffnet werden."
Der Fehler interessiert mich eigentlich weniger. Es ist nichtmal relevant, das diese Datei geöffnet wird, weil ich weis das im entsprechenden Pfad und generell bei Dateien die solche Fehler werfen, keine bearbeitung nötig ist. Deswegen möchte ich beim auftreten eines solchen Fehlers einfach weitermachen.
Ich habe schon "on error resume next" probiert - trotzdem kommt die fehlermeldung.
Nun meine Frage: Wie kann ich die Open-Anweisung so ändern, das es nur versucht wird, bei fehlschlag aber einfach weitergemacht wird.
try usw. gibt es ja meines wissens in vba nicht!
Danke!
Gruß Martin
Ich stehe vor der Aufgabe einen ziemlich großen Fileserver mit duzenden von Freigaben zu migrieren. Nun bin ich grade bei einem Laufwerk auf dem tausende von Word Dokumenten liegen. Das Problem ist, das in diesen Dokumenten sehr viele Hyperlinks sind, die als Ziel den absoluten Pfad zum alten Fileserver verwenden (beispiel: \\alterfilserver\freigabe\dokument.doc). Als Lösung für dieses Problem habe ich mir ein vba makro geschrieben welches im gewählten Laufwerk alle doc-dateien ausliest, und jeden einzelnen hyperlink sozusagen umbiegt (beispiel: \\neuerfileserver\freigabe\dokument.doc).
Das Makro funktioniert fast fehlerfrei und ich habe schon sehr viele GigaByte an Daten erfolgreich migriert, nur manchmal schlägt mein makro beim aufruf dieser Zeile fehl:
"wrd.Documents.Open(FileName)"
Die Instanz meines Word Objekts öffnet hier die nächste word datei. Der Fehler ist folgender:
"Laufzeitfehler 6295:
Office hat ein Probleme mit dieser Datei erkannt. Zum Schutz des Computers darf die Datei nicht geöffnet werden."
Der Fehler interessiert mich eigentlich weniger. Es ist nichtmal relevant, das diese Datei geöffnet wird, weil ich weis das im entsprechenden Pfad und generell bei Dateien die solche Fehler werfen, keine bearbeitung nötig ist. Deswegen möchte ich beim auftreten eines solchen Fehlers einfach weitermachen.
Ich habe schon "on error resume next" probiert - trotzdem kommt die fehlermeldung.
Nun meine Frage: Wie kann ich die Open-Anweisung so ändern, das es nur versucht wird, bei fehlschlag aber einfach weitergemacht wird.
try usw. gibt es ja meines wissens in vba nicht!
Danke!
Gruß Martin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 141542
Url: https://administrator.de/contentid/141542
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
8 Kommentare
Neuester Kommentar
Leider hast Du keinen assagefähigen Code gepostet, anhand dessen man sehen kann ob Du z.B. Set-Anweisungen verwendest....
Von daher wäre eine Möglichkeit zu prüfen, ob die Datei existiert:
Gruß Dieter
Von daher wäre eine Möglichkeit zu prüfen, ob die Datei existiert:
Dim Fso As Object
Set Fso = CreateObject("Scripting.FileSystemObject")
If Fso.FileExists(FileName) Then
....
"wrd.Documents.Open(FileName)"
....
End If
Gruß Dieter
Hallo MartinAD!
So könnte es funktionieren:
Funktion:
Die aktuelle Alert-Einstellung (Meldungsausgabe) sichern, ausschalten und am Ende der Prozedur wiederherstellen.
Wenn Err.Number = 0 (Kein Fehler) dann Code ausführen, ansonsten ignorieren und Fehler löschen.
Das Else mit Fehler löschen ist nur von Bedeutung, wenn Documents.Open in einer Schleife läuft. D.h. wenn die Prozedur für jede Datei einzeln aufgerufen wird, dann kann der Else-Teil entfallen.
Gruß Dieter
So könnte es funktionieren:
Sub Makro()
Dim AlertLevel As Long
AlertLevel = Application.DisplayAlerts 'Aktuelle Einstellung sichern
Application.DisplayAlerts = wdAlertsNone 'Meldungsausgabe ausschalten
On Error Resume Next
'.....
Documents.Open "E:\Test.doc"
If Err.Number = 0 Then
'Mach was
Else
Err.Clear 'Mach nix und lösche den Fehler
End If
'.....
Application.DisplayAlerts = AlertLevel 'Meldungsausgabe wiederherstellen
End Sub
Funktion:
Die aktuelle Alert-Einstellung (Meldungsausgabe) sichern, ausschalten und am Ende der Prozedur wiederherstellen.
Wenn Err.Number = 0 (Kein Fehler) dann Code ausführen, ansonsten ignorieren und Fehler löschen.
Das Else mit Fehler löschen ist nur von Bedeutung, wenn Documents.Open in einer Schleife läuft. D.h. wenn die Prozedur für jede Datei einzeln aufgerufen wird, dann kann der Else-Teil entfallen.
Gruß Dieter
Hallo MartinAD!
Sollte in etwa so funktionieren:
Gruß Dieter
Sollte in etwa so funktionieren:
Sub Makro()
Dim Doc As Object, Status As Long, AlertLevel As Long
AlertLevel = Application.DisplayAlerts 'Aktuelle Einstellung sichern
Application.DisplayAlerts = wdAlertsNone 'Meldungsausgabe ausschalten
On Error Resume Next
Set Doc = GetObject("E:\Test.Doc")
Status = Doc.ProtectionType
Doc.Close
If Status = wdNoProtection Then 'Nur Dateien ohne Passwortschutz
Documents.Open "E:\Test.Doc"
If Err.Number = 0 Then
'Mach was
Else
Err.Clear 'Mach nix und lösche den Fehler
End If
End If
Application.DisplayAlerts = AlertLevel 'Meldungsausgabe wiederherstellen
End Sub
Gruß Dieter
Hallo MartinAD!
Gruß Dieter
Zitat von @MartinAD:
mannomann, genial! danke!! bin sehr sehr dankbar für euren investierten hirnschmalz!!
Gern geschehenmannomann, genial! danke!! bin sehr sehr dankbar für euren investierten hirnschmalz!!
Gruß Dieter