Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 循环未在整个表中运行_Vba_Ms Access_Loops_Recordset - Fatal编程技术网

Vba 循环未在整个表中运行

Vba 循环未在整个表中运行,vba,ms-access,loops,recordset,Vba,Ms Access,Loops,Recordset,因此,我构建了一个系统,其中设置了一些不同的标志等等,但我想做的一件事是获取一个暂存表的内容,并将其发送到另一个用于跟踪的表。我试图使用insert-into循环来完成它,但我根本不知道如何使它按预期的方式工作 专用子窗体加载 DoCmd.SetWarnings错误 DoCmd.OpenQuery qrydelete电子邮件 作为对象的Dim db 将rst作为对象 作为对象的Dim测试 Set db=Application.CurrentDb Set rst=db.OpenRecordsetq

因此,我构建了一个系统,其中设置了一些不同的标志等等,但我想做的一件事是获取一个暂存表的内容,并将其发送到另一个用于跟踪的表。我试图使用insert-into循环来完成它,但我根本不知道如何使它按预期的方式工作

专用子窗体加载 DoCmd.SetWarnings错误 DoCmd.OpenQuery qrydelete电子邮件 作为对象的Dim db 将rst作为对象 作为对象的Dim测试 Set db=Application.CurrentDb Set rst=db.OpenRecordsetqryDate Set test=db.OpenRecordsettblEmailTemp 如果Me.RecordsetClone.RecordCount=0,则 MsgBox没有拖欠的账户。不会生成电子邮件。 我,刷新一下 文件关闭acForm、qryDate、acSaveNo DoCmd.CancelEvent 其他的 rst.MoveFirst 直到rst.EOF为止 rst.编辑 rst!NeedsMail=1 rst.更新 rst.MoveNext 环 “DoCmd.Requery “rst.Close DoCmd.RunMacro StagingTable 先测试 直到test.EOF为止 CurrentDb.Execute Insert Into EmailTracking Account,ExpirationDate&_ 值“&AccountName&”,&ExpirationDate&” test.MoveNext 环 测试,关闭 rst.MoveFirst 直到rst.EOF为止 rst.编辑 rst!EmailSent=1 rst.更新 rst.MoveNext 环 “DoCmd.Requery rst.关闭 DoCmd.RunMacro关闭 'DoCmd.OpenQuery qryDeleteEmail 如果结束 出口接头 端接头 现在发生的事情是它复制了暂存表的第一条记录两次。例如,我有一个帐户名A和一个帐户名S,但不是插入A的记录和S的记录,而是插入A两次


任何帮助都将不胜感激

我不知道你在这里想干什么;即使注释了,也很难理解ErrorHandler在Else语句中做了什么

至于循环遍历记录集,我建议您阅读一下MS Access中VBA编程的基础。你可以从阅读下面的文章开始。这是一个关于VBA记录集的快速介绍,然后是VBA中最常见的错误


它应该可以帮助您改进代码。

我不确定您在这里想做什么;即使注释了,也很难理解ErrorHandler在Else语句中做了什么

至于循环遍历记录集,我建议您阅读一下MS Access中VBA编程的基础。你可以从阅读下面的文章开始。这是一个关于VBA记录集的快速介绍,然后是VBA中最常见的错误


它应该可以帮助您改进代码。

创建并测试一个更简单的过程,该过程只关注您试图解决的问题。不幸的是,我不确定这是什么问题。不管怎样,我还是会建议

Public Sub TestLoopThruTable()
    Dim db As DAO.database
    Dim test As DAO.Recordset
    Dim strInsert As String

    DoCmd.SetWarnings True ' make sure SetWarnings is on
    Set db = CurrentDb
    Set test = db.OpenRecordset("tblEmailTemp")
    Do While Not test.EOF
        strInsert = "INSERT INTO EmailTracking (Account, ExpirationDate)" & vbCrLf & _
            "VALUES ('" & AccountName & "', '" & ExpirationDate & "')"
        Debug.Print strInsert
        'db.Execute strInsert, dbFailOnError
        test.MoveNext
    Loop
    test.Close
    Set test = Nothing
    Set db = Nothing
End Sub
请注意,在原始版本中,ExpirationDate和值之间没有空格。我使用了换行vbCrLf而不是空格,但两者都可以让db引擎满意

我确保设置警告已打开。在代码中,您在开始时将其关闭,但再也没有将其打开。在关闭设置警告的情况下操作会抑制重要信息,否则您可以使用这些信息来了解代码中的问题

当代码在记录集中循环时,它只创建一个INSERT语句并为每一行显示它。您可以在即时窗口中查看输出,使用Ctrl+g键盘快捷键转到该窗口。复制其中一条INSERT语句,并通过粘贴到新Access查询的SQL视图中进行测试。如果在那里失败了,请找出需要更改什么以满足db引擎的要求。如果插入成功,请尝试从代码中执行它们:通过删除该行开头的单引号来启用db.Execute行

