(这个问题是在Word应用程序接口(而不是就地)。究其原因,这是必要的,以便能够将结果保存为独立的文件上how to work with a document embedded in an Excel workbook后续。)
此代码是做什么需要做的。打开嵌入Word模板,在填补它,并将其保存为新的副本。不工作的唯一部分是.Application.Quit False
。入门字错误:“微软Word已停止工作”。可这是什么故障的可能原因是什么?
Sub opentemplateWord()
Dim sh As Shape
Dim objOLE As OLEObject
Dim objWord As Object 'Word.Document
Dim objRng As Object 'Word.Range
Dim objUndo As Object 'Word.UndoRecord
Dim cell As Excel.Range
Dim xlRng As Excel.Range
Dim xlSht As Worksheet
Set xlSht = Sheets("Main")
With xlSht
Set xlRng = .Range("E1", .Range("E" & Rows.Count).End(xlUp))
End With
''The shape holding the object from 'Create from file'
''Object 2 is the name of the shape
Set sh = Worksheets("Templates").Shapes("WordFile")
''Activate the contents of the object
sh.OLEFormat.Activate
Set objOLE = sh.OLEFormat.Object
Set objWord = objOLE.Object
With objWord
Set objRng = .Range.Characters.Last
Set objUndo = .Application.UndoRecord
objUndo.StartCustomRecord ("Doc Data")
Set xlSht = Sheets("Main")
.Bookmarks("ProjectName1").Range.Text = xlSht.Range("B10").Value
.Bookmarks("ProjectName2").Range.Text = xlSht.Range("B11").Value
.Bookmarks("ProjectName3").Range.Text = xlSht.Range("B12").Value
.Bookmarks("ProjectName4").Range.Text = xlSht.Range("B13").Value
.Bookmarks("ProjectName5").Range.Text = xlSht.Range("B14").Value
For Each cell In xlRng
objRng.InsertAfter vbCr & cell.Offset(0, -1).Text
Select Case LCase(cell.Value)
Case "title"
objRng.Paragraphs.Last.Style = .Styles("Heading 1")
Case "main"
objRng.Paragraphs.Last.Style = .Styles("Heading 2")
Case "sub"
objRng.Paragraphs.Last.Style = .Styles("Heading 3")
Case "sub-sub"
objRng.Paragraphs.Last.Style = .Styles("Heading 4")
Case "par"
objRng.Paragraphs.Last.Style = .Styles("Normal")
End Select
Next cell
Set xlSht = Sheets("Main")
.SaveAs2 ActiveWorkbook.Path & "\" & _
xlSht.Range("B2").Value & ", " & _
xlSht.Range("B3").Value & "_" & _
xlSht.Range("B4").Value & "_" & _
xlSht.Range("B5").Value & ".docx"
objUndo.EndCustomRecord
.Undo
.Application.Quit False '<---- Please close Word application
End With
Set objWord = Nothing '<---- Please free up objWord
End Sub
自动化当其他Office应用程序的内存可以得到“五花大绑”由于各种原因。一个重要因素是该代码已经被使用管理对象。在某些时候,这些都需要以释放内存被“释放”。如果不妥善处理,他们可以保持应用程序打开(即使它不可见)而引起的问题。
一个可能的问题可能是xlSheet
的多个实例。因为它总是被分配在同一工作表,这只需要做一次。如果你想重新使用一个对象(对于不同的对象),代码有问题,首先设置分配不同的对象将其之前Nothing
的对象。 (这通常是没有必要的,但有时它帮助。)
在这个问题的代码在Excel中运行,并使用了一些字的对象。这些字对象可以成为一个问题(在Excel对象将“走出去的范围”,当过程结束)。因此,这是很好的编码习惯,当他们不再需要设置的对象,以便Nothing
。
从问题的代码示例来说明:
With objWord 'a Word document
objUndo.EndCustomRecord
.Undo
Set objUndo = Nothing '<---- Release Word objects in Excel code
Set objRng = Nothing
.Application.Quit False '<---- Please close Word application
End With
Set objWord = Nothing '<---- Please free up objWord
End Sub