我制作了一个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
答案 0 :(得分:2)
这是一个有趣的任务,我已经好几年没看过了...诀窍是在Word应用程序界面中打开文档,而不是在Excel中就地打开。
我已经修改了问题中的代码。为了使操作更容易(简短),我删除了Word文档中的编辑内容,只写了几个书签。当然可以放回去。
我非常建议使用VBA为形状分配名称。 Office应用程序可以随意更改其分配的通用名称,因此依赖“对象2”有时可能会导致问题。
不要不要在这种情况下使用Activate
方法(已注释掉)。如果对象已经就地激活,则无法在Word.Application中打开文档。
使用带有参数OLEFormat.Object.Verb
的{{1}}方法在Word中打开文档。
打开后,可以将OLE对象设置为Word文档对象。
来自您的评论:xlOpen
不。最好使用相应的'ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument '<--- This is for closing footer and header?
对象。为此有许多示例。如果您在使用它们时遇到问题,请提出一个新问题。
在Word应用程序中打开的Word文档可以保存为文件(就地打开的文档不能保存)。关于不保存编辑的问题,但是...有两种基本方法:
Word的对象模型能够将任意数量的操作分组为单个“撤消记录”。
Range
完成编辑后,返回到“空”(不变)文档:
Set objUndo = objWord.Application.UndoRecord
objUndo.StartCustomRecord "Edit In Word"
最后,要关闭文档,请退出Word应用程序而不保存更改。
objUndo.EndCustomRecord
Set objUndo = Nothing
objWord.Undo