2015-04-28 3 views
-2

Я хочу создать функцию множественного фильтра в VBA для сортировки подформы из элементов управления в основной форме.Ошибка времени выполнения 3075

Вот мой код

Dim strWhere As String 
Dim lngLen As Long 
Const conJetDate = "\#dd\/mm\/yyyy\#" 

If Not IsNull(Me.PerPNum) Then 
    strWhere = "([PNum] = " & Me.PerPNum & ") AND " 
End If 

If Not IsNull(Me.PerPPro) Then 
    strWhere = strWhere & "([PPro] = " & Me.PerPPro & ") AND " 
End If 

If Not IsNull(Me.PerPRev) Then 
    strWhere = strWhere & "([PRev] = " & Me.PerPRev & ") AND " 
End If 

If Not IsNull(Me.DateStart) Then 
    strWhere = strWhere & "([TaskStart] >= " & Format(Me.DateStart, conJetDate) & ") AND " 
End If 

If Not IsNull(Me.DateEnd) Then 
    strWhere = strWhere & "([TaskEnd] < " & Format(Me.DateEnd + 1, conJetDate) & ") AND " 
End If 

If Not IsNull(Me.PerDesi) Then 
    strWhere = strWhere & "([UInit] = " & Me.PerDesi & ") AND " 
End If 

lngLen = Len(strWhere) - 5 
If lngLen <= 0 Then 
    MsgBox "No criteria", vbInformation, "Nothing to do." 
Else 

Debug.Print strWhere 

    Me.Sub_Desi_Schedule.Form.Filter = strWhere 
    Me.Sub_Desi_Schedule.Form.FilterOn = True 
End If 

Однако я продолжаю получать ошибки времени выполнения 3075 (Синтаксическая ошибка (отсутствующий оператор) в выражении запроса.

Я могу видеть мои переменные в сообщении об ошибке, хотя .

Я знаю, что это мое выражение запроса, что неправильный формат. Но я не могу понять, что.

+0

Вы никогда не снимаете конечный 'AND' в своем запросе. Вы устанавливаете переменную равной длине ('lngLen = Len (strWhere) - 5'), но никогда не обновляете переменную' strWhere'. Просто проверка вашей «Debug.Print strWhere» должна была подтвердить это. Голосование закрывается как опечатка. – LittleBobbyTables

+0

Это действительно всегда заканчивается словами «И». Кусок кода lngLen = Len (strWhere) - 5 Если lngLen <= 0 Затем MsgBox «Без критериев», vbИнформация «Нечего делать». Else Предполагается избавиться от этого хвоста –

+2

Я не думаю, что вы понимаете код, который вы написали. 'lngLen = Len (strWhere) - 5' просто устанавливает переменную' lngLen' равной длине переменной 'strWhere', минус 5. Ни в коем случае не удаляйте конечное предложение AND и' strWhere', которое является причиной вашей проблемы. – LittleBobbyTables

ответ

2

Хорошо, я вынужден ответить на этот вопрос, потому что кажется например, вы принципиально не получаете что-то или более чем одну вещь, и я не получаю своих комментариев.

Я не знаю, если вы просто копируете и вставляете код, не понимая его, или в такой спешке, что вы не нашли времени, чтобы понять это.

Давайте начнем с:

Кусок кода lngLen = Len(strWhere) - 5 If lngLen <= 0 Then MsgBox "No criteria", vbInformation, "Nothing to do." Else Предполагается, чтобы избавиться от этого хвоста

Нет, это не так.

lngLen = Len(strWhere) - 5 
If lngLen <= 0 Then 
    MsgBox "No criteria", vbInformation, "Nothing to do." 
Else 
    Debug.Print strWhere 

    Me.Sub_Desi_Schedule.Form.Filter = strWhere 
    Me.Sub_Desi_Schedule.Form.FilterOn = True 
End If 

делает две вещи. Он устанавливает lngLen, равную длине вашей strWhere переменной, минус 5. Затем проверяется, чтобы увидеть, если длина меньше или равна 0.

Если strWhere заявление было ...

([PNum] = 27) AND 

... вы установили бы lngLen равным 13.

Поскольку 13 не меньше нуля или равно нулю, переходим в ваш оператор ELSE и устанавливаем фильтр.

Me.Sub_Desi_Schedule.Form.Filter = strWhere 

Который становится

Me.Sub_Desi_Schedule.Form.Filter = "([PNum] = 27) AND " 

См? У вас есть еще получил ваш trailing AND, потому что вы никогда не обновляете переменную strWhere.

Вот что я пытался Me.Sub_Desi_Schedule.Form.Filter = Len(strWhere) - 5 и Me.Sub_Desi_Schedule.Form.Filter = lngLen в обоих случаях исчезает ошибка. Однако фильтры не применяются.

Так что теперь вы просто делаете

Me.Sub_Desi_Schedule.Form.Filter = Len(strWhere) - 5` 

, который является эквивалентом

Me.Sub_Desi_Schedule.Form.Filter = 13 

Это ничего не достичь.Вы устанавливаете фильтр равным длине переменной, а не фактической переменной strWhere. Это должно было стать очевидным, если бы вы поставили точки останова в своем коде.

Я рекомендовал использовать LEFT урезать вашу строку, как это:

strWhere = LEFT(strWhere, lngLen) 

Это все есть на него.

+1

@AndreArsenault Если у вас возникли проблемы с этим, пожалуйста, покажите нам, что «Debug.Print strWhere» показывает вам, когда вы получите ошибку 3075. – HansUp

+0

HandsUp. Вот результат отладки с «strWhere = LEFT (strWhere, lngLen)»: ([PNum] = 19239) AND ([PPro] = 0) AND –

+0

Я получил его для работы с strWhere = LEFT (strWhere, lngLen) Спасибо за покровительствовую помощь ............... –

Смежные вопросы