Пустая строка - это не то же самое, что Null. Когда вы объявляете строковую переменную, такую как эта:
Dim strWhere As String
strWhere инициализируется как пустая строка (или «строка нулевой длины»). Это значение иногда называют пустой строкой, и существует даже константа VBA vbNullString , которая представляет пустую строку. Однако независимо от того, какое имя вы используете, переменная пустой строки не равна Null. Кроме того, строковая переменная VBA может никогда быть нулевой. Например, этот код вызовет ошибку 94 «Недопустимое использование Null»:
Dim strWhere As String
strWhere = Null
Причина, по которой я подчеркиваю этот момент, заключается в том, что ваш код проверяет, является ли strWhere нулевым. Это логический недостаток, потому что strWhere никогда не будет нулевым. Например, я не верю, что это условие когда-либо может быть истинным:
If IsNull(strWhere) Then
Если вы хотите, чтобы тест определял, когда strWhere не было присвоено значение (это все еще пустая строка), используйте функцию Len:
If Len(strWhere) = 0 Then
Вот другой подход для BuildQuery. Предполагается, что тип данных для вашего поля [Date] - String (как предполагает ваш оригинальный код). Если [Дата] фактически является типом данных Дата / Время, этот код не будет работать. Также обратите внимание, что Дата является зарезервированным словом (см. Имена проблем и зарезервированные слова в Access ). Я заключил имя поля в квадратные скобки, чтобы избежать двусмысленности. Если бы это была моя собственная база данных, я бы изменил имя поля.
Private Sub BuildQuery()
'* Update subform RecordSource based on input from *'
'* the user on the Management tab. *'
Dim strSql As String ' Main SQL SELECT statement '
Dim strWhere As String ' Optional WHERE clause '
Dim i As Integer
Dim strControl As String
Dim strField As String
strSql = "SELECT * FROM tblOpenJobs AS oj"
strWhere = vbNullString
For i = 1 To 3
Select Case i
Case 1
strControl = "cboShift"
strField = "Shift"
Case 2
strControl = "cboDepartment"
strField = "Department"
Case 3
strControl = "txtDate"
strField = "[Date]"
End Select
If Not IsNull(Me.Controls(strControl).Value) Then
strWhere = strWhere & _
IIf(Len(strWhere) > 0, " AND ", "") & _
"oj." & strField & " = '" & _
Me.Controls(strControl).Value & "'"
End If
Next i
If Len(strWhere) > 0 Then
strSql = strSql & " WHERE " & strWhere
End If
'* use the name of the subform CONTROL for sfrmJobs *'
'* (may not be the name of the subform) *'
Me.sfrmJobs.Form.RecordSource = strSql
End Sub