我正在尝试将名称循环到“TASK”列,具体取决于在“JOB”列中分配的作业类型。我的表看起来像这样:
我的代码如下:
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
问题是,有时它“错过”了一项任务,我不知道为什么。
它应该将这两个名称循环到列中,但它不会。但是,有时在运行它几次后它就会这样做。在打开DB新鲜时,它将不会,并且在完成后将如上所示。有什么想法吗?
答案 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代码。