我使用以下代码循环遍历记录集,该记录集假设以表格格式将所有选定记录传输到Word文档。它工作但它给了我除最后一个以外的所有记录(即我选择了4个记录,它从顶部只返回3个。)
Private Sub cmdWord_Click()
Dim oWord As Object 'Word.Application
Dim doc As Object 'Word.Document
Set oWord = CreateObject("Word.Application")
Set doc = oWord.Documents.Open("D:\Working\Templates\Letter.doc")
oWord.Visible = True
Dim oAccess As Object
Dim dbs As Database
Dim rst As Recordset
Dim strCriteria As String
With oWord.ActiveDocument
If .Bookmarks.Exists("Date") = True Then
.Bookmarks("Date").Select
If Not IsNull([Forms]![frmForReport_Preview]!Date) Then
oWord.Selection.Text = (CStr(Format([Forms]![frmForReport_Preview]!Date, "mmm d, yyyy")))
Else
oWord.Selection.Text = ""
End If
End If
If .Bookmarks.Exists("Table") = True Then
Set dbs = CurrentDb
strCriteria = "SELECT tblForLetter.ID, tblForLetter.DID, tblForLetter.AT, tblForLetter.Expr1, tblForLetter.L FROM tblForLetter WHERE (((tblForLetter.Print)=-1=True));"
Set rst = dbs.OpenRecordset(strCriteria, dbOpenSnapshot)
oWord.ActiveDocument.Bookmarks("Table").Select
oWord.Selection.Text = ""
i = 1
If Not (rst.EOF And rst.BOF) Then
rst.MoveFirst
Do Until rst.EOF = True
doc.Tables(1).Columns(1).Cells.Add
doc.Tables(1).Columns(1).Cells(i + 1).range.Text = rst.Fields(0)
doc.Tables(1).Columns(2).Cells(i + 1).range.Text = rst.Fields(1)
doc.Tables(1).Columns(3).Cells(i + 1).range.Text = rst.Fields(2)
doc.Tables(1).Columns(4).Cells(i + 1).range.Text = rst.Fields(3)
doc.Tables(1).Columns(5).Cells(i + 1).range.Text = rst.Fields(4)
rst.MoveNext
i = i + 1
Loop
Else
MsgBox ("There are no records in the recordset.")
End If
DoCmd.Close acForm, "frmForReport_Preview", acSaveYes
DoCmd.SetWarnings False
DoCmd.RunSQL "Delete * From [tblForLetter]"
DoCmd.SetWarnings True
rst.Close
Set dbs = Nothing
End If
End With
End Sub
答案 0 :(得分:1)
您究竟如何选择表单中的记录?
我怀疑这个:
tblForLetter
或SELECT * FROM tblForLetter
或类似的内容Print
列为控制源。Print
列将设置为True
/ -1
。如果你这样做,你应该考虑以下几点:
因此,当您选择多个复选框时,实际发生的是:
现在还有一个额外的问题:
当一行处于编辑模式,并且您单击表单的页眉或页脚中的控件(换句话说,不在“详细信息”区域中,表单的实际连续部分), 该行保持编辑模式且更改尚未保存到数据库。
cmdWord
按钮,触发问题中的代码,但在那一刻,第四行仍然处于编辑模式。... WHERE tblForLetter.Print=True
进行过滤时,您只会获得前三个选定的行,但不会获得第四个,因为在那一刻,tblForLetter.Print
仍然是False
数据库中。一般来说,当您运行从表中获取所选行的查询时,您需要确保没有行仍处于编辑模式。
在不更改代码的情况下,您可以在选择四行时看到差异,将焦点设置为另一行,以便第四行也保存,然后然后点击按钮。
要在代码中自动执行此操作,您只需在从表格中选择之前调用Me.Requery
即可重新查询表单的数据源。
Me.Requery
将重新加载表单中的数据。如果此时编辑模式中仍有一行,则编辑模式将首先结束,该行中的更改将保存到数据库中。