Необходимо разрешить Null или значения для дат — несоответствие типа данных запроса доступа

В основном я пытаюсь использовать модуль или общедоступные функции, чтобы вытащить datediff, который предназначен только для рабочих дней. Все работает, что касается кода, но по какой-то причине с определенным полем даты (которое я добавил после того, как база данных некоторое время находилась в производстве) код работает неправильно, и я получаю «Тип данных Несоответствие в выражении». Я на 99% уверен, что это проблема с данными. Если я сравню две разные даты, которые он запустит, я создам тестовую таблицу с 10 записями, и она запустится.

Поле установлено на Дата/Время. Я предполагаю, что мой вопрос в том, есть ли способ избавиться от "" или сделать так, чтобы код принимал эти пробелы как нули? или конвертировать их?

Здесь я вызываю функцию в запросе:

Exp1: Рабочие дни([IntCallDate],[aIntCall1])

А вот код в модуле...

Спасибо за любую помощь - ОЧЕНЬ признательна!!!

Public Function BusinessDays(dteStartDate As Date, dteEndDate As Date) As Long
On Error GoTo err_workingDays
    Dim lngYear As Long
    Dim lngEYear As Long
    Dim dteStart As Date, dteEnd As Date
    Dim dteCurr As Date
    Dim lngDay As Long
    Dim lngDiff As Long
    Dim lngACount As Long
    Dim dteLoop As Variant
    Dim blnHol As Boolean
    Dim dteHoliday() As Date
    Dim lngCount As Long, lngTotal As Long
    Dim lngThanks As Long
    If IsDate(dteStartDate) And IsDate(dteEndDate) Then 'added here begin
    dteStart = dteStartDate
    dteEnd = dteEndDate

    lngYear = DatePart("yyyy", dteStart)
    lngEYear = DatePart("yyyy", dteEnd)

    If lngYear <> lngEYear Then
        lngDiff = (((lngEYear - lngYear) + 1) * 7) - 1
        ReDim dteHoliday(lngDiff)
    Else
        ReDim dteHoliday(6)
    End If

    lngACount = -1

    For lngCount = lngYear To lngEYear
        lngACount = lngACount + 1
        'July Fourth
        dteHoliday(lngACount) = DateSerial(lngCount, 7, 4)

        lngACount = lngACount + 1
        'Christmas
        dteHoliday(lngACount) = DateSerial(lngCount, 12, 25)

        lngACount = lngACount + 1
        'New Years
        dteHoliday(lngACount) = DateSerial(lngCount, 1, 1)

        lngACount = lngACount + 1
        'Thanksgiving - 4th Thursday of November
        lngDay = 1
        lngThanks = 0
        Do
            If Weekday(DateSerial(lngCount, 11, lngDay)) = 5 Then
                lngThanks = lngThanks + 1
            End If
            lngDay = lngDay + 1
        Loop Until lngThanks = 4

        dteHoliday(lngACount) = DateSerial(lngCount, 11, lngDay)

        lngACount = lngACount + 1
        'Memorial Day - Last Monday of May
        lngDay = 31
        Do
            If Weekday(DateSerial(lngCount, 5, lngDay)) = 2 Then
                dteHoliday(lngACount) = DateSerial(lngCount, 5, lngDay)
            Else
                lngDay = lngDay - 1
            End If
        Loop Until dteHoliday(lngACount) >= DateSerial(lngCount, 5, 1)

        lngACount = lngACount + 1
        'Labor Day - First Monday of Septemeber
        lngDay = 1
        Do
            If Weekday(DateSerial(lngCount, 9, lngDay)) = 2 Then
                dteHoliday(lngACount) = DateSerial(lngCount, 9, lngDay)
            Else
                lngDay = lngDay + 1
            End If
        Loop Until dteHoliday(lngACount) >= DateSerial(lngCount, 9, 1)
        'MsgBox dteHoliday(5)

        lngACount = lngACount + 1
       'Easter
        lngDay = (((255 - 11 * (lngCount Mod 19)) - 21) Mod 30) + 21

        dteHoliday(lngACount) = DateSerial(lngCount, 3, 1) + lngDay + _
                (lngDay > 48) + 6 - ((lngCount + lngCount \ 4 + _
                lngDay + (lngDay > 48) + 1) Mod 7)
    Next


     For lngCount = 1 To DateDiff("d", dteStart, dteEnd)
        dteCurr = (dteStart + lngCount)
        If (Weekday(dteCurr) <> 1) And (Weekday(dteCurr) <> 7) Then
            blnHol = False
            For dteLoop = 0 To UBound(dteHoliday)
            'MsgBox dteHoliday(dteLoop) & "  " & dteLoop
                If (dteHoliday(dteLoop) = dteCurr) Then
                 blnHol = True
                End If
            Next dteLoop
            If blnHol = False Then
                lngTotal = lngTotal + 1
                'MsgBox dteCurr
            End If
        End If
    Next lngCount

