从Excel填充Word文档而不删除书签



我正在尝试根据Excel中的数据填充Word文档。由于许多特定的工作要求,我需要在Word中保留书签。我将这些网站用作资源。

替换Word中书签中的文本而不删除书签http://wordmvp.com/FAQs/MacrosVBA/InsertingTextAtBookmark.htmhttp://www.wiseowl.co.uk/blog/s199/word-bookmarks.htm

我在 CopyCell 的最后一行收到编译错误。

Option Explicit
Dim wd As New Word.Application
Dim DataCell As Range
Sub ReportData()
'Open word template
wd.Documents.Open (Range("D4") & Range("D5"))
wd.Visible = True
'Creates range with all of the data used in the report
Dim DataRange As Range
Range("D7").Select
Set DataRange = Range(ActiveCell, ActiveCell.End(xlDown))
'Uses copycell function. "Name" is the bookmark name, 0 is the Rowoffset
For Each DataCell In DataRange
  CopyCell "Name", 0
  CopyCell "Employer", 1
Next
End Sub
Sub CopyCell(BookMarkName As String, RowOffset As Integer)
Dim BMRange As Word.Range
wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName
Set BMRange = wd.Selection.Range.Duplicate
BMRange.Text = DataCell.Offset(RowOffset, 0).Value
wd.Bookmarks.Add BookMarkName, BMRange
End Sub

BookmarksDocument对象的属性,而不是 Word Application对象的属性

所以你必须改变:

白矮星。Bookmarks.Add BookMarkName, BMRange

自:

白矮星。ActiveDocument.Bookmarks.Add BookMarkName, BMRange

此外,您可以考虑以下事项:

  • 您应该将公共变量的使用限制在严格不可避免的地方(例如:与用户表单通信(

  • 避免Activate/ActiveXXX/Selection/Select模式,并使用完全限定的范围引用

  • 您正在迭代"垂直">
  • 范围,然后再次"垂直"(即向下偏移一个单元格(:您是否想"水平"偏移(即到相邻单元格(?

对于上述所有内容,我建议对您的代码进行以下重构:

Option Explicit
Sub ReportData()
    Dim wd As Word.Application
    Dim DataCell As Range
    Set wd = New Word.Application
   'Open word template
    wd.Documents.Open Range("D4") & Range("D5")
    wd.Visible = True
    'Creates range with all of the data used in the report
    With Range("D7")
        'Uses copycell function. "Name" is the bookmark name, 0 is the Rowoffset
        For Each DataCell In Range(.Cells, .End(xlDown))
          CopyCell wd, DataCell, "Name", 0
          CopyCell wd, DataCell, "Employer", 1
        Next
    End With
    wd.ActiveDocument.Close True '<--| close and save word document
    wd.Quit '<--| close word application
    Set wd = Nothing '<--| clean memory
End Sub
Sub CopyCell(wd As Word.Application, DataCell As Range, BookMarkName As String, ColOffset As Integer)
    Dim BMRange As Word.Range
    wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName
    Set BMRange = wd.Selection.Range.Duplicate
    BMRange.Text = DataCell.Offset(0, ColOffset).Value
    wd.ActiveDocument.Bookmarks.Add BookMarkName, BMRange
End Sub

最新更新