簡體   English   中英

Access VBA - 循環訪問 Access 最后一條記錄中的字段並導出到 Word 書簽時出現問題?

[英]Access VBA - Problems looping through fields in Access last record and exporting to Word bookmarks?

謝謝你看這個。

我有一個包含 60 個字段的記錄集,我想將每個字段的最后一條記錄導出到帶有 60 個名為g1g60書簽的 Microsoft Word 文件中。

當然,我想遍歷這些但無法使其工作。

基本上我想要的是這個:

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

任何想法都會非常受歡迎,否則我前面有很多打字。 :-)

感謝您的時間!

彼得

這是當前失敗的代碼,如下所述: UPDATE這是准確的復制粘貼。

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

這似乎是你想要的:

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

您的代碼僅根據它們的順序嘗試將編號書簽與表字段匹配。 即使你現在讓它工作,這將很難維護,每次更改都會帶來新的麻煩。

將書簽命名為與其匹配的表字段名稱相同的名稱要容易得多, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM