2016-04-25 10 views
1

Ich versuche, jede Zeile einer Excel-Datei zu einer neuen PDF-Datei auf Basis einer docx-Vorlage zu epxtieren, die den Text enthält, den dieses Makro durch relevante Felder suchen und ersetzen wird in einem Excel-Blatt.Excel-VBA Find.replace mit Schleife funktioniert nicht korrekt

Das Problem ist der Code funktioniert nur in der ersten Schleife korrekt. Nach der ersten Schleife wird eine 1.pdf-Datei mit dem korrekten Feld von Excel exportiert, aber die Vorlage docx-Datei wird nun auch mit den Daten von Excel gespeichert, was dazu führt, dass die Ergebnisse später nicht mehr korrekt funktionieren. Alle Excel-Felder der nächsten Zeile werden aus irgendeinem Grund alle an den Start der Vorlage angehängt.

Bitte helfen Sie mir diesen Code zu korrigieren, so dass jedes Mal, wenn die Schleife korrekt ausgeführt wird. Das Wunschergebnis ist, dass jede Reihe von Excel nur in eine neue PDF-Datei exportiert wird und die Vorlage docx intakt bleibt.

Danke.

Sub ReplaceText() 
    Dim wApp As Word.Application 
    Dim wDoc As Word.Document 
    Dim z As Integer 
    Set wApp = CreateObject("Word.Application") 
    wApp.Visible = True 
    For z = 3 To 6 

    Set wDoc = wApp.Documents.Open("D:\test.docx") 

With wDoc 
.Application.Selection.Find.Text = "TIEU_DE" 
.Application.Selection.Find.Execute 
.Application.Selection = Range("B" & z) 
.Application.Selection.EndOf 

.Application.Selection.Find.Text = "ENGLISH" 
.Application.Selection.Find.Execute 
.Application.Selection = Range("C" & z) 
.Application.Selection.EndOf 

.Application.Selection.Find.Text = "tenTG" 
.Application.Selection.Find.Execute 
.Application.Selection = Range("D" & z) 
.Application.Selection.EndOf 

.Application.Selection.Find.Text = "Noidung" 
.Application.Selection.Find.Execute 
.Application.Selection = Range("E" & z) 
.Application.Selection.EndOf 

.SaveAs2 "D:\test.pdf", 17 

.Close SaveChanges = False 

    End With 
    Next z 

End Sub 
+0

Dank der folgenden Antworten wird mein Problem gelöst durch: Erstens, mit ".Close SaveChanges: = False"; und zweitens "dotx as" als Vorlagendateiformat anstelle von "docx" verwenden –

Antwort

0

Die .Close SaveChanges = False gibt mir einen Kompilierfehler (Variable nicht definiert)

.Close SaveChanges := False funktioniert für mich und speichert die Änderungen nicht.

Der Grund, warum alles an den Anfang des Dokuments in der nächsten Iteration kopiert wird, ist, dass die Methode find.execute die Auswahl nicht verschiebt (da sie nichts findet), so dass der Cursor am Anfang des Dokuments bleibt Kopiere immer noch die Zellen.

+0

Danke. Hinzugefügt .Close SaveChanges: = False macht es, ich habe nicht bemerkt, dass ich das ":" vermisse. –

0

Statt test.docx Verwendung Wortschablone test.dotx (create it)

Für PDF-Datei Verwendung so etwas wie

 .ExportAsFixedFormat OutputFileName:="D:\test" & z & ".pdf", ExportFormat:= _ 
wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:=wdExportAllDocument, _ 
Item:=wdExportDocumentContent, IncludeDocProps:=True 

Speichern und nach als Add

wDoc.Close saveChanges:=False 
Set wDoc = Nothing 
+0

Dies ist eine sehr gute Idee. Durch die Verwendung von test.dotx wird bei jeder Ausführung des Codes ein neues Dokument erstellt, das die Bearbeitung der Vorlage verhindert. Danke vielmals. –

Verwandte Themen