MS Access中存在空白记录时,VBA数据类型不匹配

时间:2015-02-18 16:19:16

标签: excel-vba ms-access vba excel

如果在包含日期的特定字段中没有空白记录,则我有以下vba查询可以正常工作。当特定记录中存在空白时会发生错误。

我想做什么?:在日期范围之间提取数据库中的计数。 startdate和enddate是格式为“MM / DD / YYYY”的单元格引用,包含日期的datebase字段格式为Date / Time,“short date”。

如果我的字段列不包含任何空格,则

查询有效:

Dim startdate As Date
Dim enddate As Date
strSql = "SELECT Count(*) FROM tablename WHERE datevalue(Date_field_name) >= " & Format(startdate, "\#mm-dd-yyyy\#") & "AND datevalue(Date_field_name) <= " & Format(enddate, "\#mm-dd-yyyy\#")

我尝试添加IS NOT NULL并且不起作用:(

strSql = "SELECT Count(*) FROM tablename WHERE ANOTHER_Field_Name IS NOT NULL AND datevalue(Date_field_name) >= " & Format(startdate, "\#mm-dd-yyyy\#") & "AND datevalue(Date_field_name) <= " & Format(enddate, "\#mm-dd-yyyy\#")

帮我吧!!这让我很生气。

编辑完整代码:

Public Sub counter()
Dim cn As Object
Dim rs As Object
Dim strSql As String
Dim strConnection As String
Dim myCounter As Variant
Dim startdate As Date
Dim enddate As Date
Set cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0; " & _
    "Data Source=Data.mdb"
strSql = "SELECT Count(*) FROM tablename WHERE datevalue(Date_field_name) >= " & Format(startdate, "\#mm-dd-yyyy\#") & "AND datevalue(Date_field_name) <= " & Format(enddate, "\#mm-dd-yyyy\#")
cn.Open strConnection
'Set rs = cn.Execute(strSql)

While (rs.EOF = False)
If (Not IsNull(rs(Sent_To_Tech_Date).Value)) Then
myCounter = myCounter + 1
End If
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub

2 个答案:

答案 0 :(得分:2)

我通常会看到使用NZ功能处理这种情况,因此该字段永远不会留空。所以像这样:

strSql = "SELECT Count(*) FROM tablename WHERE datevalue(Nz(Date_field_name,"01-01-1969")) >= " & Format(startdate, "\#mm-dd-yyyy\#") & "AND datevalue(Nz(Date_field_name,"01-01-1969")) <= " & Format(enddate, "\#mm-dd-yyyy\#")

这也假设您只是显示一些精简代码,因为您声明了变量然后运行查询而没有将这些变量更改为日期。

&#34; 01-01-1969&#34;日期应该适用于您正在寻找的内容,但如果不相应调整。另外我的写意SQL并不令人惊讶,所以一些语法可能有些偏差。

代码更正:

strSql = "SELECT Count(*) FROM tablename WHERE datevalue(IIf(IsNull(Date_field_name),"01-01-1969", Date_Field_Name)) >= " & Format(startdate, "\#mm-dd-yyyy\#") & " AND datevalue(IIf(IsNull(Date_field_name),"01-01-1969", Date_Field_Name)) <= " & Format(enddate, "\#mm-dd-yyyy\#")

如果你看一下这个并不适合你的想象:http://www.w3schools.com/sql/sql_isnull.asp还有其他办法来处理空值。

第三轮,我认为Null的想法是一个红色的鲱鱼,很确定它是很多不需要的格式,并且&#34;格式&#34;部分实际上并没有将其设置为日期,因此它无法正确进行比较。试试:

strSql = "SELECT Count(*) FROM tablename WHERE Date_field_name >= #" & startdate & "# AND Date_Field_Name <= #" & enddate & “#”

如果您的enddate和startdate将采用非日期格式,请使用

strSql = "SELECT Count(*) FROM tablename WHERE Date_field_name >= #" & Format(startdate,"\#mm-dd-yyyy\#") & "# AND Date_Field_Name <= #" & Format(enddate,"\#mm-dd-yyyy\#") & “#”

答案 1 :(得分:2)

在查询字符串中很可能有一种正确的方法,但我没有遇到它。对于这种情况,我分两步进行:

我将运行标准的SELECT查询来返回感兴趣的日期范围内的所有记录,而不是运行Count查询。 然后我将循环遍历记录集中的所有项目,丢弃任何空值,并计算其余项目。

While (myRecordSet.EOF = False)
  If (Not IsNull(myRecordSet(Date_field_name).Value)) Then
    myCounter = myCounter + 1
  End If
  myRecordSet.MoveNext
Wend

在我看来,这不是最佳方式,但我过去曾使用它,我知道它有效。