[英]Access VBA - Problems looping through fields in Access last record and exporting to Word bookmarks?
謝謝你看這個。
我有一個包含 60 個字段的記錄集,我想將每個字段的最后一條記錄導出到帶有 60 個名為g1
到g60
書簽的 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.