2016-12-09 6 views
0

Ich versuche, einen einfachen Code zu entwickeln, der mehrere kleine docx (oder rtf) in ein docx kombiniert.Mehrere Worddokumente zusammenführen

Dokumenterstellung auf den folgenden Punkten aufbauen sollte:
1. i in Spalte A eine Liste mit den Namen der kleinen docs
2. in Spalte B eines von 2 Einträgen ist (ja/nein)
ex :

A  B 
    doc1 yes  
    doc2 no  
    doc3 yes  
    doc4 yes  
    doc5 no  

3. i bereits die Lage der kleinen docs in einer Zelle in dem Blatt 4. auch den Ort zugeführt, wo die neuen (fusionierten) doc

geliefert haben

unten platziert würde ein Sampl e des Codes

Application.ScreenUpdating = False 
strRandom = Replace(Replace(Replace(Now, ":", ""), "/", ""), " ", "") 
MergeFileName = "Merger" & strRandom & ".doc" 
MergeFolder = mainworkbook.Sheets("Main").Range("L10").Value 

Set objWord = CreateObject("Word.Application") 
Set objDoc = objWord.Documents.Add 
objWord.Visible = True 
Set objSelection = objWord.Selection 
'objSelection.TypeText ("Saving this file after this text") 
objDoc.SaveAs (MergeFolder & MergeFileName) 

