Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

VBA Script - Pfade zu Dokumentevorlagen anpassen

Frage Entwicklung VB for Applications

Mitglied: Juckie

Juckie (Level 1) - Jetzt verbinden

28.05.2014, aktualisiert 14:39 Uhr, 3274 Aufrufe, 11 Kommentare

Guten Morgen an alle,

wir haben unser zentrales Dokumentenverzeichnis auf einen anderen Server umgezogen. Nun befinden sich in dem Dokumentenverzeichnis Word Dokumente die mit Vorlagen verknüpft sind, welche in dem Dokumentenverzeichnis liegen. Der Servername ist jedoch nicht der gleiche. Das Resultat ist nun, dass das Öffnen eines Word-Dokumentes relativ lange dauert, da der Pfad zur Dokumentenvorlage, mit welchem das Word-Dokument verknüpft ist, nicht mehr existiert. Umbenennen des Servers ist leider nicht möglich. Ich weiß, dass es ungünstig ist, Vorlagen auf einem Serverlaufwerk zu speichern, jedoch ist das, ich sag mal, historisch so gewachsen.

Ich habe nun hier im Forum ein Script gefunden, welches zwar den Pfad zur verknüpften Dokumentenvorlage entfernt, jedoch ist das nicht genau das, was ich benötige.

Das Ziel sollte sein, den Pfad zur verknüpften Dokumentenvorlage zu ändern. Leider bekomme ich es irgendwie nicht, da meine Kenntnisse in VBA praktisch 0 sind. Könnte von euch vielleicht jemand einen Blick auf das Skript werfen und mir sagen, an welcher Stelle ich da ansetzen muss.

Vielen Dank im Voraus

01.
'Pfad zu den Dokumenten 
02.
Const strPathDocs = "C:\temp\0003\test" 
03.
'Logfile für eventuell auftretende Fehler 
04.
Const strPathLogfile = "C:\temp\0003\test\logfile.txt" 
05.
'Alter Servername 
06.
strOldServer = "\\1.1.1.1\dok" 
07.
 
08.
Set fso = WScript.CreateObject("Scripting.Filesystemobject") 
09.
Set objWord = WScript.CreateObject("Word.Application") 
10.
'Wenn das ganze unsichtbar ablaufen soll nächste Zeile auf false setzen 
11.
objWord.Visible = True 
12.
objWord.DisplayAlerts = 0 
13.
'Im Ordner Rekursiv alle Word-Dokumente verarbeiten 
14.
parseFolders fso.GetFolder(strPathDocs), False 
15.
objWord.DisplayAlerts = -1 
16.
objWord.Quit True 
17.
Set fso = Nothing 
18.
Set objWord = Nothing 
19.
 
20.
Function parseFolders(fldr, boolRecursion) 
21.
     
22.
    For Each file In fldr.Files 
23.
        'Verarbeite nur Dateien mit den Endungen *.doc, *.docx, *.docm 
24.
        If LCase(Right(file.Name, 3)) = "doc" Or LCase(Right(file.Name, 4)) = "docx" Or LCase(Right(file.Name, 4)) = "docm" Then 
25.
            On Error Resume Next 
26.
            If Err.Number <> 0 Then 
27.
                Set objLog = fso.OpenTextFile(strPathLogfile, 3, True) 
28.
                objLog.WriteLine ("Fehler beim öffnen der Datei: -> " & file.Path) 
29.
                objLog.Close 
30.
            Else 
31.
        Set dlgTemplate = Application.Dialogs(87) 
32.
        If InStr(1, dlgTemplate.Template, strOldServer, 1) Then 
33.
            Set objDoc = objWord.Documents.Open(file.Path) 
34.
            Set attTmpl = objDoc.AttachedTemplate.Path 
35.
            MsgBox ActiveDocument.AttachedTemplate 
36.
            'Dim attTmpl as String = objDoc.AttachedTemplate 
37.
            attTmpl = Replace(attTmpl, "\\1.1.1.1\dok", "\\1.1.1.2\dok") 
38.
            objDoc.AttachedTemplate = attTmpl 
39.
            objDoc.Save 
40.
            objDoc.Close True 
41.
        Else 
42.
            objDoc.Close False 
43.
        End If 
44.
            End If 
45.
        End If 
46.
    Next 
47.
     
48.
    If boolRecursion Then 
49.
        For Each subFolder In fldr.SubFolders 
50.
            parseFolders subFolder, True 
51.
        Next 
52.
    End If 
53.
End Function
Gruß

Juckie
Mitglied: Eintagsfliege
28.05.2014 um 09:32 Uhr
Hallo Juckie!

