我无法弄清楚导致“类型不匹配”错误的代码有什么问题。我有一种感觉它与所有'和'有关,但我尝试了各种各样的组合,但仍然没有运气。我已经尝试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
答案 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)