Dlookup for date returing Type Mismatch error

时间:2014-06-21 03:13:00

标签: vba ms-access ms-access-2010

我无法弄清楚导致“类型不匹配”错误的代码有什么问题。我有一种感觉它与所有'和'有关,但我尝试了各种各样的组合,但仍然没有运气。我已经尝试Dim duedate As String但没有改变。我在哪里出错了?

Private Sub Report_Load()

Cat1 = Me.Text175.Value
AssetNum1 = Me.Text177.Value

Dim duedate As Date
duedate = FormatDateTime(Nz(DLookup("[Calibration Due Date]", "[Calibration Data]", "[ID] = " & AssetNum1 And "[Category] = " & Cat1), ""), vbShortDate)

If duedate = "" Then
Me.Text26 = "Oopps"
Else
Me.Text26 = duedate
End If
End Sub

2 个答案:

答案 0 :(得分:1)

VBlades的答案解决了需要修复的代码的一个问题,但是还有另一个原因是你会在发布的代码中出现类型不匹配错误。

当Nz()中的DLookup()评估为null时,Nz()将传递“”(空字符串)作为要使用FormatDateTime()格式化的值; FormatDateTime()需要日期表达式作为其第一个参数,而空字符串不是有效日期。

此外,以下代码无效:

If duedate = "" Then
'stuff
End If

因为您正在尝试评估duedate是否为空字符串。 duedate被定义为代码中的日期值,不能是空字符串(这可能是您遇到的实际错误来自假设DLookup()函数尚未返回null)。

代码中的Nz()函数需要评估FormatDateTime()可以理解的内容。作为一个简单的解决方法,Nz()可以返回一个在数据库中没有意义的值,但可以作为日期进行评估;例如,1格式化为vbShortDate时评估为12/31/1899。您的验证块将是:

If duedate = #12/31/1899# Then
    Me.Text26 = "Oopps"
Else
    Me.Text26 = duedate
End If

请注意,您可以使用0,但0是#12/30/1899#AND#12:00:00 AM#(并且IDE实际上将#12/30/1899#转换为#12:00 :上午00点#编译时#)。 #12:00:00 AM#或0或#12/30/1899#虽然可能有意义,所以最好不要将它用作占位符值。

修改

如果AssetNum1或Cat1可以为null,则可以使用以下命令实现所需:

Dim Cat1 as string
Dim AssetNum1 as Long
Dim duedate As Date

If IsNull(Me.Text175.Value) or IsNull(Me.Text177.Value) Then
    Me.Text26 = "Oopps"
Else
    Cat1 = Me.Text175.Value
    AssetNum1 = Me.Text177.Value
    duedate = FormatDateTime(Nz(DLookup("[Calibration Due Date]","[Calibration Data]","[ID] = " & AssetNum1 & " And [Category] = """ & Cat1 & """"),1),vbShortDate)
    If duedate = #12/31/1899# Then
        Me.Text26 = "Oopps"
    Else
        Me.Text26 = duedate
    End If
End If

答案 1 :(得分:0)

你的双引号在错误的地方,并且需要另一个连接运算符。假设Cat1是数字:

duedate = FormatDateTime(Nz(DLookup("[Calibration Due Date]", "[Calibration Data]", "[ID] = " & AssetNum1 & " And [Category] = " & Cat1), ""), vbShortDate)

如果Cat1是文字:

duedate = FormatDateTime(Nz(DLookup("[Calibration Due Date]", "[Calibration Data]", "[ID] = " & AssetNum1 & " And [Category] = '" & Cat1 & "'"), ""), vbShortDate)