首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Excel复制到Word并打印,代码每次打印时都会创建工作簿副本

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

Stack Overflow用户
提问于 2015-09-24 00:48:29
回答 1查看 772关注 0票数 1

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

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

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2015-09-25 19:35:54

问题在于这一行:

代码语言:javascript
复制
WdObj.Selection.PasteSpecial Link:=False, _
        DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False

它使用未在Excel VBA中定义的常量wdPasteTextwdInLine。实际上,您正在执行以下操作:

代码语言:javascript
复制
WdObj.Selection.PasteSpecial Link:=False, _
        DataType:="", Placement:="", DisplayAsIcon:=False

Excel区域的默认选择性粘贴模式显示为wdPasteOLEObject -嵌入的Excel工作表。在创建此工作簿的过程中,Word会创建一个新的Excel工作簿,其中包含粘贴的数据。这些是您看到的工作簿。如果您打开Excel (打开VBA编辑器),手动复制一个区域并将特殊/对象粘贴到Word中,您可以看到临时工作簿正在创建,然后再次快速关闭。不幸的是,如果在某些代码运行时发生这种情况,似乎会发生各种奇怪的事情。我没有让工作簿保持打开状态,但我已经让宏随机停止,文档和/或工作簿关闭,代码执行跳转到其他书中的宏,等等。

修复方法很简单,因为您不想要嵌入的Excel对象-将wdPasteTextwdInLine替换为它们的数值,即2和0:

代码语言:javascript
复制
WdObj.Selection.PasteSpecial Link:=False, _
        DataType:=2, Placement:=0, DisplayAsIcon:=False

最后,这是一个很好的例子,说明了为什么应该始终将Option Explicit设置在代码的顶部。如果您这样做了,那么对于wdPasteTextwdInLine,您会得到一个"Variable not defined“错误,这会直接将您带到问题所在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32745131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档