Как мне записать данные поля Microsoft Word Content Control в текстовый файл с помощью VBA?

У меня, казалось бы, тривиальная задача VBA. Однако я обычно не использую VBA и почти никогда в контексте Microsoft Word. У меня есть форма Word, в которой используются поля Content Control (а также несколько переключателей ActiveX), и мне нужно протестировать ее, распечатав отметку времени и заполненные записи формы в файл с разделителями-запятыми. Когда я запускаю следующий код:

Sub WriteToText()
Dim DataFile As String
Dim StrData As String
Dim CCtrl As ContentControl
Dim bControl_Exists As Boolean

DataFile = "C:\Users\Annabanana\Documents\Data.txt"
StrData = "": Open DataFile For Append As #1
StrData = Format(Now, "DD-MMM-YYYY hh:mm:ss")

With Application.ActiveDocument
    bControl_Exists = .Saved
    For Each CCtrl In ThisDocument.ContentControls
        With CCtrl
            Select Case .Type
                Case Is = wdContentControlCheckBox
                    StrData = StrData & "," & .Checked
                Case wdContentControlDate, wdContentControlDropdownList, wdContentControlComboBox, wdContentControlText
                    StrData = StrData & "," & .Range.Text
                Case Else
            End Select
        End With
    Next
End With
Print #1, StrData: Close #1
End Sub

Я получаю дату, но ничего больше. В идеале я хотел бы в конечном итоге распечатать теги полей и их соответствующие значения как таковые:

Tag1 Value1 Tag2 Value2 Tag3 Value3 .............

В конце концов, все они будут напечатаны в базе данных, но на данный момент я просто хочу увидеть, как данные выходят из формы и как мне нужно преобразовать их перед загрузкой. Любые советы высоко ценится. Спасибо.


person Annabanana    schedule 20.05.2020    source источник


Ответы (1)


По сути, ваша проблема сводится к неправильному использованию ThisDocument. Пытаться:

Sub GetCCtrlData()
Dim CCtrl As ContentControl, StrData As String, DataFile As String
StrData = Format(Now, "DD-MMM-YYYY hh:mm:ss")
DataFile = "C:\Users\" & Environ("UserName") & "\Documents\Data.txt"
For Each CCtrl In ActiveDocument.ContentControls
  With CCtrl
    StrData = StrData & vbTab & .Title & "|" & .Tag & ": "
    Select Case .Type
      Case Is = wdContentControlCheckBox
        StrData = StrData & .Checked
      Case wdContentControlDate, wdContentControlDropdownList, wdContentControlRichText, wdContentControlText
        StrData = StrData & .Range.Text
      Case Else
    End Select
  End With
Next
Open DataFile For Append As #1: Print #1, StrData: Close #1
End Sub

Приведенный выше код также экспортирует заголовки и теги элементов управления содержимым, используя разделители табуляции вместо запятых. Использование разделителей табуляции допускает возможность использования запятых в данных.

Я полагаю, что на каком-то этапе вы захотите обработать несколько документов. Для этого см .: http://www.vbaexpress.com/forum/showthread.php?40406-Extracting-Word-form-Data-and-exporting-to-Excel-spreadsheet&p=257696&viewfull=1#post257696. Хотя код извлекает данные в книгу Excel, основные принципы остаются теми же.

person macropod    schedule 20.05.2020
comment
Спасибо @macropod. Завтра тестирую. Судя по вашей репутации, я уверен, что это сработает. Фактически, он будет использоваться не для пакетной загрузки данных, а для кнопки отправки, встроенной в саму форму Word и запускаемой пользователем. - person Annabanana; 21.05.2020
comment
«Для кнопки отправки, встроенной в форму Word и запускаемой пользователем» Будьте осторожны с этим. Все, что связано с документом, потребует мер защиты от многократного вывода данных одного и того же документа или метода, обеспечивающего удаление предыдущих данных. - person macropod; 21.05.2020
comment
Да, у меня уже есть сценарий, который я включаю, который проверяет, существует ли уже уникальный идентификатор в базе данных. Спасибо, @macropod. - person Annabanana; 21.05.2020
comment
Это прекрасно сработало. Спасибо @macropod. Мне просто нужно добавить петлю для переключателей. - person Annabanana; 21.05.2020