基本上我正在尝试使用模块或公共函数来提取仅适用于工作日的日期。就代码而言,一切都有效,但出于某种原因,特定日期字段(我在数据库生产一段时间之后添加了一个)代码无法正常工作,我得到了“数据类型”表达不匹配“。我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
答案 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
检查。
希望这有帮助。