2015-09-23 14 views
1

下面发布的代码会创建一个包含for循环的每次迭代的宏的工作簿的副本。从Excel复制到Word并打印,代码会在每次打印时创建工作簿的副本

该代码将一些信息从一张纸传输到名为“Ticket”的纸张。代码然后打开一个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 
+1

我在代码中看到很多问题,但并不完全在生成工作表的地方。我将从“With Sheets”(“Ticket”)开始,说明您没有使用期限来限定房产。例如在Range(“C1:H30”)上选择''应该是'.Range(“C1:H30”)。选择'与“Ticket”表单中的范围相关。修复该参考,以便它更清晰,并且您的问题将更容易识别。我建议你在循环开始时设置一个断点,然后按下F8逐步浏览并查看每个步骤的创建方式。此致, – nbayly

+0

另请参阅[如何避免使用选择Excel VBA宏](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – aucuparia

回答

0

的问题是线:

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 - 一个嵌入Excel工作表。作为创建过程的一部分,Word将创建一个新的Excel工作簿,并在其中粘贴数据。这些是你看到的工作簿。如果打开Excel(打开VBA编辑器)并手动复制范围并将特殊/对象粘贴到Word中,则可以看到正在创建的临时工作簿,然后再次快速关闭。不幸的是,如果在一些代码正在运行时发生这种情况,各种奇怪的事情似乎就会发生。我还没有将工作簿保持打开状态,但我已经随机执行了宏停止,文档和/或工作簿关闭,代码执行跳转到其他书中的宏等。

对于您来说修复很简单,因为您不会“不想嵌入Excel对象 - 取代wdPasteTextwdInLine使用其数值,这是2和0:

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

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