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

Vba 从Excel复制到Word并打印,代码每次打印时都会创建工作簿的副本,vba,excel,printing,ms-word,Vba,Excel,Printing,Ms Word,下面发布的代码创建了工作簿的副本,其中包含for循环每次迭代的宏 代码将一些信息从一张表传输到一张名为“Ticket”的表。然后,代码打开一个Word文件,该文件具有页眉和页脚以及公司徽标的水印,将信息从Excel工作表(“票证”)复制到带有水印的Word文档,然后打印Word文档。代码执行完毕后,每个打印的票据都会有一个新的Excel手册(一个隐藏的手册),Book1、Book2、Book3等(全部隐藏)。我不知道这些书被保存在哪里,也不知道如何阻止这种情况的发生 有人能解释一下我做了什么吗

下面发布的代码创建了工作簿的副本,其中包含for循环每次迭代的宏

代码将一些信息从一张表传输到一张名为“Ticket”的表。然后,代码打开一个Word文件,该文件具有页眉和页脚以及公司徽标的水印,将信息从Excel工作表(“票证”)复制到带有水印的Word文档,然后打印Word文档。代码执行完毕后,每个打印的票据都会有一个新的Excel手册(一个隐藏的手册),Book1、Book2、Book3等(全部隐藏)。我不知道这些书被保存在哪里,也不知道如何阻止这种情况的发生

有人能解释一下我做了什么吗

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
Sub A_printdailtickets()
'---------------------------------------------------------------------------------------
'程序:A_PrintDailyTickets
作者:AWS
“日期:2015年9月5日
“目的:为所有三辆卡车打印一整天的车票,并使用“灵魂港”标记
“完成2015年9月5日
'
'---------------------------------------------------------------------------------------
将lLstRow设置为长,ws设置为工作表
Dim WdObj作为对象,fname作为字符串,objDoc作为对象
Application.ScreenUpdating=False
设置ws=ActiveSheet
fname=“Word”
附票
lLstRow=ActiveSheet.Range(“A50”).End(xlUp).Row
对于i=2至lLstRow
表(“票证”).单元格(2,4).值=ws.单元格(i,1).值'日期
表(“票证”)。单元格(4,3)。值=ws。单元格(i,2)。值“路由”
表(“票证”)。单元格(6,8)。值=ws。单元格(i,4)。值“Phone-1”
表(“票证”)。单元格(7,8)。值=ws。单元格(i,5)。值“Phone-2”
表(“票证”).Cells(6,3).Value=ws.Cells(i,6).Value'名称
表(“票证”).Cells(7,3).Value=ws.Cells(i,7).Value'地址
表(“票证”).单元格(8,3).值=ws.单元格(i,8).值和“,TX”'城市
表(“票证”).Cells(9,5).Value=ws.Cells(i,9).Value'Zip
表(“票证”).单元格(14,3).值=ws.单元格(i,10).值”项
表(“票证”)。单元格(21,3)。值=ws。单元格(i,11)。值’注释
Set WdObj=CreateObject(“Word.Application”)
WdObj.Visible=False
表格(“票证”)。选择
范围(“A1:H30”)。选择
选择。复制“您的复制范围”
WdObj.Documents.Open文件名:=_
“C:\Users\AWS\Documents\Excel\Zip Codes-Soul's Harbor\Monthly Route Sheets\捐赠者收据\Soul's Harbor捐赠模板(空白)-可用-2.docx”
WdObj.Selection.paste特殊链接:=False_
数据类型:=wdPasteText,位置:=wdInLine,DisplayAsIcon:=False
Application.CutCopyMode=False
如果fname为“”,则确保fname不是空的
带WdObj
'.ChangeFileOpenDirectory“c:\temp”'保存目录
'.ActiveDocument.SaveAs文件名:=fname&“.doc”
以
其他:
MsgBox(“文件未保存,命名范围被破坏,请再次猜测。”)
如果结束
WdObj.打印输出
WdObj.ActiveDocument.Close savechanges:=False
WdObj.Quit savechanges:=False
范围(“C1:H30”)。选择
选择.ClearContents
范围(“E1”)。选择
Application.CutCopyMode=False
设置WdObj=Nothing
'设置objDoc=Nothing
下一个
以
ws.Select
设置ws=Nothing
设置WdObj=Nothing
'设置objDoc=Nothing
Application.ScreenUpdating=True
端接头

问题在于线路:

WdObj.Selection.PasteSpecial Link:=False, _
        DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False
这将使用Excel VBA中未定义的常量
wdPasteText
wdInLine
。实际上,您正在执行以下操作:

WdObj.Selection.PasteSpecial Link:=False, _
        DataType:="", Placement:="", DisplayAsIcon:=False
Excel范围的默认粘贴特殊模式似乎是
wdPasteOLEObject
——一个嵌入式Excel工作表。作为创建此工作簿过程的一部分,Word将创建一个新的Excel工作簿,其中包含粘贴的数据。这些是你看到的工作手册。如果打开Excel(打开VBA编辑器),手动复制一个范围并将特殊/对象粘贴到Word中,则可以看到正在创建的临时工作簿,然后再次快速关闭。不幸的是,如果在某些代码运行时发生这种情况,各种奇怪的事情似乎都会发生。我没有让工作簿保持打开状态,但是我让宏随机停止,文档和/或工作簿关闭,代码执行跳转到其他书籍中的宏,等等

由于您不需要嵌入Excel对象,因此修复非常简单-将
wdPasteText
wdInLine
替换为它们的数值,即2和0:

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

最后,这是一个很好的例子,说明了为什么您应该始终在代码顶部设置
Option Explicit
。如果有,则会出现
wdPasteText
wdInLine
的“变量未定义”错误,这将直接导致问题。

问题在于:

WdObj.Selection.PasteSpecial Link:=False, _
        DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False
这将使用Excel VBA中未定义的常量
wdPasteText
wdInLine
。实际上,您正在执行以下操作:

WdObj.Selection.PasteSpecial Link:=False, _
        DataType:="", Placement:="", DisplayAsIcon:=False
Excel范围的默认粘贴特殊模式似乎是
wdPasteOLEObject
——一个嵌入式Excel工作表。作为创建此工作簿过程的一部分,Word将创建一个新的Excel工作簿,其中包含粘贴的数据。这些是你看到的工作手册。如果打开Excel(打开VBA编辑器),手动复制一个范围并将特殊/对象粘贴到Word中,则可以看到正在创建的临时工作簿,然后再次快速关闭。不幸的是,如果在某些代码运行时发生这种情况,各种奇怪的事情似乎都会发生。我没有让工作簿保持打开状态,但是我让宏随机停止,文档和/或工作簿关闭,代码执行跳转到其他书籍中的宏,等等

由于您不需要嵌入式Excel obj,因此修复非常简单