从Excel复制到Word并打印,代码会在每次打印时创build工作簿的副本

下面的代码创build了for循环的每个迭代包含macros的工作簿的副本。

代码将一些信息从一张纸传送到名为“票据”的纸张。 然后代码打开一个Word文件,其中包含公司徽标的页眉和页脚以及水印,将信息从Excel工作表(“工单”)复制到带有水印的Word文档,然后打印Word文档。 一旦代码执行完毕,就会为每张打印的票证,Book1,Book2,Book3等(全部隐藏)提供一本新的Excel书籍(藏书)。 我不知道这些书籍在哪里被保存或如何阻止这种情况发生。

有人可以解释我做了什么吗?

Sub A_PrintDailyTickets() '--------------------------------------------------------------------------------------- ' Procedure : A_PrintDailyTickets ' Author : AWS ' Date : 9/5/2015 ' Purpose : Print a full day's worth of tickets for all three trucks, with word using the Soul's Harbor water mark ' Complete 9/5/2015 ' '--------------------------------------------------------------------------------------- Dim lLstRow As Long, ws As Worksheet Dim WdObj As Object, fname As String ' , objDoc As Object Application.ScreenUpdating = False Set ws = ActiveSheet fname = "Word" With Sheets("Ticket") lLstRow = ActiveSheet.Range("A50").End(xlUp).Row For i = 2 To lLstRow Sheets("Ticket").Cells(2, 4).Value = ws.Cells(i, 1).Value ' Date Sheets("Ticket").Cells(4, 3).Value = ws.Cells(i, 2).Value ' Route Sheets("Ticket").Cells(6, 8).Value = ws.Cells(i, 4).Value ' Phone-1 Sheets("Ticket").Cells(7, 8).Value = ws.Cells(i, 5).Value ' Phone-2 Sheets("Ticket").Cells(6, 3).Value = ws.Cells(i, 6).Value ' Name Sheets("Ticket").Cells(7, 3).Value = ws.Cells(i, 7).Value ' Address Sheets("Ticket").Cells(8, 3).Value = ws.Cells(i, 8).Value & ", TX" ' City Sheets("Ticket").Cells(9, 5).Value = ws.Cells(i, 9).Value ' Zip Sheets("Ticket").Cells(14, 3).Value = ws.Cells(i, 10).Value ' Items Sheets("Ticket").Cells(21, 3).Value = ws.Cells(i, 11).Value ' Notes Set WdObj = CreateObject("Word.Application") WdObj.Visible = False Sheets("Ticket").Select Range("A1:H30").Select Selection.Copy 'Your Copy Range WdObj.Documents.Open Filename:= _ "C:\Users\AWS\Documents\Excel\Zip Codes - Soul's Harbor\Monthly Route Sheets\Donor Receipt\Soul's Harbor Donation Templet (Blank) - Usable - 2.docx" WdObj.Selection.PasteSpecial Link:=False, _ DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False Application.CutCopyMode = False If fname <> "" Then 'make sure fname is not blank With WdObj '.ChangeFileOpenDirectory "c:\temp" 'save Dir '.ActiveDocument.SaveAs Filename:=fname & ".doc" End With Else: MsgBox ("File not saved, naming range was botched, guess again.") End If WdObj.PrintOut WdObj.ActiveDocument.Close savechanges:=False WdObj.Quit savechanges:=False Range("C1:H30").Select Selection.ClearContents Range("E1").Select Application.CutCopyMode = False Set WdObj = Nothing 'Set objDoc = Nothing Next End With ws.Select Set ws = Nothing Set WdObj = Nothing 'Set objDoc = Nothing Application.ScreenUpdating = True End Sub 

问题是这样的:

 WdObj.Selection.PasteSpecial Link:=False, _ DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False 

这使用常量wdPasteTextwdInLine ,它们在Excel VBA中没有定义。 有效地执行以下操作:

 WdObj.Selection.PasteSpecial Link:=False, _ DataType:="", Placement:="", DisplayAsIcon:=False 

Excel范围的默认粘贴特殊模式显示为wdPasteOLEObject – 一个embedded的Excel工作表。 作为创build过程的一部分,Word将创build一个新的Excel工作簿,并在其中粘贴数据。 这些是你看到的工作簿。 如果打开Excel(打开VBA编辑器)并手动复制范围并将特殊/对象粘贴到Word中,则可以看到正在创build的临时工作簿,然后再次快速closures。 不幸的是,如果在一些代码正在运行的时候发生这种情况,那么各种奇怪的事情似乎都会发生 我还没有将工作簿保持打开状态,但是我已经随机地停止了macros,文档和/或工作簿closures,代码执行跳转到其他书中的macros等。

由于您不需要embedded式Excel对象,所以对于您的修复很简单 – 将wdPasteTextwdInLinereplace为2和0的数字值:

 WdObj.Selection.PasteSpecial Link:=False, _ DataType:=2, Placement:=0, DisplayAsIcon:=False 

最后,这是一个很好的例子,你总是应该在代码的顶部设置Option Explicit 。 如果你有,你会得到一个“variables未定义”错误wdPasteTextwdInLine ,这将直接导致你的问题。