Excel VBA - перекрестная ссылка закладки / поля формы на Word

У меня очень минимальные знания о VBA, но я все еще учусь.

Я использовал закладки в слове, чтобы заполнять данные из Excel. Однако из-за того, что некоторые данные должны повторяться в документе, я попытался использовать поле / закладку текстовой формы и поле REF для дублирования одних и тех же данных.

Проблема возникла, когда после того, как я ввел данные в слово, поле / закладка текстовой формы исчезло, что привело к тому, что поле REF не смогло отслеживать данные, на которые была сделана ссылка, следовательно, «Ошибка! Источник ссылки не найден».

В заключение, я пытаюсь заполнить данные из Excel в заблокированный текстовый документ и в то же время сохранить форму / закладку текстового поля, чтобы поле 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

person ChingLu Tay    schedule 11.08.2017    source источник
comment
Почему бы вам не использовать Mailmerge, используя данные Excel в качестве серверной части?   -  person Sixthsense    schedule 11.08.2017
comment
У нас есть много типов документов и информации для генерации, плюс у нас есть проблемы с пользователем, поэтому слияние почты в моем случае не подходит.   -  person ChingLu Tay    schedule 11.08.2017


Ответы (1)


Вы были почти у цели. Очень близко, но вы не разобрали объект 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 диапазона.

person Variatus    schedule 11.08.2017
comment
Спасибо, Вариатус за ответ! Наконец-то это работает! Спасибо!! - person ChingLu Tay; 14.08.2017
comment
Извините, вариатус, последняя проблема. Я попытался скопировать тот же код Mark = pr1 Txt = ws.range (C28) .Value и вставить ниже его для разных данных закладок и другого диапазона, но получился только последний вставленный код. Например, первый - pr1, второй - pr2, но вышли только данные pr2. - person ChingLu Tay; 14.08.2017
comment
Привет, Вариатус, мне удалось решить эту проблему самостоятельно. В любом случае, еще раз спасибо за вашу помощь! ценить это! - person ChingLu Tay; 14.08.2017