Vba 从excel填充word文档而不删除书签

Vba 从excel填充word文档而不删除书签,vba,excel,Vba,Excel,我正在尝试根据Excel中的数据填充Word文档。由于一些具体的工作要求,我需要保留Word中的书签。我将这些网站用作资源 我在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.Vi

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

我在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

书签
文档
对象的属性,而不是Word
应用程序
对象的属性

所以你必须改变:

wd.Bookmarks.addbookmarkname,BMRange

致:

wd.ActiveDocument.Bookmarks.addbookmarkname,BMRange

<> P>此外,您可以考虑以下内容:

  • 您应该将公共变量的使用限制在绝对不可避免的情况下(例如:与用户表单通信)

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

  • 您在“垂直”范围内迭代,然后再次“垂直”偏移当前单元格(即向下偏移一个单元格):是否希望“水平”偏移(即偏移到相邻单元格)

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

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
选项显式
子报表数据()
Dim wd作为Word.Application
Dim数据单元作为范围
Set wd=新单词。应用程序
'打开word模板
wd.Documents.Open范围(“D4”)和范围(“D5”)
wd.Visible=True
'使用报表中使用的所有数据创建范围
带量程(“D7”)
'使用复制单元功能。“Name”是书签名称,0是行偏移量
对于范围内的每个数据单元(.Cells、.End(xlDown))
CopyCell wd,数据单元,“名称”,0
CopyCell wd,数据单元,“雇主”,1
下一个
以
wd.ActiveDocument.Close True'