BusinessDays = lngTotal
Else                'Add
BusinessDays = -1 ' add
End If   'add


err_workingDays:
MsgBox "Error No: " & Err.Number & vbCr & _
"Description: " & Err.Description
Resume exit_workingDays



End Function

person gfuller40    schedule 02.12.2010    source источник
comment
В частности, если я запускаю запрос и немного прокручиваю вниз, появляется сообщение об ошибке Subscript out of range и выделяется строка:   -  person gfuller40    schedule 02.12.2010


Ответы (4)


Код не работает, когда Year(dteStartDate) > Year(dteEndDate)

person mwolfe02    schedule 02.12.2010
comment
Это действительно комментарий, а не ответ на вопрос. Пожалуйста, используйте комментарий, чтобы оставить отзыв об авторе. - person Conner; 18.08.2012
comment
@Conner: я ценю ваш обзор потенциальных проблем на StackOverflow. Уверяю вас, однако, что я имел в виду это как ответ. В своем вопросе ОП заявляет, что он на 99% уверен, что это проблема с данными. Я просто определял данные, которые могут вызвать ошибку. Я оставил на усмотрение ОП найти оскорбительные записи и принять все, что он счел уместным корректирующим действием. - person mwolfe02; 19.08.2012
comment
Надеюсь, мой отзыв вас не обидел. Процесс проверки в настоящее время находится в стадии бета-тестирования, поэтому он все еще нуждается в доработке некоторых изгибов. Одним из таких недостатков является то, что рецензенты не могут видеть весь контекст вопроса. Таким образом, у меня есть только ваш вопрос, чтобы рассмотреть. Я оценил, что этот конкретный ответ довольно короткий и может быть легко превращен в комментарий. Я думаю, что SO стремится включить ответы, которые включают больше объяснений, которые могут принести пользу будущим пользователям менее локализованных проблем. Я знаю, что это не всегда возможно, но я просто принял интуитивное решение за считанные секунды. С Уважением. - person Conner; 19.08.2012
comment
Я понял, как много. Без обид. Говоря о контексте, было бы полезно, если бы был какой-то тег [Review], связанный с комментариями, добавленными как часть процесса обзора. Сначала я был сбит с толку тем, почему в такой старой ветке возникла внезапная активность. Это имело больше смысла, когда я увидел недавнюю активность в вашем профиле. Если у вас есть какой-либо вклад в процесс рецензирования (учитывая, что он все еще находится в стадии бета-тестирования, а вы, кажется, являетесь активным рецензентом — респект!), вы можете принять мое предложение. Продолжайте в том же духе, помогая улучшить сообщество SO! - person mwolfe02; 20.08.2012

Вы не можете преобразовать массив в отрицательное значение.

Когда lngEYear ‹ lngYear, lngDiff будет меньше нуля.

person Jim Anderson    schedule 02.12.2010

Я не уверен, что эта строка:

If IsDate(dteStartDate) And IsDate(dteEndDate) Then 'added here begin 

необходимо, так как вы получите ошибки несоответствия типов, если попытаетесь передать в функцию значения других типов. В любом случае у вас также/вместо этого должно быть что-то вроде:

If dteStartDate <= dteEndDate Then 

с частью Else, возвращающей «известный плохой» ответ, как здесь делает ваш код:

Else                'Add            
    BusinessDays = -1 ' add            
End If   'add            

Это просто расширение ответов, уже опубликованных Джимом Андерсоном и mwolfe02. Если вы примете этот ответ / проголосуете за него, вы также должны проголосовать за них....

person RolandTumble    schedule 02.12.2010
comment
Поскольку переменные dteStartDate и dteEndDate объявлены как тип Date, функция IsDate всегда будет возвращать значение true. Однако передача строки в IsDate не приведет к ошибке несоответствия типов. Скорее, если строку можно преобразовать в дату, функция вернет значение true; в противном случае он вернет false. - person phoog; 30.01.2011

Вы получаете несоответствие типа данных, потому что вы объявили параметры как тип Date. В то время как столбец Date/Time в базе данных может содержать нулевое значение, переменная Date в VBA не может. Поэтому вы должны объявить параметры как Variants и выполнить некоторую проверку типов в начале вашей функции.

Это означает, что мой комментарий к другому ответу (в котором говорится, что IsDate здесь всегда будет возвращать true) вводит в заблуждение. Вместо того, чтобы удалять бессмысленную проверку IsDate, вы должны сделать проверку осмысленной, изменив тип параметра с Date на Variant.

Надеюсь это поможет.

person phoog    schedule 30.01.2011