编辑嵌入在工作簿中的Word文档并另存为副本

时间:2019-01-29 10:38:03

标签: excel vba ms-word

我制作了一个Word模板并将其作为对象插入到Excel中。我正在用代码打开它,并将数据输入到书签和主要部分。但是,在完成代码处理之后,我的嵌入式模板将所有数据存储在其中。因此,它不再是模板,而是我使用代码创建的文件。

应该将嵌入式Word模板作为副本打开,因为我不想对原始嵌入式模板进行任何更改,也不要一直用代码将其置空(或者这是唯一可行的方法吗?)。该代码是否有可能将嵌入式Word文档作为副本打开,对其进行更改并另存为Word文档?我在互联网上找不到任何有用的信息。

Sub opentemplateWord()
Dim sh As Shape
Dim objWord As Object ''Word.Document
Dim objOLE As OLEObject
Dim wSystem As Worksheet
Dim cell As Range


    Set wSystem = Worksheets("Templates")
''The shape holding the object from 'Create from file'
''Object 2 is the name of the shape
Set sh = wSystem.Shapes("Object 2")
''Activate the contents of the object
sh.OLEFormat.Activate
''The OLE Object contained
Set objOLE = sh.OLEFormat.Object
''This is the bit that took time
Set objWord = objOLE.Object


'>------- This Part Inputs Bookmarks

objWord.Bookmarks.Item("ProjectName1").Range.Text = ThisWorkbook.Sheets("MAIN").Range("D15").Value
objWord.Bookmarks.Item("ProjectName2").Range.Text = ThisWorkbook.Sheets("MAIN").Range("D16").Value


'>------- This Part Inputs Text


  'ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument '<--- This is for closing footer and header?


    With objWord '<--| reference 'Selection' object


For Each cell In ThisWorkbook.Worksheets("Offer Letter").Range("C1", ThisWorkbook.Worksheets("Offer Letter").Range("C" & Rows.Count).End(xlUp))
     Select Case LCase(cell.Value)
    Case "title"
                .TypeParagraph
                .Style = objWord.ActiveDocument.Styles("Heading 1")
                .TypeText Text:=cell.Offset(0, -1).Text
    Case "main"
                .TypeParagraph
                .Style = objWord.ActiveDocument.Styles("Heading 2")
                .TypeText Text:=cell.Offset(0, -1).Text


    Case "sub"
                .TypeParagraph
                .Style = objWord.ActiveDocument.Styles("Heading 3")
                .TypeText Text:=cell.Offset(0, -1).Text


    Case "sub-sub"
                .TypeParagraph
                .Style = objWord.ActiveDocument.Styles("Heading 4")
                .TypeText Text:=cell.Offset(0, -1).Text



    End Select
   Next cell
    End With


objWord.Application.Visible = False

''Easy enough
    objWord.SaveAs2 ActiveWorkbook.Path & "\" & Sheets("Other Data").Range("AN2").Value & ", " & Sheets("Other Data").Range("AN7").Value & "_" & Sheets("Other Data").Range("AN8").Value & "_" & Sheets("Other Data").Range("AX2").Value & ".docx"


End Sub

1 个答案:

答案 0 :(得分:2)

这是一个有趣的任务,我已经好几年没看过了...诀窍是在Word应用程序界面中打开文档,而不是在Excel中就地打开。

我已经修改了问题中的代码。为了使操作更容易(简短),我删除了Word文档中的编辑内容,只写了几个书签。当然可以放回去。

  1. 我非常建议使用VBA为形状分配名称。 Office应用程序可以随意更改其分配的通用名称,因此依赖“对象2”有时可能会导致问题。

  2. 不要不要在这种情况下使用Activate方法(已注释掉)。如果对象已经就地激活,则无法在Word.Application中打开文档。

  3. 使用带有参数OLEFormat.Object.Verb的{​​{1}}方法在Word中打开文档。

  4. 打开后,可以将OLE对象设置为Word文档对象。

  5. 来自您的评论:xlOpen不。最好使用相应的'ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument '<--- This is for closing footer and header?对象。为此有许多示例。如果您在使用它们时遇到问题,请提出一个新问题。

  6. 在Word应用程序中打开的Word文档可以保存为文件(就地打开的文档不能保存)。关于不保存编辑的问题,但是...有两种基本方法:

    • 另存为,在编辑之前,请打开该文档,进行编辑并保存。然后应保持原件不变
    • 在对象中进行编辑,然后保存,然后撤消。该方法已在代码示例中显示
  7. Word的对象模型能够将任意数量的操作分组为单个“撤消记录”。

    Range

完成编辑后,返回到“空”(不变)文档:

Set objUndo = objWord.Application.UndoRecord
objUndo.StartCustomRecord "Edit In Word"

最后,要关闭文档,请退出Word应用程序而不保存更改。

    objUndo.EndCustomRecord
    Set objUndo = Nothing
    objWord.Undo