Спасибо, что посмотрели на это.

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

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

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

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
-1
Sapster77 15 Фев 2020 в 16:03

2 ответа

Лучший ответ

Кажется, это то, что вы хотите:

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
1
Unhandled Exception 17 Фев 2020 в 08:33

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

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

Тогда ваш код станет проще и удобнее в обслуживании.
И если поле таблицы (например, 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
0
Andre 16 Фев 2020 в 23:43