Soweit ich das sehe, brauchst nur in Codezeile 37 für das erste String-Argument den alten Pfad und für das zweite String-Argument den neuen Pfad bzw. nur den zu ersetzenden Teil anzugeben...

Grüße Dieter
Bitte warten ..
Mitglied: Juckie
28.05.2014 um 09:52 Uhr
Hallo,

das müsste ja in der Zeile 37 so passen.

Was ich nicht gebacken bekomme ist, dass er mir den Pfad zur verknüpften Dokumentenvorlage nicht ausliest. Egal was ich versuche, ich erhalte in meiner MsgBox Ausage in Zeile 35 entweder eine leere Ausgabe oder aber den Pfad zu meiner lokalen Dokumentenvorlage Normal.dot, aber nicht den Pfad, der im aktuell geöffenten Word Dokument unter Registerkarte Entwicklertools / Dokumentvorlage / Vorlage hinterlegt ist.

Was mache ich falsch?

Gruß

Juckie
Bitte warten ..
Mitglied: colinardo
LÖSUNG 28.05.2014, aktualisiert um 14:39 Uhr
Moin Juckie,
Zitat von Juckie:
Was mache ich falsch?
Ihr habt ja auch mein Script mit euren Abänderungen total durcheinander gebracht!
Zur Info das ist ein VBS- und kein VBA-Script ... und sollte auch aus einem VBS-Script aus ausgeführt werden.
so sollte es laufen...
01.
'Pfad zu den Dokumenten 
02.
Const strPathDocs = "C:\temp\0003\test" 
03.
'Logfile für eventuell auftretende Fehler 
04.
Const strPathLogfile = "C:\temp\0003\test\logfile.txt" 
05.
'Alter Servername 
06.
Const strOldServer = "\\1.1.1.1\dok" 
07.
'Neuer Servername 
08.
Const strNewServer = "\\1.1.1.2\dok"  
09.
 
10.
Set fso = Wscript.CreateObject("Scripting.Filesystemobject") 
11.
Set objWord = WScript.CreateObject("Word.Application") 
12.
'Wenn das ganze unsichtbar ablaufen soll nächste Zeile auf false setzen 
13.
objWord.Visible = True 
14.
objWord.DisplayAlerts = 0 
15.
'Im Ordner Rekursiv alle Word-Dokumente verarbeiten 
16.
parseFolders fso.GetFolder(strPathDocs), True 
17.
objWord.DisplayAlerts = -1 
18.
objWord.Quit True 
19.
Set fso = Nothing 
20.
Set objWord = Nothing 
21.
 
22.
Function parseFolders(fldr, boolRecursion) 
23.
  For Each file In fldr.Files 
24.
    'Verarbeite nur Dateien mit den Endungen *.doc, *.docx, *.docm 
25.
    If LCase(Right(file.Name, 3)) = "doc" Or LCase(Right(file.Name, 4)) = "docx" Or LCase(Right(file.Name, 4)) = "docm" Then 
26.
      On Error Resume Next 
27.
      Set objDoc = objWord.Documents.Open(file.Path) 
28.
      'Falls ein Fehler aufgetreten ist, schreibe dies ins Logfile 
29.
      If Err.Number <> 0 Then 
30.
        Set objLog = fso.OpenTextFile(strPathLogfile,8,True) 
31.
        objLog.WriteLine("Fehler beim öffnen der Datei: -> " & file.Path) 
32.
        objLog.Close 
33.
      Else 
34.
        Set dlgTemplate = objWord.Dialogs(87) 
35.
        ' Wenn der alte Serverpfad in der Vorlage gefunden wurde, starte Ersetzung der Vorlage 
36.
        If InStr(1,dlgTemplate.Template,strOldServer,1) Then 
37.
          'neuen Vorlagenpfad erstellen 
38.
          newTemplate = Replace(dlgTemplate.Template,strOldServer,strNewServer,1,1,1) 
39.
          ' Entfernen der Vorlageninformationen 
40.
          objDoc.RemoveDocumentInformation (9) 
41.
          ' neue Vorlage zuweisen 
42.
          objDoc.AttachedTemplate = newTemplate 
43.
          ' Dokument speichern und schließen 
44.
          objDoc.Save 
45.
          objDoc.Close True 
46.
        Else 
47.
          ' Dokument schließen und nicht speichern 
48.
          objDoc.Close False 
49.
        End If 
50.
      End If 
51.
    End if 
52.
  Next 
53.
     
54.
  If boolRecursion Then 
55.
    For Each subFolder in fldr.SubFolders 
56.
      parseFolders subFolder, True 
57.
    Next 
58.
  End If 
59.
End Function
Grüße Uwe
Bitte warten ..
Mitglied: Juckie
28.05.2014, aktualisiert um 10:59 Uhr
Moin Uwe,

