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

問題は、割り当てを「見逃す」ことがあり、その理由がわかりません。

テーブルの写真は引っ張らなかった

これらの2つの名前を列にループし続ける必要がありましたが、そうではありません。ただし、数回実行した後でも実行される場合があります。DBを新しく開くと、開かず、完了すると上記のように表示されます。何か案は?

4

1 に答える 1

0

コードのこの部分ではi、値を2にすることができます。

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

しかし、UBound(employee)は1です。これは、が2の場合に「添え字が範囲外」エラーemployee(i)をスローする必要があることを意味します。しかし、そのエラーの発生は報告されていないため、何が起こっているのかわかりません。i

また、最初のスクリーンショットでは[ジョブ]列に「レター」と「変更」が表示されていますが、2番目のスクリーンショットではすべて「レター」と表示されています。それは別の謎解きです。

たぶん、テーブル全体ではなく、クエリを使用してレコードセットをロードする必要があります。

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

次に、レコードセットの行を移動しながら、i0と1を切り替えます。

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

これらの変更により、コードが意図したとおりに機能する可能性があるように思われます。ただし、より柔軟で保守が容易なアプローチを検討してください。従業員名をテーブルに格納し、2番目のレコードセットrsEmployeesを開いて、それらの従業員名を保持します。最初のレコードセットであるRstを移動しながら、 2番目のレコードセットも進めます。に到達したrsEmployees.MoveNext 場合は 、割り当てを「ラウンドロビン」する必要があります。rsEmployees.EOFrsEmployees.MoveFirst

このアプローチでは、employeesテーブルを更新するだけで、利用可能なプールに従業員を追加/削除できます。従業員を追加/削除するたびにVBAコードを修正する必要はありません。

于 2013-02-10T01:42:45.287 に答える