需要为日期允许空值或“”值 - 访问查询数据类型不匹配

时间:2010-12-02 18:30:11

标签: ms-access vba access-vba

基本上我正在尝试使用模块或公共函数来提取仅适用于工作日的日期。就代码而言,一切都有效,但出于某种原因,特定日期字段(我在数据库生产一段时间之后添加了一个)代码无法正常工作,我得到了“数据类型”表达不匹配“。我99%肯定这是一个数据问题。如果我比较它运行的两个不同日期,我创建了一个包含10条记录的测试表并运行。

该字段设置为日期/时间。我想我的问题是,无论如何要摆脱“”或者使它成为代码将接受这些空白作为空值?还是转换它们?

这是我在查询中调用函数的地方:

Exp1:BusinessDays([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

4 个答案:

答案 0 :(得分:0)

Year(dteStartDate) > Year(dteEndDate)

时代码失败

答案 1 :(得分:0)

您无法将数组重新调整为负值。

当lngEYear&lt; lngYear,lngDiff将小于零。

答案 2 :(得分:0)

我不确定这一行:

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

是必要的,因为如果您尝试将其他类型的值提供给函数,则会出现类型不匹配错误。在任何情况下,你也应该有类似的东西:

If dteStartDate <= dteEndDate Then 

Else部分返回“已知错误”答案,代码在此处执行的方式:

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

这只是Jim Anderson已经发布的答案的扩展  和mwolfe02 。如果你接受这个答案/投票,你也应该投票给他们......

答案 3 :(得分:0)

由于您已将参数声明为Date类型,因此数据类型不匹配。虽然数据库中的Date/Time列可以包含空值,但VBA中的Date变量不能。因此,您必须将参数声明为Variant s,并在函数的开头进行一些类型检查。

这意味着我对另一个答案的评论(说IsDate将始终在此处返回true)会产生误导。您应该通过将参数类型从IsDate更改为Date来使检查更有意义,而不是删除无意义的Variant检查。

希望这有帮助。