访问VBA中的循环记录

时间:2013-02-10 00:57:44

标签: vba ms-access access-vba

我正在尝试将名称循环到“TASK”列,具体取决于在“JOB”列中分配的作业类型。我的表看起来像这样:

example table

我的代码如下:

Sub macro2()

Dim Rst As DAO.Recordset
Set Rst = CurrentDb.OpenRecordset("table1")

Dim employee(2) As String

employee(0) = "empname1"
employee(1) = "empname2"

Dim i As Integer
With Rst
    i = 0
    Rst.MoveFirst

    Do While Not .EOF
        If Rst.Fields("JOB") = "LETTER" Then
            Rst.Edit
            Rst.Fields("Task").value = employee(i)
            Rst.Update
        End If
        .MoveNext
        i = i + 1
        If i > 2 Then i = 0
    Loop
End With

DoCmd.Requery
End Sub

问题是,有时它“错过”了一项任务,我不知道为什么。

table pic did not pull

它应该将这两个名称循环到列中,但它不会。但是,有时在运行它几次后它就会这样做。在打开DB新鲜时,它将不会,并且在完成后将如上所示。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这段代码允许i的值为2.

i = i + 1
If i > 2 Then i = 0

UBound(employee)为1,这意味着当employee(i)为2时,i会抛出“下标超出范围”错误。但是你没有报告得到那个错误,所以我不明白发生了什么。

此外,您的第一个屏幕截图显示了作业列中的“信函”和“更改”,但第二个屏幕截图显示全部为“信函”。那是另一个益智游戏。

也许您需要使用查询而不是完整表来加载记录集。

Set Rst = CurrentDb.OpenRecordset("SELECT Job, Task FROM table1 " & _
    "WHERE Job = 'Letter'")

然后,当您浏览记录集行时,请在0和1之间切换i

i = IIf(i = 1, 0, 1)

在我看来,这些更改可能允许您的代码按预期工作。但是,请考虑一种更灵活,更易于维护的方法。将员工姓名存储在表中,并打开第二个记录集 rsEmployees ,以保存这些员工姓名。当您浏览第一个记录集 Rst 时,也会推进第二个:rsEmployees.MoveNext如果您到达rsEmployees.EOF,请执行rsEmployees.MoveFirst那应该“循环”分配

这种方法允许您通过简单地更新employees表来从可用池中添加/删除员工。每次添加/删除员工时,您都不需要修改VBA代码。