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