2013-02-10 148 views
1

我試圖根據在「作業」列中分配的作業類型將循環名稱放入「任務」列中。我的表看起來像這樣的例子:訪問VBA中的循環記錄

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

它應該不會保持循環的2名入列,但它。但是,有時在運行幾次之後,它會這樣做。在開啓DB後,它不會,並且在完成後會出現如上。有任何想法嗎?

回答

0

這片的代碼允許i爲具有2

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

但是UBound(employee)的值是1,這意味着當i是2 employee(i)應該拋出一個「下標超出範圍」錯誤。但是你沒有報告得到這個錯誤,所以我不明白髮生了什麼事情。

此外,您的第一個屏幕截圖顯示作業列中的「Letter」和「Change」,但第二個屏幕截圖全部顯示爲「Letter」。這是另一個困惑。

也許你需要用查詢加載記錄集而不是整個表。

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

然後你通過記錄行移動,撥動i 0和1之間

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

它看起來對我來說,這些變化可能讓你的代碼工作,你打算。但是考慮一種更靈活和更容易維護的方法。將員工姓名保存在一個表中,並打開第二個記錄集,rs員工,以保存這些員工姓名。當你移動第一個記錄集時,Rst,也提前第二個:rsEmployees.MoveNext如果你達到rsEmployees.EOF,那麼應該「循環」分配。

該方法允許您通過更新employees表來添加/刪除可用池中的員工。每次添加/刪除員工時,您都不需要修改VBA代碼。

+0

對不起關於屏幕截圖的差異,我試圖看看當我將所有4個任務設爲同一個名稱時會發生什麼。無論是2,3或4個任務是否分配,都會發生此問題,這正是我正在測試的。我的想法是創建一個表單,允許運行宏的人員選擇可供分配的人員的複選框,然後根據檢查的人員來匹配大小以適應大小,然後將其分配出去。然而,不同的員工會做不同的事情,所以我需要區分誰做什麼以及他們是否在場。 – 2013-02-10 01:52:08

+0

好的,我有一個預感,這件事情會比問題更復雜。 ;-)所以,你有一些未定數字(但可能大於2)的員工姓名。在*你爲*任務*分配一個名字之後增加'i' *,但是如果'i = UBound(employee)+ 1',則將'i'設爲零。這仍然留下了如何收集名稱以加載到數組中的問題,但我們假設您已經完成了該部分。 – HansUp 2013-02-10 01:59:38

+0

感謝您的想法,我將嘗試按照建議創建第二個記錄集,並使用複選框指示符指示是否應該導入,分配或跳過這些人員處理的作業名稱。感謝上面的例子,我打算玩一下,看看我想出什麼 – 2013-02-10 02:02:15