在VBA中循环两个记录集以进行访问
我正在尝试从一个名为“Deprog3”的查询向多个不同的收件人发送电子邮件记录。表单上的按钮需要循环浏览表单中的每条记录,并向收件人发送电子邮件(“Me.email”)。它发送的电子邮件应该从“Deprog3”查询中选择与该特定个人相关的所有记录 但实际情况是,它只在第一封电子邮件中发送特定于第一个人的记录,然后在第二封电子邮件中发送第一个人和第二个人的记录,依此类推,直到最后一封电子邮件包含查询中的所有记录 如果我注释掉第二行('Do While Me.Current Record…')和最后一行的第二行('Loop'),它会去掉循环,意味着我必须继续单击“发送”,但它不会发送前几行的记录 任何指导都将不胜感激在VBA中循环两个记录集以进行访问,vba,loops,email,ms-access,recordset,Vba,Loops,Email,Ms Access,Recordset,我正在尝试从一个名为“Deprog3”的查询向多个不同的收件人发送电子邮件记录。表单上的按钮需要循环浏览表单中的每条记录,并向收件人发送电子邮件(“Me.email”)。它发送的电子邮件应该从“Deprog3”查询中选择与该特定个人相关的所有记录 但实际情况是,它只在第一封电子邮件中发送特定于第一个人的记录,然后在第二封电子邮件中发送第一个人和第二个人的记录,依此类推,直到最后一封电子邮件包含查询中的所有记录 如果我注释掉第二行('Do While Me.Current Record…')和最后
Private Sub Send_Click()
Do While Me.CurrentRecord < Me.Recordset.RecordCount
DoCmd.RunSQL "delete * from sendfiletemp"
DoCmd.OpenQuery "Deprog3"
Dim MyDB As DAO.Database
Dim rst As DAO.Recordset
Set MyDB = CurrentDb
Set rst = MyDB.OpenRecordset("SendFileTemp", dbOpenForwardOnly)
strSMTPFrom = Me.From
strSMTPTo = Me.EMAIL
strBCC = Me.BCC
strSMTPRelay = "mail.vaioni.com"
strSubject = "Jobs requiring your attention"
With rst
Do While Not .EOF
MailBody = MailBody & ![serviceid] & " | " & ![status] & " | " & ![EventDate] & " | " & ![name] & vbCrLf
.MoveNext
Loop
End With
Set oMessage = CreateObject("CDO.Message")
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTPRelay
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
oMessage.Configuration.Fields.Update
oMessage.From = strSMTPFrom
oMessage.To = strSMTPTo
oMessage.bcc = strBCC
oMessage.Subject = strSubject
oMessage.TextBody = "Can you please take a look at these jobs that remain open and close them down. Thanks " & vbCrLf & " " & vbCrLf & MailBody & vbCrLf & " "
oMessage.Send
rst.Close
Set rst = Nothing
Me.Recordset.MoveNext
Loop
End Sub
Private Sub Send_Click()
当Me.CurrentRecord
使用记录集需要表单的第一条记录具有焦点。建议您使用RecordsetClone
在每次迭代结束时,将MailBody设置为空字符串
考虑:
strSMTPRelay = "mail.vaioni.com"'
With Me.RecordsetClone
Do While Not .EOF
Set rst = MyDB.OpenRecordset("SendFileTemp", dbOpenForwardOnly)
With rst
Do While Not .EOF
MailBody = MailBody & ![serviceid] & " | " & ![status] & " | " & ![EventDate] & " | " & ![name] & vbCrLf
.MoveNext
Loop
End With
rst.Close
Set oMessage = CreateObject("CDO.Message")
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTPRelay
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
oMessage.Configuration.Fields.Update
oMessage.From = !From
oMessage.To = !EMAIL
oMessage.bcc = !BCC
oMessage.Subject = "Jobs requiring your attention"
oMessage.TextBody = "Can you please take a look at these jobs that remain open and close them down. Thanks " _
& vbCrLf & " " & vbCrLf & MailBody & vbCrLf & " "
oMessage.Send
MailBody = ""
.MoveNext
Loop
End With
使用记录集要求窗体的第一条记录具有焦点。建议您使用RecordsetClone 在每次迭代结束时,将MailBody设置为空字符串 考虑:
strSMTPRelay = "mail.vaioni.com"'
With Me.RecordsetClone
Do While Not .EOF
Set rst = MyDB.OpenRecordset("SendFileTemp", dbOpenForwardOnly)
With rst
Do While Not .EOF
MailBody = MailBody & ![serviceid] & " | " & ![status] & " | " & ![EventDate] & " | " & ![name] & vbCrLf
.MoveNext
Loop
End With
rst.Close
Set oMessage = CreateObject("CDO.Message")
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTPRelay
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
oMessage.Configuration.Fields.Update
oMessage.From = !From
oMessage.To = !EMAIL
oMessage.bcc = !BCC
oMessage.Subject = "Jobs requiring your attention"
oMessage.TextBody = "Can you please take a look at these jobs that remain open and close them down. Thanks " _
& vbCrLf & " " & vbCrLf & MailBody & vbCrLf & " "
oMessage.Send
MailBody = ""
.MoveNext
Loop
End With
您应该在模块头中有显式选项,并在过程开始时声明所有变量,为什么不直接从表单记录中打开由收件人筛选的记录集?您应该在模块标题中有显式选项,并在过程开始时声明所有变量。为什么不直接从表单记录中打开由收件人筛选的记录集,而不是将记录写入SendFileTemp?