Dlookup(MS Access 2010)VBA中的日期/时间值

时间:2014-10-05 23:08:03

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

访问在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)

我在这里做错了什么?

技术

1 个答案:

答案 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")

希望这会有所帮助。