Как заполнить несколько закладок / полей формы в Word из одного поля в Access, используя VBA - PullRequest
0 голосов
/ 13 февраля 2019

Ранее я использовал некоторые VBA для передачи полей из Access в документ Word, пока не столкнулся с пределом в 255 символов.Помощь с этого сайта заставила меня теперь использовать закладки вместо полей формы.

Я изначально заполнял много разных полей в Word, а в некоторых случаях использовал одни и те же данные из Access в двух местах.на документе Word.Я достиг этого, позвонив по номеру:

.FormFields("txtReasonforReward").Result = Me![Reason for Reward]
.FormFields("txtReasonforReward2").Result = Me![Reason for Reward]

Поскольку теперь у меня есть другой способ заполнения поля «Причина вознаграждения», чтобы обойти ограничение на количество символов (код ниже), я не уверен, какзаполните "txtReasonforReward2".У меня есть несколько случаев, когда я добавлял второе поле и вставлял 2 в конце ... Я не уверен, что это лучший способ, поэтому, если кто-то может посоветовать, как этого добиться с помощью полей FormFields и Bookmarks, яБуду очень благодарен.

Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set doc = objWord.Documents.Open(***path to file***, , True)

Dim rng As Word.Range
Dim x As String

With doc
.FormFields("txtFirstName").Result = Me![First Name]
.FormFields("txtLastName").Result = Me![Last Name]
`examples cut for clarity...
.FormFields("txtHRID").Result = Me![ID]
.FormFields("txtPeriod").Result = Me![Period]

If doc.ProtectionType <> wdNoProtection Then
   doc.Unprotect
End If

Set rng = doc.Bookmarks("txtReasonforReward").Range
rng.MoveStart wdCharacter, -1
x = rng.Characters.First
rng.FormFields(1).Delete
rng.Text = x & Me![Reason for Reward]
doc.Protect wdAllowOnlyFormFields, True

.Visible = True
.Activate

End With

objWord.View.ReadingLayout = True

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Есть и другие способы сделать это.Посмотрите на подход ниже и посмотрите, сможете ли вы заставить его работать.

Option Compare Database
' This concept uses Docvariables in MS Word
Sub PushToWord()

Dim wapp As Word.Application
Dim wdoc As Word.Document
Dim db As DAO.Database
Dim fld As DAO.Field
Dim rs As DAO.Recordset
Dim filenm As String
Dim NumFields As Integer
Dim i As Integer

Set db = CurrentDb
Set rs = db.OpenRecordset("tbl_CustomerData")

Set wapp = New Word.Application
wapp.Visible = True


Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM tbl_CustomerData")

If rs.RecordCount > 0 Then
  rs.MoveFirst

  Do While Not rs.EOF
     For i = 0 To rs.Fields.Count - 1
        Set fld = rs.Fields(i)
        Debug.Print fld.Name, fld.Value
            If fld.Value = 20 Then
                filenm = "C:\Users\Ryan\Desktop\Coding\Integrating Access and Word\From Access to Word\Letter1.doc"
                    Set wdoc = wapp.Documents.Open(filenm)
                wapp.ActiveDocument.Variables("Name").Value = rs.Fields("Name").Value
            End If
     Next
     rs.MoveNext
  Loop
  Set fld = Nothing
  rs.Close
End If
Set rs = Nothing

End Sub

Код запускается из Access, и вы можете запустить его любым количеством способов (событие нажатия кнопки, событие загрузки формы, некоторое другое событие объекта и т. Д.)

0 голосов
/ 13 февраля 2019

Опираясь на код в вопросе и фоновый вопрос ...

Word может дублировать содержимое закладки, используя REF коды полей.Поскольку поля формы также используют идентификаторы закладок, это будет работать как с существующими полями формы, так и с содержимым, добавленным в закладки.Поля REF могут быть вставлены напрямую, если человек знаком с этим ИЛИ, вставив перекрестную ссылку на закладку.

Обращаясь к обходному пути для вставки более 255 символов, в этом случае это будетТакже необходимо разместить закладку вокруг вставляемого диапазона и обновить поля REF, чтобы они отражали содержимое закладки по всему документу.Модифицированный раздел кода приведен ниже.

'Declarations to be added at the beginning of the procedure
Dim fld As Word.Field
Dim bkmName As String

'Name of form field, bookmark to be added and text in REF field code
bkmName = "txtReasonforReward"     

'Existing code
If doc.ProtectionType <> wdNoProtection Then
   doc.Unprotect
End If
Set rng = doc.Bookmarks(bkmName).Range
rng.MoveStart wdCharacter, -1
x = rng.Characters.First
rng.FormFields(1).Delete
rng.Text = x & Me![Reason for Reward]

' New code
'Leave that single character out of the range for the bookmark
rng.MoveStart wdCharacter, 1
'Bookmark the inserted content
doc.Bookmarks.Add bkmName, rng
'Update fields so that REF's pick up the bookmark content
For Each fld In doc.Fields
    If fld.Type = wdFieldRef Then
        fld.Update
    End If
Next

doc.Protect wdAllowOnlyFormFields, True

Этот подход будет немного громоздким, если его необходимо применить ко многим полям.Возможно, имеет смысл сделать что-то вроде записи имен закладок в свойство Tag элементов управления в форме доступа, а затем зациклить элементы управления, чтобы выбрать имя закладки и данные из элемента управления, вместо того, чтобы записывать каждое из них явно - но этопросто мысль о будущем.

Все, что говорится, «современный» способ достичь этого - работать с элементами управления контентом, а не с полями / закладками формы.Элементы управления содержимым не имеют ограничения в 255 символов, документ может быть защищен как форма, несколько элементов управления содержимым могут иметь одинаковые заголовок (имя) и / или тег.Кроме того, элементы управления контентом могут быть «сопоставлены» с пользовательской XML-частью, хранящейся в документе, так что изменение содержимого одного из них приведет к изменению содержимого другого.Здесь я пытаюсь описать все, что выходит за рамки того, что должно быть в «ответе», но все это общедоступно при поиске в Интернете.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...