按照编写VALUES子句的方式,[ExpirationDate]似乎是一个文本字段。但是,如果其数据类型实际上是日期/时间,则不要在插入的值周围加引号;使用日期分隔符而不是引号

还要确保在代码模块的声明部分包含Option Explicit,如下所示:

Option Compare Database
Option Explicit

我提到这一点是因为在这个问题的早期版本中,您显示了选项比较,但没有显示选项显式。尝试在没有显式选项的情况下对代码进行故障排除是浪费时间。

创建并测试一个更简单的过程,该过程只关注您试图解决的问题。不幸的是,我不确定这是什么问题。不管怎样,我还是会建议

Public Sub TestLoopThruTable()
    Dim db As DAO.database
    Dim test As DAO.Recordset
    Dim strInsert As String

    DoCmd.SetWarnings True ' make sure SetWarnings is on
    Set db = CurrentDb
    Set test = db.OpenRecordset("tblEmailTemp")
    Do While Not test.EOF
        strInsert = "INSERT INTO EmailTracking (Account, ExpirationDate)" & vbCrLf & _
            "VALUES ('" & AccountName & "', '" & ExpirationDate & "')"
        Debug.Print strInsert
        'db.Execute strInsert, dbFailOnError
        test.MoveNext
    Loop
    test.Close
    Set test = Nothing
    Set db = Nothing
End Sub
请注意,在原始版本中,ExpirationDate和值之间没有空格。我使用了换行vbCrLf而不是空格,但两者都可以让db引擎满意

< p> 我确保设置警告已打开。在代码中,您在开始时将其关闭,但再也没有将其打开。在关闭设置警告的情况下操作会抑制重要信息,否则您可以使用这些信息来了解代码中的问题

当代码在记录集中循环时,它只创建一个INSERT语句并为每一行显示它。您可以在即时窗口中查看输出,使用Ctrl+g键盘快捷键转到该窗口。复制其中一条INSERT语句,并通过粘贴到新Access查询的SQL视图中进行测试。如果在那里失败了,请找出需要更改什么以满足db引擎的要求。如果插入成功,请尝试从代码中执行它们:通过删除该行开头的单引号来启用db.Execute行

按照编写VALUES子句的方式,[ExpirationDate]似乎是一个文本字段。但是,如果其数据类型实际上是日期/时间,则不要在插入的值周围加引号;使用日期分隔符而不是引号

还要确保在代码模块的声明部分包含Option Explicit,如下所示:

Option Compare Database
Option Explicit

我提到这一点是因为在这个问题的早期版本中,您显示了选项比较,但没有显示选项显式。在我看来,尝试在没有显式选项的情况下对代码进行故障排除是浪费时间。

代码的缩进没有意义,我对其进行了编辑。在这一小部分代码中仍然有很多不合理的地方。好吧,我将是第一个承认我在这方面做得很差并且仍在努力学习的人。不过,还是要感谢编辑。它确实使它更容易阅读。宏StagingTable在做什么?另外,您还没有初始化AccountName和ExpirationDate。我建议将选项显式放置在模块顶部。你可能想做的是测试!帐户名和测试!ExpirationDate。stagingtable宏正在将信息拉到表中,以便我的电子邮件模块读取。基本上,第一个循环是将条目标记为需要电子邮件。然后StaginTable宏将为我的电子邮件模块提取标记的条目。宏运行后,条目将标记为电子邮件发送。那部分工作得很好。我不是100%确定你说的初始化是什么意思,测试是在什么环境下进行的!将使用AccountName语句。我仍然在学习VBA作为一个整体,所以如果我表现得像个白痴,我很抱歉。你代码的缩进没有意义,我编辑了它。在这一小部分代码中仍然有很多不合理的地方。好吧,我将是第一个承认我在这方面做得很差并且仍在努力学习的人。不过,还是要感谢编辑。它确实使它更容易阅读。宏StagingTable在做什么?另外,您还没有初始化AccountName和ExpirationDate。我建议将选项显式放置在模块顶部。你可能想做的是测试!帐户名和测试!ExpirationDate。stagingtable宏正在将信息拉到表中,以便我的电子邮件模块读取。基本上,第一个循环是将条目标记为需要电子邮件。然后StaginTable宏将为我的电子邮件模块提取标记的条目。宏运行后,条目将标记为电子邮件发送。那部分工作得很好。我不是100%确定你说的初始化是什么意思,测试是在什么环境下进行的!将使用AccountName语句。我仍然在学习VBA作为一个整体,所以如果我表现得像个白痴,我很抱歉。在我看来,使用基于参数查询的QueryDef会更好。然后每次通过循环时,只需提供参数值并执行QueryDef。我失去了雄心壮志。我感谢你的帮助。在我试图解决这个问题时,我会提到这一点。谢谢。在我看来,使用基于参数查询的QueryDef会更好。然后每次通过循环时,只需提供参数值并执行QueryDef。我失去了雄心壮志。我感谢你的帮助。在我试图解决这个问题时,我会提到这一点。非常感谢。