ahstax
Goto Top

Dokumentformatvorlagen in mehreren Dokumenten ersetzen

Hallo,

ich möchte gerne mit einem Makro in einigen vielen Dokumenten (Formbriefe) die verwendeten Dokumentenformatvorlagen ersetzen. Mein Code bis dato (der nicht funktioniert...) sieht so aus:

Sub FormatvorlagenZuweisen01()

    Dim oTemplate As Template
    Dim oDoc As Document
    Dim oDocPath As String
    Dim intDokumentenzaehler As Integer
        intDokumentenzaehler = 0
    
    
    Set oTemplate = "\\Server\Speicherort\Formbriefe Test\Vorlage\test.dot"  
    Set oDocPath = "\\Server\Speicherort\Formbriefe Test\"  
    
    For Each oDoc In oDocPath
        Set oDoc = ActiveDocument
        With ActiveDocument
            .UpdateStylesOnOpen = False
            .AttachedTemplate = oTemplate
            .Save
            .Close
        End With
        intDokumentenzaehler = intDokumentenzaehler + 1
        Set oDoc = Nothing
    Next oDoc
    
    MsgBox "Bearbeitete Dokumente: " & intDokumentenzaehler  
    
End Sub

Die Fehlermeldung beim Kompilieren lautet:
"Typen unverträglich"

Daraus entnehme ich, dass Variablen nicht miteinander verträglich sind.

Kann mir bitte jemand sagen, ob mein Vorhaben durchführbar ist und wo mein Fehler im Code liegt?

Neugierige Grüße,
Andreas

(Word 2010)

Content-Key: 215239

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

Printed on: April 18, 2024 at 07:04 o'clock

Member: colinardo
colinardo Aug 26, 2013 updated at 13:48:17 (UTC)
Goto Top
Hallo Andreas,
so wie du das versuchst geht es leider nicht.
Ungetestet müsstest du es in dieser Art machen:
Sub FormatvorlagenZuweisen01()
   
    Dim oTemplate
    Dim oDoc As Document
    Dim oDocPath As String
    Dim intDokumentenzaehler As Integer
    intDokumentenzaehler = 0
    
    Set fso = CreateObject("Scripting.Filesystemobject")  
    
    Set oTemplate = "\\Server\Speicherort\Formbriefe Test\Vorlage\test.dot"  
    Set oDocPath = "\\Server\Speicherort\Formbriefe Test\"  

    Application.DisplayAlerts = wdAlertsNone

    For Each f In fso.GetFolder(oDocPath).Files
        If LCase(Right(f.Name, 3)) = "doc" Or LCase(Right(f.Name, 4)) = "docx" Or LCase(Right(f.Name, 4)) = "docm" Then  
            Set oDoc = Application.Documents.Open(f.Path, Visible:=False)
            With oDoc
                .AttachedTemplate = oTemplate
                .Save
                .Close
            End With
            intDokumentenzaehler = intDokumentenzaehler + 1
            Set oDoc = Nothing
        End If
    Next
    Set fso = Nothing
    Application.DisplayAlerts = wdAlertsAll

    MsgBox "Bearbeitete Dokumente: " & intDokumentenzaehler  
End Sub


Grüße Uwe
Member: ahstax
ahstax Aug 26, 2013 at 11:47:07 (UTC)
Goto Top
Hallo Uwe,

Ungetestet müsstest du es in dieser Art machen:

Getestet auch! face-wink

Danke Dir!!!
Member: ahstax
ahstax Aug 26, 2013 at 11:56:35 (UTC)
Goto Top
Das hier:
Dim oTemplate As Template

muss bei mir ein String sein... ist mir noch aufgefallen
Member: colinardo
colinardo Aug 26, 2013 at 11:58:30 (UTC)
Goto Top
stimmt, ist korrigiert
Member: ahstax
ahstax Aug 26, 2013 updated at 13:30:24 (UTC)
Goto Top
Jetzt war ich zu schnell (beim "als gelöst" markieren)...

Wie kann ich nachfolgenden Schnipsel passend machen, damit ALLE Formatvorlagen mitgenommen werden, auch die Nummerierungen...

Application.OrganizerCopy Source:=, _
   Destination:=, _
   Name:=ALLE, _
   Object:=
Next styleLoop

Kann man
For Each styleLoop In fso.getFile(oTemplate).Styles
...
Next styleLoop
irgendwie verwenden?
Member: colinardo
colinardo Aug 26, 2013 at 14:17:32 (UTC)
Goto Top
Also alle Styles die in die im alten Template des Dokuments vorhanden waren, kannst du so in das Dokument einbetten, bevor du das Dokument mit dem neuen Template verknüpfst. Wichtig: Diesen Schnippsel vor Zeile 20 in obigen Script einfügen.
oDoc.CopyStylesFromTemplate (oDoc.AttachedTemplate.FullName)

Grüße Uwe
Member: ahstax
ahstax Aug 26, 2013 at 14:25:14 (UTC)
Goto Top
Diese Zeile hatte ich zwischenzeitlich auch irgendwo gelesen und ausprobiert...

Aber natürlich an der völlig falschen Stelle eingefügt, so dass das Ergebnis Müll war. So sieht es jetzt so aus, als ob es geht. Ich werde weiter berichten...! face-wink

