访问在Dlookup命令中使用的日期/时间值类型是否有差异?
实施例: 具有多个记录的表 tblreg ,具有clientname(string)和regstart(string) Regstart是字符串,但始终使用格式dd-mm-yyyy hh:mm)。该字段还可以具有其他值(取决于字段typeindicator =<> T) 查询 qry1 指向表tblreg并包含 reg1:Cdate(regstart)和typeindicator =“T”
控件RegStart和Regstop被定义为字符串变量(与表格相同)
VBA代码
Dim strOverlapClientName As String
Dim date1, date2 As Date
date1 = CDate(Me.RegStart)
date2 = CDate(Me.RegStop)
strOverlapClientName = DLookup("[ClientName]",
"qryRegOverlap",
"[Reg1]<= #" & date1 & "# AND [Reg2]>#" & date1 & "#")
目的:我想查询任何现有的客户名称,其中新的日期/时间注册与数据库中另一个客户端的现有时间注册重叠。
选中的值:05-10-2014 12:55
错误:DLookup函数返回错误代码94(无效使用Null)
预期结果应该是 一个客户有RegStart 05-10-2014 12:00:00和Regstop 05-10-2014 13:00:00
使用单个条件(例如“[Reg1]&gt; =#”&amp; date1&amp;“#”)不会引发错误,但会返回错误的记录(02-01-2014 11:45:00)
我在这里做错了什么?
技术
答案 0 :(得分:1)
首先。您需要明确声明所有变量。与其他使用
的复杂编程语言不同int numVar, someNum;
在VBA中,您应该按类型声明每个变量。所以
Dim date1 As Date, date2 As Date
您拥有的将导致将date1声明为Variant类型,将date2声明为Date类型。
现在,如果控件的格式为日期,则不需要执行 CDate 。在我看来,甚至不需要变量。
接下来,JET引擎以美国格式处理日期,而不是常规DD / MM / YYYY HH:NN:SS。因此,您需要相应地格式化日期。
最后,如果不满足条件,DLookup将产生Null值。所以你需要使用Nz函数或将变量声明为Variant。
Dim strOverlapClientName As String
strOverlapClientName = Nz(DLookup("[ClientName]",
"qryRegOverlap",
"[Reg1] <= " & Format(Me.RegStart, "\#mm\/dd\/yyyy hh\:nn\:ss\#") & _
" AND [Reg2] > " & Format(Me.RegStop, "\#mm\/dd\/yyyy hh\:nn\:ss\#")), "No Value Found")
希望这会有所帮助。