2016-12-09 80 views
0

我想開發一個簡單的代碼,它將多個小docx(或rtf)組合成一個docx。合併mutilple Word Docs

文檔創建應基於以下幾點:
1.我有在列A中的小文檔
2.在B欄是2項中的一個的名稱的列表(是/否)
離:

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

3.我已經提供的小文檔的位置在小區在片材 4.還提供其中新的(合併)DOC將被放置的地方

下面

是一個SAMPL代碼

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 

與此代碼的問題,e是它不會導致死亡打開臨時文檔,所以我有10個文件要合併我會結束了10個WINWORD過程中,沒有窗戶的MSWord。 有沒有辦法解決這個問題。 我聽說如果我將所有小文檔轉換爲.rtf,我可以解析文件而無需打開它。

任何幫助將非常感激

+0

每次通過循環創建一個Word應用程序時,您會調用'objTempWord'。你永遠不會「退出」它(這就是爲什麼你最終得到10個WINWORD進程),你似乎只用它來創建一個你永遠不會使用的名爲'objTempSelection'的對象。也許擺脫多餘的代碼,你的問題就會消失。 (據我所知,沒有必要運行多個Word.Applications。) – YowE3K

+0

如果我正確理解這一點,你有一個文件列表,你想要將它們全部插入到一個文件中。我用Selection.InsertFile函數完成了這個工作,在這個函數中定義了文件的位置,使用CreateObject(Word.Application.Documents.Add)將文件合併到新打開的Word文件中。這將明確定義Word使用,而不是WinWord。如果這聽起來像是可行的,我可以嘗試在響應中添加一些代碼。 – Cyril

+0

@ YowE3K:如果我在這個過程中引入了quit,它將永遠不會打開列表中的下一個文檔來複制它的內容,除非我錯過了smth。 –

回答

0

經過一些嚴重的故障排除後,我終於得到它的工作,並在這裏下面的代碼。

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:感謝西里爾冰山它的關鍵是解決我的痛苦

+0

很高興爲您效力! – Cyril

0

我從一個窗體我用它來從模板集合填充文件拉動這個代碼,所以我的道歉,如果這並不完全工作,我將描述:

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 

我拿出所有其他的if語句來使它看起來更簡單。

一個可能性是,採取上述代碼並操縱,讓您的列B單元格定義ComboBox1.Value(是/否條目)。然後,您可以將Selection.InsertFile FileName:=直接指向A列中相鄰單元格中定義的位置。這需要使用循環遍歷最後一行的動態引用。

我沒有進行的是自動保存合併的文檔,因爲我通常需要操作內容並刪除對我的集合中某些模板標準的部分。

希望這有助於卡里姆!當只使用Word文檔(.doc或.docx)時,我確實在我的任務管理器中顯示了進程,但是在插入完成時它們會消失,併爲我打開的文檔留下一個Word進程。

+0

我對不起,但我還是新來的VBA,如果我做了你在上面的部分要求我得到一個錯誤(運行時錯誤對象需要),就像我在我定義的CreateObject(Word.Application> Documents .Add) –

+0

你有一個「>」應該有一個「。」。在CreateObject中。 – Cyril

0

讓我們嘗試一些像合併多個Word文檔;您需要複製每個文件的所有內容,並將所有內容粘貼到一個統一的Word文檔中。這可能需要很長時間,特別是如果文件夾中有很多文件。只需運行下面的腳本,代碼將爲您完成所有工作。

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