У меня есть текстовое поле (txtSearch
) с событием On Change
, которое должно отфильтровать список имен на основе ключевых слов, которые подпрограмма находит в поле таблицы Notes
. Однако, когда я ввожу текст в txtSearch
, список (lstCustomers
) не просто отфильтровывает результаты, он полностью стирает их, и я получаю ошибку (Invalid use of Null)
.
К вашему сведению - я получил подпрограммы из другого вопроса ( Использование ключевых слов для поиска записей и их перечисления в списке ). Я перехожу к новым вопросам, потому что клиент запросил некоторые изменения в том, где будет проводиться поиск по ключевым словам.
![enter image description here](https://i.stack.imgur.com/n7iZP.png)
Вот несколько быстрых подробностей процедуры:
- Когда пользователь вводит текст в
txtSearch
, он запускает маршрутизацию KeyWhere
для создания оператора SQL, который список использует для фильтрации имен.
- Отладка
KeyWhere()
в окне Immediate возвращает правильный оператор ( См. Изображение ниже )
![KeyWhere Results](https://i.stack.imgur.com/EBlNx.png)
-
Run-time error `94`: Invalid use of Null
происходит в строке strWhere = KeyWhere(Me.txtSearch, "Notes")
- Поле «Примечания» в таблице - «Длинный текст»
Вот процедура:
Public Function KeyWhere(strKeys As String, strColumn As String) As String
Dim b As Variant
strKeys = Replace(strKeys, vbCrLf, ",") ' remove all line returns
b = Split(strKeys, ",")
Dim strWhere As String
Dim v As Variant
For Each v In b
If Trim(v) <> "" Then
If strWhere <> "" Then strWhere = strWhere & " or "
strWhere = strWhere & strColumn & " like '*" & Trim(v) & "*'"
End If
Next
strWhere = "(" & strWhere & ")"
KeyWhere = strWhere
End Function
А вот процедура _Change()
:
Private Sub txtSearch_Change()
Dim strWhere As String
Dim SQL As String
SQL = "SELECT qrySearchDatabase.Notes FROM qrySearchDatabase WHERE 1=1"
strWhere = KeyWhere(Me.txtSearch.Text, "Notes")
SQL = SQL & " AND " & strWhere
Debug.Print SQL
Me.lstCustomers.RowSource = SQL
Me.lstCustomers.Requery
End Sub
У меня такое ощущение, что мой запрос (qrySearchDatabase
) как-то шаткий, но я не совсем уверен, где. Вот SQL для моего запроса:
SELECT tblContacts.ID, tblContacts.Notes, [Last Name] & ", " & [First Name] AS [File As]
FROM tblContacts
WHERE (((tblContacts.Notes) Is Not Null));
РЕДАКТИРОВАТЬ: Обновлен код на основе ответа ниже .
РЕДАКТИРОВАТЬ 2: Добавлено изображение ниже, чтобы показать испорченные столбцы после Change()
![Weird columns](https://i.stack.imgur.com/j2hD5.png)