Word Fill VBA в MS Access для различных полей в таблице

Что касается нашей части базы данных по управлению инцидентами, я пытаюсь создать данные из полей в моей таблице (таблицах) в 149 Investigative Report, шаблоне документа Word, предоставленном государством (см. ссылку здесь).

Я сделал версию документа только для чтения, чтобы сохранить ее целостность, принудительно сохранив как пользователь и загрузив ее с полями текстовой формы с закладками для ссылки (пример: txtcaseintroduction).

Я изменил код, который нашел в Интернете для работы с полями формы, и назначил его кнопке в одной из моих форм, чтобы помочь в создании отчета (ссылка Open изменена по соображениям безопасности):

Private Sub cmdPrint_Click()

'Export 149 Report.

Dim appWord As Word.Application

Dim doc As Word.Document

'Avoid error 429, when Word isn't open.

On Error Resume Next

Err.Clear

'Set appWord object variable to running instance of Word.

Set appWord = GetObject(, "Word.Application")

If Err.Number <> 0 Then

'If Word isn't open, create a new instance of Word.

Set appWord = New Word.Application

End If

Set doc = appWord.Documents.Add("Y:\ABC\2018\Case Files\2018 - Incident Forms\OPWDD 149 - Access Database Reference.docx", , True)

With doc
    .FormFields("txtNIMRS").Result = Me.NIMRSID
    .FormFields("txtInternalID").Result = Me.InternalIncidentID
    .FormFields("txtIncidentDate").Result = Me.[IncidentOccurrenceDate]
    .FormFields("txtDiscoverydate").Result = Me.[IncidentReportDate]
    .FormFields("txtCaseIntroduction").Result = Me.CaseIntroduction
    .FormFields("txtIncidentLocation").Result = Me.Location
    .FormFields("txtBackground").Result = Me.BackgroundInfo
    .FormFields("txtProtections").Result = Me.ImmedProtec
    .FormFields("txtQuestion").Result = Me.InvestQuestion
    .FormFields("txtTestName").Result = Me.[TestimonialEvidence]
    .FormFields("txtDocumentaryE").Result = Me.[DocumentaryEvidence]
    .FormFields("txtDemonstrativeE").Result = Me.[DemonstrativeEvidence]
    .FormFields("txtPhysicalE").Result = Me.[PhysicalEvidence]
    .FormFields("txtWSName").Result = Me.[WrittenStatements]
    .FormFields("txtSummary").Result = Me.SummaryEvidence
    .FormFields("txtConclusions").Result = Me.Text409
    .FormFields("txtRecommendations").Result = Me.Text411
    .FormFields("txtInvestigator").Result = Me.Investigator_s__Assigned
    .FormFields("txtdatereport").Result = Me.Investigative_Report_Completion_Date
.Visible = True

.Activate

End With

Set doc = Nothing

Set appWord = Nothing

Exit Sub

errHandler:

MsgBox Err.Number & ": " & Err.Description

End Sub

Работают следующие поля:

 .FormFields("txtNIMRS").Result = Me.NIMRSID
        .FormFields("txtInternalID").Result = Me.InternalIncidentID
        .FormFields("txtIncidentDate").Result = Me.[IncidentOccurrenceDate]
        .FormFields("txtDiscoverydate").Result = Me.[IncidentReportDate]
.FormFields("txtIncidentLocation").Result = Me.Location
        .FormFields("txtBackground").Result = Me.BackgroundInfo
        .FormFields("txtProtections").Result = Me.ImmedProtec
        .FormFields("txtQuestion").Result = Me.InvestQuestion
 .FormFields("txtConclusions").Result = Me.Text409
        .FormFields("txtRecommendations").Result = Me.Text411
.FormFields("txtdatereport").Result = Me.Investigative_Report_Completion_Date

Остальные поля (case introduction, investigator и поля вложения) нет. Все эти поля находятся в одной таблице. Также отмечается, что введение кейса раньше работало, но перестало работать, так как я пытался выяснить больше полей формы, которые можно было бы применить к документу и справке. Цель заключалась в том, чтобы следователь, по сути, выполнял всю свою работу в базе данных, а затем экспортировал ее в требуемый формат для представления государству.

Мой вопрос: что мне нужно сделать с приведенным выше кодом, чтобы неработающие поля работали при заполнении документа Word?

Ответы на вопросы в комментариях

  • Ошибок не возникает; текстовые поля просто не заполняются, когда я нажимаю кнопку.

  • Поля формы не обязательно должны присутствовать в итоговом документе. Они просто «цели» для данных.