For i = 1 To NoOfFiles 
    If Range("B" & i).Value = "Yes" Then 
     Set objTempWord = CreateObject("Word.Application") 
     Set tempDoc = objWord.Documents.Open(Folderpath & "\" & Range("A" & i).Value) 
     'Set wb = Documents.Open(MyPath & "\" & MyName) 
     Set objTempSelection = objTempWord.Selection 
     'objTempSelection.WholeStory 
     'Selection.Copy 
     tempDoc.Range.Select 
     tempDoc.Range.Copy 
     'Windows(1).Activate 
     'Selection.EndKey Unit:=wdLine 
     'objSelection.TypeParagraph 
     objSelection.PasteSpecial xlPasteAll 
     .InsertBreak wdPageBreak 
     tempDoc.Close 
    End If 
Next 

objDoc.Save 
Application.ScreenUpdating = True 
mainworkbook.Sheets("Main").Activate 
MsgBox "Completed...Merge File is saved at " & MergeFolder & MergeFileName 
FetchFileClicked = False 
End Sub 

das Problem mit diesem Code ist, dass es nie die temp doc tötet geöffnet, so hat ich 10 docs i mit 10 WINWORD Prozess am Ende zusammengeführt werden würde und keine MSWord Fenster. gibt es eine Möglichkeit, dieses Problem zu beheben. Ich habe gehört, dass, wenn ich alle kleinen Dokumente in .rtf konvertieren kann ich die Datei analysieren, ohne sie zu öffnen.

wird jede mögliche Hilfe viel

+0

Jedes Mal erstellen Sie durch Ihre Schleife eine Word-Anwendung, die Sie 'objTempWord' nennen.Sie beenden es nie (weshalb Sie mit 10 WINWORD-Prozessen enden), und Sie scheinen es nur zu verwenden, um ein Objekt namens "objTempSelection" zu erstellen, das Sie nie verwenden. Vielleicht werden Sie den überflüssigen Code los und Ihre Probleme werden verschwinden. (Soweit ich weiß, müssen nicht mehrere Word.Applications ausgeführt werden.) – YowE3K

+0

Wenn ich das richtig verstanden habe, haben Sie eine Liste von Dokumenten, und Sie möchten sie alle in eine Datei einfügen. Ich habe dies mit der Selection.InsertFile-Funktion getan, wo Sie die Speicherorte der Dateien mit CreateObject (Word.Application.Documents.Add) definieren, das die Dateien in der neu geöffneten Word-Datei zusammenführt. Dies würde klar definieren, dass Word verwendet wird und nicht WinWord. Wenn das wie etwas klingt, das funktionieren würde, könnte ich versuchen, Code in einer Antwort hinzuzufügen. – Cyril

+0

@ YowE3K: Wenn ich in diesem Prozess beenden, würde es nie öffnen das nächste Dokument in der Liste, um den Inhalt davon zu kopieren, es sei denn, ich fehlen etw. –

Antwort

0

Nach einiger ernsthafter Fehlersuche habe ich es endlich zur Arbeit gebracht, und hier der Code unten.

Application.ScreenUpdating = False 
strRandom = Replace(Replace(Replace(Now, ":", ""), "/", ""), " ", "") 
MergeFileName = "Merger" & strRandom & ".doc" 
MergeFolder = mainworkbook.Sheets("Main").Range("L10").Value 

Set objWord = CreateObject("Word.Application") 
Set appWord = GetObject(, "Word.Application") 
Set objDoc = objWord.Documents.Add 

objWord.Visible = True 

Set objSelection = objWord.Selection 

objDoc.SaveAs (MergeFolder & MergeFileName) 

For i = 1 To NoOfFiles 
    If Range("B" & i).Value = "Yes" Then 
     myName = (Folderpath & "\" & Range("A" & i).Value) 

     With appWord.Selection 
     .InsertFile Filename:=myName 
     End With 

     With objWord.Selection 
     .Collapse Direction:=wdCollapseEnd 
     .InsertBreak Type:=7 
     End With 
    End If 
Next 

objDoc.Save 
Application.ScreenUpdating = True 
mainworkbook.Sheets("Main").Activate 
MsgBox "Completed...Merge File is saved at " & MergeFolder & MergeFileName 

PS: Dank Cyril für die Spitze war es der Schlüssel, der Schmerz von mir zu lösen

+0

Froh, dass das für dich geklappt hat! – Cyril

0

ich diesen Code bin Ziehen von einer Userform I aus einer Sammlung von Vorlagen Dokumente zu füllen verwenden zu erkennen ist, so meine Entschuldigung, wenn dies nicht genau arbeiten, wie ich beschreiben:

Sub Insert_File_From_Location() 

CreateObject (Word.Application.Documents.Add) 

If ComboBox1.Value = "blah" Then 
     Selection.InsertFile FileName:="C:\blah.docx" 
    Else: 
    End If 

End Sub 

Ich nahm alle anderen if-Anweisungen heraus, um es einfacher aussehen zu lassen.

Eine Möglichkeit besteht darin, den obigen Code zu nehmen und zu manipulieren, damit Ihre Column B-Zellen den ComboBox1.Value definieren (Ja/Nein-Einträge). Sie würden dann den Selection.InsertFile FileName: = direkt auf die Position verweisen, die in der angrenzenden Zelle in Spalte A definiert ist. Dies müsste eine dynamische Referenz sein, die eine Schleife durch die letzte Zeile verwendet.

Was ich nicht mache, ist das automatische Speichern des zusammengeführten Dokuments, da ich in der Regel den Inhalt bearbeiten und Abschnitte entfernen muss, die für einige Vorlagen in meiner Sammlung standardmäßig sind.

Hoffentlich hilft das, Karim! Wenn ich nur mit Word-Dokumenten (.doc oder .docx) arbeite, erscheinen zwar Prozesse in meinem Task-Manager, aber sie verschwinden, wenn die Einfügung abgeschlossen ist, und hinterlasse mir einen Word-Prozess für das geöffnete Dokument.

+0

Es tut mir leid, aber ich bin noch neu in VBA, wenn ich getan habe, was Sie im obigen Abschnitt gefragt haben, bekomme ich einen Fehler (Laufzeitfehlerobjekt erforderlich), gerade als ich die Zeile traf, wo ich CreateObject (Word.Application> Dokumente .Add) –

+0

Sie haben ein ">", wo ein "." im CreateObject. – Cyril

0

ist so etwas wie die Kombination mehrerer Word-Dokumente versuchen lassen; Sie müssen alle Inhalte eines jeden kopieren und alles in ein konsolidiertes Word-Dokument einfügen. Das kann sehr lange dauern, besonders wenn sich viele Dateien im Ordner befinden. Führen Sie einfach das unten stehende Skript aus, und der Code übernimmt die gesamte Arbeit für Sie.

Sub MergeAllWordDocs1() 
    Dim i As Long 
    Dim MyName As String, MyPath As String 
    Application.ScreenUpdating = False 
    Documents.Add 
    MyPath = "C:\Users\your_path_here\" ' <= change this as necessary 
    MyName = Dir$(MyPath & "*.do*") ' not *.* if you just want doc files 
    Do While MyName <> "" 
     If InStr(MyName, "~") = 0 Then 
      Selection.InsertFile _ 
    FileName:="""" & MyPath & MyName & """", 
      ConfirmConversions:=False, Link:=False, 
      Attachment:=False 
    Selection.InsertBreak Type:=wdPageBreak 
    End If 
     MyName = Dir() ' gets the next doc file in the directory 
    Loop 
End Sub 
Verwandte Themen