Access VBA - Проблемы с циклом прохождения полей в Access последней записи и экспортом в закладки Word? - PullRequest
0 голосов
/ 15 февраля 2020

Спасибо за просмотр.

У меня есть набор записей с 60 полями, и я хочу экспортировать запись last для каждого поля в файл Microsoft Word с 60 закладками под названием g1 to g60.

Конечно, я хотел бы пройти через них oop, но не могу заставить его работать.

По сути, я хочу вот что:

Dim wApp As Word.Application
Dim wDoc As Word.Document
Dim wDoct As Word.Document
Dim rs As DAO.Recordset
Dim rng As Word.Range
Dim intI As Integer
Dim fld As DAO.field

Set wApp = New Word.Application
Set wDoc = wApp.Documents.Open("C:\Users\Peter\Documents\testdoc.docm", ReadOnly:=False)
Set wDoct = wApp.Documents.Open("C:\Users\Peter\Documents\Trends.docx")
Set rs = CurrentDb.OpenRecordset("Overall")

Set rs = CurrentDb.OpenRecordset("Grades")

If Not rs.EOF Then rs.MoveLast

wDoc.Bookmarks("g1").Range.Text = Nz(rs!PlanQ, "")
wDoc.Bookmarks("g2").Range.Text = Nz(rs!PlanQMin, "")
wDoc.Bookmarks("g3").Range.Text = Nz(rs!PlanUnsat, "")
wDoc.Bookmarks("g4").Range.Text = Nz(rs!BriefQ, "")
wDoc.Bookmarks("g5").Range.Text = Nz(rs!BriefQmin, "")
wDoc.Bookmarks("g6").Range.Text = Nz(rs!BriefUnsat, "")
' and so on up to 60
wDoct.Save
wApp.Quit

Это работает, но, конечно, должно быть зациклено - я пробовал это, но оно выдает ошибку:

Dim wApp As Word.Application
Dim wDoc As Word.Document
Dim wDoct As Word.Document
Dim rs As DAO.Recordset
Dim rng As Word.Range
Dim intI As Integer
Dim fld As DAO.field

Set wApp = New Word.Application
Set wDoc = wApp.Documents.Open("C:\Users\Peter\Documents\testdoc.docm", ReadOnly:=False)
Set wDoct = wApp.Documents.Open("C:\Users\Peter\Documents\Trends.docx")
Set rs = CurrentDb.OpenRecordset("Overall")

Set rs = CurrentDb.OpenRecordset("Grades")

If Not rs.EOF Then rs.MoveLast

intI = 1

With rs
Do Until .EOF
For Each fld in rs.Fields
wDoc.Bookmarks("g" & "intI").Range.Text = Nz(rs!fld.Name, "")

Next fld
intI = intI + 1
loop
End With

wDoct.save
Wapp.quit

Любые идеи будут очень приветствоваться, в противном случае у меня впереди много печатания , :-)

Спасибо за ваше время!

Питер

Это текущий код, который не работает, как указано ниже: ОБНОВЛЕНИЕ Это точное копировать вставить.

Public Sub Looptest()

Dim wApp As Word.Application
Dim wDoc As Word.Document
Dim rs As DAO.Recordset
Dim index As Integer
Dim item As Variant

Set wApp = New Word.Application
Set wDoc = wApp.Documents.Open("C:\Users\Peter\Documents\testdoc.docm", ReadOnly:=False)

Set rs = CurrentDb.OpenRecordset("Grades")

If Not rs.EOF Then rs.MoveLast

For Each item In rs.Fields
    index = index + 1

    Dim bookmarkName As String
    bookmarkName = "g" & index

    Dim bookmarkValue As Variant
    bookmarkValue = Nz(rs(item.Name).Value, "")

    Debug.Print "Try set bookmark '" & bookmarkName & "' to '" & bookmarkValue & "' now."

    Dim bookmarkRange As Word.Range
    Set bookmarkRange = wDoc.Bookmarks(bookmarkName).Range

    bookmarkRange.Text = bookmarkValue

    Set bookmarkRange = Nothing
    Next item

wApp.DisplayAlerts = False
wDoc.SaveAs2 "C:\Users\Peter\Documents\" & rs!ID & "_gradesheet.docm"
wDoc.Close
wApp.Quit

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Похоже, это то, что вы хотите:

Dim index As Integer
Dim item As Variant

For Each item In rs.Fields
    index = index + 1
    wDoc.Bookmarks("g" & index).Range.Text = Nz(rs(item.Name).Value, "")
Next item

Итерирует поля набора записей и заполняет закладки, как вы, кажется, хотите.

Какую именно ошибку вы получили ?

Вы должны также проверить свой код еще раз, в нем есть несколько лишних фрагментов.

Обновление:

Вы получаете эту ошибку, как я понимаю:

5941: Запрашиваемый элемент коллекции не существует.

Попробуйте вместо этого. Он разделяет функциональность на отдельные этапы, позволяя определить причину:

  • Создает новое имя закладки
  • Получает значение для установки в закладки
  • Распечатывает, какая закладка теперь будет установлена, какое значение
  • Получает ссылку на закладку, которую необходимо установить
  • Она устанавливает значение закладки

Теперь вы сможете выяснить причину ошибки, увидев, какая строка кода разрывается и каковы значения переменных.

    Dim index As Integer
    Dim item As Variant

    For Each item In rs.Fields
        If item.Name <> "ID" Then
            index = index + 1

            If index = 127 Then Exit For

            Dim bookmarkName As String
            bookmarkName = "g" & index

            Dim bookmarkValue As Variant
            bookmarkValue = Nz(rs(item.Name).Value, "")

            Debug.Print "Try set bookmark '" & bookmarkName & "' to '" & bookmarkValue & "' now."

            Dim bookmarkRange As Word.Range
            Set bookmarkRange = wDoc.Bookmarks(bookmarkName).Range

            bookmarkRange.Text = bookmarkValue

            Set bookmarkRange = Nothing
        End If
    Next item
0 голосов
/ 17 февраля 2020

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

Гораздо проще назвать закладки, совпадающие с именами соответствующих полей таблицы, то есть PlanQ et c.

Тогда ваш код станет проще и удобнее в обслуживании.
И если табличное поле (например, ID) не существует в виде закладки в документе, вы можете просто проигнорировать его.

For Each fld In rs.Fields

    Dim bookmarkName As String
    bookmarkName = fld.Name

    Dim bookmarkValue As String  ' since you are using Nz(), you don't need Variant
    bookmarkValue = Nz(fld.Value, "")

    If wDoc.Bookmarks.Exists(bookmarkName) Then
        wDoc.Bookmarks(bookmarkName).Range.Text = bookmarkValue
    Else
        Debug.Print "Ignored table field <" & bookmarkName & "> - no matching bookmark found in word document."
    End If

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