ja, ich habe dein Skript ein wenig abgeändert Sorry, aber VB ist echt nicht meine Welt.

Ich habe dein abgeändertes Skript vom vorigen Post 1:1 übernommen, nur leider setzt er mir den geänderten Pfad zur verknüpften Dokumentevorlage immer noch nicht. In dem Feld unter Entwicklertools -> Dokumentvorlage -> Vorlagen steht Normal drin.

Wenn ich in Zeile 36 ein

01.
MsgBox objDoc.AttachedTemplate.Name
einfüge, erhalte ich als Ausgabe

Normal.dotm

und da sollte eigentlich \\1.1.1.1\dok... drinstehen.

Könntest du evtl. nochmal kurz drüber schauen? Das wäre klasse.

Vielen Dank

Gruß Juckie
Bitte warten ..
Mitglied: colinardo
LÖSUNG 28.05.2014, aktualisiert um 14:39 Uhr
Zitat von Juckie:
Könntest du evtl. nochmal kurz drüber schauen? Das wäre klasse.
hatte noch kurz was abgeändert, hier läuft es einwandfrei. Du solltest auch beachten das du keine neue *.dotx-Vorlage an ein altes *.doc anhängen kannst, das funktioniert nicht !

Grüße Uwe
Bitte warten ..
Mitglied: colinardo
LÖSUNG 28.05.2014, aktualisiert um 14:39 Uhr
Zitat von Juckie:
und da sollte eigentlich \\1.1.1.1\dok... drinstehen.
nein, der komplette Name mit Pfad wird hier zusammengebaut :
objDoc.AttachedTemplate = Replace(objDoc.AttachedTemplate.Path,strOldServer,strNewServer,1,1,1) & "\" & objDoc.AttachedTemplate.Name 
Du verwechselst hier Dinge...
Bitte warten ..
Mitglied: Juckie
28.05.2014 um 11:15 Uhr
Hallo Uwe,

gebe ich in Zeile 36 ein

01.
MsgBox objDoc.AttachedTemplate.Path
erhalte ich als Ausgabe den Pfad zu meinen Benutzervorlagen der im Word auch unter Datei -> Optionen -> Erweitert -> Dateispeicherorte hinterlegt ist, was aber nicht dem Pfad entspricht, der in dem Dokument hinterlegt ist.

Mir kommt es so vor, als wäre das Objekt objDoc nicht das geöffnete Dokument.

Gruß

Juckie
Bitte warten ..
Mitglied: colinardo
LÖSUNG 28.05.2014, aktualisiert um 14:39 Uhr
Zur Info: Zum Anpassen der Dokumente sollte der alte Pfad vorübergehend zur Verfügung gestellt werden. Wie sich das machen lässt habe ich in diesem Beitrag geschrieben: http://www.administrator.de/contentid/219118
man kann das ganze zwar in Zeile 36 so abändern:
objDoc.AttachedTemplate = Replace(dlgTemplate.Template,strOldServer,strNewServer,1,1,1)
aber so bleiben noch interne Verweise zum alten Server erhalten.

Also besser den alten Server-Pfad dem Client zur Verfügung stellen.

Grüße Uwe
Bitte warten ..
Mitglied: Eintagsfliege
LÖSUNG 28.05.2014, aktualisiert um 14:39 Uhr
Hallo zusammen!

Nur der Vollständigkeit halber:
Name: Enthält nur Name
Path: Enthält nur den Ordnerpfad
FullName: Enthält den vollständigen Pfad

Grüße Dieter
Bitte warten ..
Mitglied: colinardo
LÖSUNG 28.05.2014, aktualisiert um 14:39 Uhr
So, habe das ganze in deinem Fall mal analysiert und habe oben den Code entsprechend abgeändert. Damit sollte es jetzt funktionieren. Hier mit einem deiner Testdokumente erfolgreich getestet.
Es wird nun zusätzlich mit objDoc.RemoveDocumentInformation (9) die Vorlagenreferenz entfernt bevor die neue Dokumentvorlage zugewiesen wird.

Grüße Uwe
Bitte warten ..
Mitglied: Juckie
28.05.2014 um 14:38 Uhr
Hallo Uwe,

perfekt, jetzt macht es das, was es machen soll.

Super, tausend Dank an Dich!

Gruß

Juckie
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
VB for Applications
Powershell Script aus VBA heraus ausführen (2)

Frage von mcnico1978 zum Thema VB for Applications ...

Microsoft Office
gelöst Nach Domain Change Pfade anpassen (8)

Frage von 131071 zum Thema Microsoft Office ...

Microsoft Office
gelöst CSV-Datei mit einem VBA Makro in Excel einlesen und leicht anpassen (5)

Frage von JoSiBa zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...