【问题标题】:VBA data type mismatch when blank record exists in MS AccessMS Access 中存在空白记录时 VBA 数据类型不匹配
【发布时间】:2015-02-18 16:19:16
【问题描述】:

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

我要做什么?:从我的数据库中提取一个日期范围内的计数。开始日期和结束日期是格式为“MM/DD/YYYY”的单元格引用,包含日期的日期库字段格式为日期/时间,“短日期”。

如果我的字段列不包含任何空白,则该查询有效:

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

【问题讨论】:

  • 您的“Date_field_name”字段是什么数据类型?
  • @Newd 日期/时间短日期
  • 我认为你根本不需要做 datevalue 的事情。
  • 您打算如何设置 startdate 和 enddate 变量?
  • 我从 excel 的两个单元格中获取这些值

标签: excel ms-access vba


【解决方案1】:

我通常看到这种情况是使用 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\#")

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

“01-01-1969”日期应该适用于您要查找的内容,但如果没有相应调整。此外,我的手绘 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 的想法是一个红鲱鱼,很确定它有很多不需要的格式,并且“格式”部分实际上并没有将它设置为日期,所以它不会做比较恰当。试试看:

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

如果您的结束日期和开始日期将采用非日期格式,请使用

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

【讨论】:

  • 感谢您的回复。表达式中出现错误未定义函数“Nz”。
  • 对不起,我忘了 nz 是一个 VBA 函数,我会用替代方法更新我的帖子。
  • 我在尝试您的代码时收到此错误:Extra ) in query expression 'datevalue(IIf(IsNull(Date_Field_Name), '01-01-1969', Date_Field_Name))) >= #01- 01-2015#AND datevalue(IIf(IsNull(Date_Field_Name), '01-01-1969', Date_Field_Name)))
  • 看起来它只需要 )) 不需要 ))) 徒手编码不是我的强项。
  • 配合您的第一个解决方案实际工作。我用 ' 而不是 "。非常感谢!我真的很感激!
【解决方案2】:

在查询字符串中很可能有一种正确的方法来执行此操作,但我还没有遇到过。对于这种情况,我分两步做:

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

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

在我看来,这不是执行此操作的最佳方法,但我过去曾使用过它并且我知道它有效。

【讨论】:

  • 感谢 Stewbob 的快速回复。我尝试了您的代码并在此行出现错误:If (Not IsNull(myRecordSet(Date_field_name).Value))。这将以红色突出显示。
  • @marv,我忘记了 If 语句后的 Then。我编辑了帖子以显示这一点。
  • 我在上面添加了完整的代码。我想我错过了一些非常简单的东西。得到一个未设置的块变量:(请帮助
  • @marv,您收到错误是因为,我的代码又一次草率了。你有rst.MoveNext,在你的情况下应该是rs.MoveNext。我(再次)编辑了我的帖子,以表明您需要在 If 语句和 .MoveNext 语句中使用相同的 RecordSet 对象。
  • 我更正了第一个。到 rs 仍然得到同样的错误:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多