Доступ к VBA: перейти к следующей итерации в случае ошибки - PullRequest
0 голосов
/ 29 июня 2018

Listbox2 заполняется из элементов в таблице, которая сама заполняется из listbox1. Будет выдана ошибка, если попытка добавления в таблицу содержит дубликаты ключей. Я хочу, чтобы мой код обрабатывал ошибку, пропуская рассматриваемую итерацию проблемы, а не останавливался на полпути цикла.

Мой код выглядит примерно так:

Public Sub CopySelected(ByRef frm As Form)

    Dim ctlSource As Control
    Dim intCurrentRow As Integer

    Set ctlSource = Me!listbox1
On Error GoTo nonrelation
    Dim rst As dao.Recordset
    Set rst = CurrentDb.OpenRecordset("Select * from [tempTable]")

    For intCurrentRow = 0 To ctlSource.ListCount - 1
        If ctlSource.Selected(intCurrentRow) Then
            rst.AddNew
            rst![field1] = Forms![myForm]![listbox1].Column(1, intCurrentRow)
            rst![field2] = Forms![myForm]![listbox1].Column(0, intCurrentRow)
            rst.Update
            Forms![myForm]!listbox2.Requery
        End If
    Next intCurrentRow
    Forms![myForm]!listbox2.Requery
done:
    Exit Sub
nonrelation:
    MsgBox Err.Description
End Sub

Я знаю, что вместо моего MsgBox Err.Description нужно каким-то образом использовать команду «резюме», но я никогда не использовал ее. Я хотел бы знать, как правильно реализовать это в моем коде. Спасибо!

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете проверить, существует ли запись с помощью вспомогательной функции, и добавить только, если нет.

Public Function Exists(ByVal Value As String) As Boolean
    Exists = DCount("*","tempTable","[field1]='" & Value & "'") > 0
End Function

Затем внутри вашего цикла проверьте каждую запись, прежде чем пытаться вставить.

For intCurrentRow = 0 To ctlSource.ListCount - 1
    If ctlSource.Selected(intCurrentRow) Then
        If Not Exists(Forms![myForm]![listbox1].Column(1, intCurrentRow)) Then
            With rst
                .AddNew
                ![field1] = Forms![myForm]![listbox1].Column(1, intCurrentRow)
                ![field2] = Forms![myForm]![listbox1].Column(0, intCurrentRow)
                .Update
            End With
            Forms![myForm]!listbox2.Requery
        End If
    End If
Next intCurrentRow

Обратите внимание, что в приведенном выше примере ожидается String. В случае числового значения вам необходимо удалить кавычки ' '.

...