martinad
Goto Top

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

Content-Key: 141542

Url: https://administrator.de/contentid/141542

Ausgedruckt am: 29.03.2024 um 04:03 Uhr

Mitglied: 76109
76109 27.04.2010 um 09:42:06 Uhr
Goto Top
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:
Dim Fso As Object

Set Fso = CreateObject("Scripting.FileSystemObject")  

If Fso.FileExists(FileName) Then
    ....
    "wrd.Documents.Open(FileName)"  
    ....
End If

Gruß Dieter
Mitglied: MartinAD
MartinAD 27.04.2010 um 10:24:10 Uhr
Goto Top
Die Dateien die ich öffnen will, existieren ja. Das Problem ist das diese entweder gesperrt sind oder word aus irgendeinem anderen grund denkt diese nicht öffnen zu können. Ich weis garnicht wieviel myriaden an fehlern da word haben kann beim öffnen von dateien, jedenfalls sind es recht viele.

Es geht darum, generell eine vba möglichkeit zu finden wie man es versuchen kann die datei zu öffnen, wenn es fehlschlägt, einfach weitermachen, schematisch so:

versuche worddatei zu öffnen, wenn es klappt dann

hier weitermachen

wenn nicht dann

hier weitermachen
Mitglied: Twinrix
Twinrix 27.04.2010 um 21:37:54 Uhr
Goto Top
Hi,

funktioniert statt on error resume next eventuell die Fehlerbehandlung?

Also

on error goto fehlerbehandlung

fehlerbehandlung:

if err.number = 6295 resume next
Mitglied: 76109
76109 27.04.2010 um 22:42:26 Uhr
Goto Top
Hallo MartinAD!

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
Mitglied: MartinAD
MartinAD 28.04.2010 um 08:13:10 Uhr
Goto Top
vielen dank dafür, ich hab zwar jetzt noch ab und zu eine abfrage wenn ein word dokument passwort geschützt ist - die muss ich noch händisch durchklicken, aber ansonsten sieht es ganz gut aus. für mich ist das Problem erstmal "gelöst" - falls jemand weis wie ich das noch abschalten kann, wäre diese info natürlich auch willkommen, meine recherche blieb erfolglos.

vielen vielen dank nochmal für eure hilfe!
Mitglied: 76109
76109 28.04.2010 um 09:14:46 Uhr
Goto Top
Hallo MartinAD!

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
Mitglied: MartinAD
MartinAD 28.04.2010 um 10:28:07 Uhr
Goto Top
mannomann, genial! danke!! bin sehr sehr dankbar für euren investierten hirnschmalz!!
Mitglied: 76109
76109 28.04.2010 um 13:25:27 Uhr
Goto Top
Hallo MartinAD!

Zitat von @MartinAD:
mannomann, genial! danke!! bin sehr sehr dankbar für euren investierten hirnschmalz!!
Gern geschehenface-smile

Gruß Dieter