Excel VBA - 交叉引用书签/表单字段到Word

时间:2017-08-11 04:11:36

标签: excel-vba word-vba form-fields vba excel

我对VBA知之甚少,但仍在学习。

我一直在使用单词中的书签来填充excel中的数据。但是,由于某些数据需要在文档中重复的内容,我尝试使用Text Form Field / Bookmark和REF Field来复制相同的数据。

当我将数据填充到单词时,问题出现了,文本表单字段/书签消失,导致REF字段无法跟踪引用的数据,因此,"错误!未找到参考源。"

总之,我尝试做的是将数据从excel填充到锁定的word文档,同时保留Text Field Form / Bookmark以便让REF字段跟踪和复制数据

在将数据填充到单词后,有没有办法保留文本字段表单/书签占位符?这是我在excel VBA中无法解决的代码。

提前感谢您的帮助!

Private Sub CommandButton1_Click()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
objWord.Documents.Open "C:\Users\" & Environ("username") & "\Desktop\XXX\XXX"
objWord.ActiveDocument.Unprotect Password:="xxx"
With objWord.ActiveDocument

Dim objBMRange As Range
Set objBMRange = .Bookmarks("pr1").Range.Text = ws.Range("C28").Value
objBMRange.Text = pr1
.Bookmarks.Add "pr1", BMRange
.Fields.Update

objWord.ActiveDocument.Protect Password:="xxx", NoReset:=False, Type:=wdAllowOnlyFormFields
End With

Set objWord = Nothing
End Sub

1 个答案:

答案 0 :(得分:0)

你快到了。非常接近,但你没有得到Range对象的整理。请尝试此代码(仅部分测试)。

Private Sub CommandButton1_Click()

    Dim Ws As Worksheet
    Dim objWord As Object
    Dim Mark As String
    Dim Txt As String
    Dim BmkStart As Long

    Mark = "pr1"
    Set Ws = ThisWorkbook.Sheets("Sheet1")
    Txt = Ws.Range("C28").Value

    Set objWord = CreateObject("Word.Application")
    With objWord
        .Visible = True
        .Documents.Open "C:\Users\" & Environ("username") & "\Desktop\XXX\XXX"
        With .ActiveDocument
            .Unprotect Password:="xxx"

            If .Bookmarks.Exists(Mark) Then
                With .Bookmarks(Mark).Range
                    BmkStart = .Start
                    .Text = Txt
                End With
                .Bookmarks.Add Mark, .Range(BmkStart, BmkStart + Len(Txt))
            End If
            .Fields.Update
            .Protect Password:="xxx", NoReset:=False, Type:=wdAllowOnlyFormFields
        End With
    End With

    Set objWord = Nothing
End Sub

有一点是Bookmark定义了Word.Range(与Excel.Range不同,当你在Excel中指定时没有指定应用程序时会得到Bookmark。另一方面,Word.Range定义范围但不是范围本身,甚至不是Text。因此,您可以通过修改其范围User.js属性来获取或设置其文本。