Danke erst mal!!!
Member: ahstax
ahstax Aug 26, 2013 at 14:31:57 (UTC)
Goto Top
Kann es sein, dass sich Word schwer tut, die Formatierungen von Aufzählungen (Nummerierungen mit Zahlen, Buchstaben) sauber zu übernehmen?
Gibts da noch einen Trick?
Member: ahstax
ahstax Aug 27, 2013 updated at 09:31:48 (UTC)
Goto Top
Hallo miteinander,

hier klick
hab ich gelesen, dass .CopyStylesFromTemplate alleine insbesondere bei Nummerierungsvorlagen nicht ausreichen kann. Es wird vorgeschlagen, zusätzlich Application.OrganizerCopy zu verwenden. (Es sollen ja alle Formatvorlagen, auch die für die Nummerierungen) mitgenommen werden).

Ich habe versucht, meinen Code entsprechend anzupassen. Blöderweise erhalte ich regelmäßig einen Fehler 4198 ("Befehl misslungen"), den ich Zeile 76ff. versuche abzufangen.
Schlußendlich besagt mir die Messagebox Zeile 85 dann aber, dass KEINE Formatvorlage angewandt wurde.

Kann mir jemand einen Tipp geben?

Public Sub FormatvorlagenZuweisen()
   
    Dim oTemplate As String
    Dim oDoc As Document
    Dim oDocPath As String
    Dim intDokumentenzaehler As Integer
    intDokumentenzaehler = 0
    Dim intDokumentenzaehlerBearbeitet As Integer
    intDokumentenzaehlerBearbeitet = 0
    
    Dim intAnzahlZuPruefenderDateien As Integer
    intAnzahlZuPruefenderDateien = 0
    
    Dim oStyle As Style
    Dim strStyle As String
    Dim DocTmp As Document
    Dim i As Long
    
    Dim stlVorlage As Style
    Dim intBenutzte As Integer
    Dim intVergeblich As Integer
    Dim intGeklappt As Integer
    Dim docVorlage As Document
    
    Set fso = CreateObject("Scripting.Filesystemobject")  
    
    
    oTemplate = fm1.txtBxPfadVorlage.Text
    oDocPath = fm1.txtBxPfadDokumentenOrdner.Text


    Application.DisplayAlerts = wdAlertsNone
    
    fm1.cmdBtnStart.Caption = "Bearbeitung läuft"  
    
    intAnzahlZuPruefenderDateien = fso.GetFolder(oDocPath).Files.Count
    
    For Each f In fso.GetFolder(oDocPath).Files
    
        intDokumentenzaehler = intDokumentenzaehler + 1
        
        fm1.cmdBtnStart.Caption = "Bearbeitung / Prüfung läuft" & vbCrLf & intDokumentenzaehler & "/" & intAnzahlZuPruefenderDateien  
        
        If LCase(Right(f.Name, 3)) = "doc" Or LCase(Right(f.Name, 4)) = "docx" Or LCase(Right(f.Name, 4)) = "docm" Then  
            Set oDoc = Application.Documents.Open(f.Path, Visible:=False)
            With oDoc
            
                .CopyStylesFromTemplate Template:=oTemplate
                
                '   http://www.office-archive.com/59-word/55712f65c723e7ee.htm  
                
                .AttachedTemplate = oTemplate
                
                  
                  Set docVorlage = Documents.Open(oTemplate, Visible:=False)
                  
                    ' Copy all styles using the organizer  
                  intBenutzte = 0
                  intVergeblich = 0
                  intGeklappt = 0
                  
                  On Error Resume Next
                  
                  For Each stlVorlage In docVorlage.Styles
                  
                    If stlVorlage.InUse = True Then
                        intBenutzte = intBenutzte + 1
                    End If
                  
                    Application.OrganizerCopy _
                        Source:=docVorlage.FullName, _
                        Destination:=oDoc.FullName, _
                        Name:=stlVorlage.NameLocal, _
                        Object:=wdOrganizerObjectStyles
                        
                        If Err.Number = 4198 Then
                            intVergeblich = intVergeblich + 1
                        Else
                            intGeklappt = intGeklappt + 1
                        End If
                            
                  Next stlVorlage
                  
                  'http://www.office-loesung.de/ftopic39646_0_0_asc.php  
                  MsgBox intVergeblich & " vergebliche Versuche!" & Chr(13) & intGeklappt & " erfolgreiche!" & _  
                        Chr(13) & intBenutzte & " benutzte!"  
                  
                  ' Close the template and don't save any changes.  
                  docVorlage.Close False
                                
                .Save
                .Close
            End With
            intDokumentenzaehlerBearbeitet = intDokumentenzaehlerBearbeitet + 1
            Set oDoc = Nothing
            
        End If
    Next
    Set fso = Nothing
    Application.DisplayAlerts = wdAlertsAll

    MsgBox "Bearbeitete Dokumente: " & intDokumentenzaehlerBearbeitet  
    
    fm1.cmdBtnStart.Caption = "Übertragung Formatierung starten"   
    
End Sub

neugierige Grüße,
Andreas
Member: ahstax
ahstax Aug 27, 2013 at 13:14:32 (UTC)
Goto Top
Kann man da vielleicht was mit .ListTemplates machen?
Wenn ja, hab ich noch nicht verstanden, wie...
Member: ahstax
ahstax Sep 09, 2013 at 12:18:08 (UTC)
Goto Top
Ja, der Fehler saß mal wieder vor dem PC...

Wichtig ist (nach meiner Beobachtung), dass man bei einem Office 2010-PC eine Vorlage im dotx-Format verwendet.
Dann klappts auch mit dem Nachbarn...! face-wink

Danke für die Hilfe der versammelten Mannschaft!