person Chris F    schedule 07.01.2020    source источник
comment
Во-первых, этот документ следует использовать как шаблон, а не как документ, предназначенный только для чтения. Использовать appWord.Documents.Add("PathToOriginalFile") - это создает копию оригинала как новый документ, поэтому нет никаких шансов на его изменение.   -  person Cindy Meister    schedule 07.01.2020
comment
Правильно - на вопрос в конце вашего комментария. Причина, по которой вы не видите никаких ошибок, заключается в том, что уведомления об ошибках отключены On Error Resume Next. Поместите On Error GoTo 0 после строки с GetObject, затем проверьте еще раз.   -  person Cindy Meister    schedule 08.01.2020
comment
Поэтому я сохранил документ как файл .doctm, чтобы позволить шаблону включать макросы, и изменил источник файла в VBA, чтобы отразить это изменение, но Access по-прежнему не смог его найти. Я вернул его в версию .docx только для чтения, и он смог найти файл. Не уверен, что там происходит, что он не найдет новый файл. Я также внес изменения, которые вы рекомендовали в своем последнем комментарии относительно ошибок; без подавления кода ошибки VBA вернул, что строка CaseIntroduction слишком длинная. Следует ли сокращать имя закладки текстового поля поля формы?   -  person Chris F    schedule 08.01.2020
comment
Не существует такой вещи, как формат файла .doctm ... Но в любом случае нет необходимости изменять тип или расширение файла: просто используйте Add, а не Openметод.   -  person Cindy Meister    schedule 08.01.2020
comment
Существует ограничение на количество символов, которые можно использовать в качестве имени закладки, хотя я ожидал, что приложение Word не приняло бы его, если бы это было проблемой. Скорее всего, это объем данных, который код пытается записать в поле формы. Если вы протестируете сокращением, это сработает?   -  person Cindy Meister    schedule 08.01.2020
comment
.dotm * мои извинения. Тем не менее, я внес рекомендованное вами изменение. Когда я сократил количество символов в поле, его можно было передать без проблем. Вчера я провел небольшое исследование и увидел, что если количество символов, которые пытается передать код, превышает 255 символов, передача не произойдет. Есть ли способ обойти это ограничение?   -  person Chris F    schedule 08.01.2020
comment
Word имеет встроенное ограничение в 255 символов. (Слово в технологическом плане очень старое - уже 30 лет!) Вопрос: Вам нужно повторно использовать поля формы или они могут исчезнуть при записи данных?   -  person Cindy Meister    schedule 15.01.2020
comment
Еще раз привет @Cindy Meister (не думаю, что я сделал это правильно, смеется); поля формы могут исчезнуть при записи данных. Как только информация передана, теоретически должен быть составлен отчет. Любые необходимые правки должны были быть внесены в форму, в которой следователь пишет отчет о расследовании, а затем переданы в Word после заполнения. Я разработал кнопку проверки орфографии в форме, чтобы помочь следователям в этом, чтобы они знали, что делать до создания отчета Word. Правильно ли я понял ваш вопрос?   -  person Chris F    schedule 21.01.2020
comment
Если я вас правильно понимаю, то да, вы меня правильно поняли :-) В этом случае вам не нужно будет использовать поля формы, хотя они представляют собой удобную цель. Закладки или ContentControls тоже подойдут. Действительно, имя поля формы является закладкой. Поскольку в отчетах уже есть поля формы, я предлагаю на этом этапе обратить внимание не на 1) использование защиты форм; 2) не нацеливайте FormField.Result, только закладку Range, которая должна по существу удалить поле формы.   -  person Cindy Meister    schedule 21.01.2020
comment
Проверьте мои правки - сделано, чтобы сделать их более понятными / полезными для будущих посетителей, у которых может быть такая же проблема, - чтобы убедиться, что я не сделал непреднамеренной ошибки. Кроме того, если у вас есть время, не могли бы вы отредактировать версию вашего кода, в которой используется Documents.Add, пожалуйста? Это сделано для того, чтобы другие, кто может скопировать этот код, подобрали лучший подход для принуждения пользователей к работе с копией документа. (И, пожалуйста, не включайте мой ответ - Stack Overflow так не работает.) После этого комментарии можно будет еще больше прорезать, улучшая полезность вклада :-)   -  person Cindy Meister    schedule 23.01.2020
comment
Большое вам спасибо, Синди; Я внес изменения и переключил код на Documents.Add, как рекомендовано.   -  person Chris F    schedule 23.01.2020


Ответы (1)


Поскольку поля формы не нужно сохранять в итоговом документе, самым простым подходом было бы просто вставить данные в FormField.Range, который заменит (удалит) поле формы. Таким образом можно написать весь код, если согласованность важна (как конечный результат выглядит для пользователя), но с точки зрения программирования это не обязательно.

Примечание. Если защита форм активирована, ее необходимо отключить, чтобы этот подход работал.

If doc.ProtectionType <> -1 Then doc.Unprotect  '-1 = wdNoProtection

Пример строки кода для строки длиной более 255 символов

.FormFields("txtCaseIntroduction").Range = Me.CaseIntroduction
person Cindy Meister    schedule 23.01.2020
comment
Это было решение! Большое спасибо! - person Chris F; 23.01.2020