1

我正在尝试根据“JOB”列中分配的作业类型将名称循环到“TASK”列。例如,我的表如下所示:

示例表

我的代码如下:

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

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

表图片没有拉

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

4

1 回答 1

0

这段代码允许i值为 2。

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

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

此外,您的第一个屏幕截图在Job列中显示“Letter”和“Change” ,但第二个屏幕截图显示为“Letter”。那是另一个谜题。

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

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

然后,当您在记录集行中移动时,i在 0 和 1 之间切换。

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

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

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

于 2013-02-10T01:42:45.287 回答