输入文字和书签嵌入在工作簿中的Word模板

问题描述 投票:1回答:1

(这个问题是在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
excel vba ms-word
1个回答
2
投票

自动化当其他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
© www.soinside.com 2019 - 2024. All rights reserved.