Передача строки из Excel в Word - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь передать строку из пользовательской формы Excel с помощью VBA в документ Word.В документе Word я создал переменную field> doc и назвал ее bookingRef.Код выглядит следующим образом:

Dim objWord As New Word.Application
Dim doc As Word.Document
Dim bkmk As Word.Bookmark


Set doc = objWord.Documents.Open("test.docx")

objWord.ActiveDocument.variables("bookingRef").Value = Me.txtRef.Text


objWord.ActiveDocument.Fields.Update

objWord.Documents.Save

В нем нет ошибок, однако, когда я открываю документ, я должен щелкнуть правой кнопкой мыши и обновить поле (я думал, objWord.ActiveDocument.Fields.Update сделал это?).Кроме того, он продолжает блокировать документ, чтобы его нельзя было открыть снова.Есть ли способ разблокировки после сохранения?

1 Ответ

1 голос
/ 10 мая 2019

Документ заблокирован, потому что вы не закрыли его с помощью метода Document.Close , поэтому документ все еще открыт и поэтому не может быть открыт снова.Также избегайте использования ActiveDocument открытого документа, установленного на doc

Set doc = objWord.Documents.Open("test.docx")

, и поэтому на него можно ссылаться с помощью doc.

Dim objWord As New Word.Application
Dim doc As Word.Document
'Dim bkmk As Word.Bookmark

Set doc = objWord.Documents.Open("test.docx")

doc.variables("bookingRef").Value = Me.txtRef.Text
doc.Fields.Update
doc.Save
doc.Close

Также не забудьтевыйдите из приложения Word после того, как закончите.

objWord.Quit

В противном случае экземпляр Word будет открыт до тех пор, пока вы не выключите компьютер.


Метод Fields.Update должен обновить поля, ноэто может быть неудачно из-за ошибки.Проверьте его на наличие ошибок:

If doc.Fields.Update = 0 Then 
    MsgBox "Update Successful" 
Else 
    MsgBox "Field " & doc.Fields.Update & " has an error" 
End If

Что я сделал (тест в соответствии с комментариями под этим ответом):

(следующие шаги в соответствии с Как хранить иизвлечение переменных в документах Word )

  1. Создание файла C:\Temp\test.docx

    Чтобы использовать поле DocVariable, выполните следующие действия:В меню Insert нажмите Field.

    enter image description here

    • В поле Категории выберите Document Automation.
    • В списке Field names выберите DocVariable.
    • . В поле New Name в поле Field properties введите имя переменной документа bookingRef.
    • .Нажмите кнопку ОК.

      Обратите внимание, что в документе вы еще ничего не увидите, но это нормально, поскольку переменная bookingRef еще не существует.

    • Сохраните файл и закройте Word.

  2. Запустите следующий код в Excel

    Option Explicit
    
    Public Sub Test()
        Dim objWord As New Word.Application
    
        On Error GoTo CLOSE_WORD_APP 'error handling to ensure there will not be any orphaned and invisible Word application left
    
        Dim doc As Word.Document
        Set doc = objWord.Documents.Open("C:\Temp\test.docx")
    
        doc.Variables("bookingRef").Value = "This is the updated Value: " & Time
        doc.Fields.Update
        doc.Save
        doc.Close
    
    CLOSE_WORD_APP:
        objWord.Quit SaveChanges:=False
    
        If Err.Number <> 0 Then
            Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
        End If
    End Sub
    
  3. Откройте документ Word C:\Temp\test.docx и увидите, что все обновлено:

    enter image description here

...