Это происходит, если ваш Forms-Proptery AllowAdditions
установлен на False
. Если никакие записи не соответствуют фильтру, отображается новая пустая запись (вы можете проверить, добавив часы на Me
и точку останова после Me.requery
. Если вы установили AllowAdditions
на True
, Me.NewRecord
будет True
(- 1)). Если это запрещено, возникает ошибка.
Вы можете избежать этой ошибки, установив AllowAdditions
в True
или отметив .RecordCount
. Если нет записей, не устанавливайте .SelStart
и .SelLength
Private Sub FilterName_Change()
With Me
.Requery
With .FilterName
.SetFocus
If Me.Recordset.RecordCount > 0 Then
.SelStart = Len(.Text)
.SelLength = Len(.Text)
End If
End With
End With
End Sub
Имейте в виду, что Requery
снова выполняет весь запрос, что может привести к отставанию, если время выполнения запроса больше чем 500 мс. Чтобы избежать Requery
, используйте Filter
, который будет повторно использовать набор записей и пропустить WHERE
-выражение в SQL -Statement.
Private Sub FilterName_Change()
With Me
.Dirty = False
.Filter = "tbl_geraete.Geraetename LIKE '*" & .FilterName.Value & "*' OR " & Len(.FilterName.Value & vbNullString) & " = 0"
.FilterOn = True
With .FilterName
.SetFocus
If Me.Recordset.RecordCount > 0 Then
.SelStart = Len(.Text)
.SelLength = Len(.Text)
End If
End With
End With
End Sub
Чтобы сохранить ваш код простым, избегайте проверок на отсутствие ложных (<>False
), вместо этого просто проверьте, является ли выражение True
. If IsNull([forms]![frm_geraete]![FilterName]) Then
и в sql, предпочитайте sql -выражение над vba-функцией: [forms]![frm_geraete]![FilterName] Is Null