此 VBA 代码中缺少的运算符是什么?

What is the missing operator in this VBA Code?

我构建此代码是为了测试根据日期范围从 Access 2013 数据库中删除一系列记录。我在查询表达式 'START_DATE >= .....etc 中遇到缺少运算符错误。我也尝试过带撇号的 select 语句。

注意:CALL行在实际代码中都是一行。此外,如果我 运行 使用 Between/AND 而不是 >= / <= 的 CALL 行,则代码完成时没有错误,但不会完成任何事情。它没有找到并删除行。

  Function Delete_Range()

  Dim begdt As Date
  Dim enddt As Date

 'user inputs date range
  begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE")
  enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE")


  Dim objectrecordset As ADODB.Recordset
  Set objectrecordset = New ADODB.Recordset

 'initiate recordset object
 objectrecordset.ActiveConnection = CurrentProject.Connection
 Call objectrecordset.Open("select START_DATE 
 from TEMP_DATE_RANGE where START_DATE IS >= "
 & begdt & " AND <= " & enddt, , , adLockBatchOptimistic)

 While objectrecordset.EOF = False
 'delete record
 objectrecordset.Delete
 objectrecordset.UpdateBatch

 'move to next record
 objectrecordset.MoveNext
 Wend

 End Function

谢谢大家的帮助。这是有效的代码。

 DoCmd.SetWarnings (warningsoff)

 'Declare variables
 Dim begdt As String
 Dim enddt As String

 'User inputs variables
 begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE")
 enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE")

 'Format variable as date and error handling
 If Not (IsDate(begdt) And IsDate(enddt)) Then
    MsgBox "Please enter a date using a the date format", vbOKOnly
     GoTo Finished

 Else
    begdt = Format(begdt, "\#yyyy\/mm\/dd\#")
    enddt = Format(enddt, "\#yyyy\/mm\/dd\#")

 End If

 'Delete records from tables based upon user input date range
 Dim SQL As String
 Dim SQL2 As String
 Dim SQL3 As String

  SQL = "DELETE * FROM TEST_TBL_1 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & ""
 SQL2 = "DELETE * FROM TEST_TBL_2 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & ""
 SQL3 = "DELETE * FROM TEST_TBL_3 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & ""

 DoCmd.RunSQL SQL
 DoCmd.RunSQL SQL2
 DoCmd.RunSQL SQL3

 'Close form and show process complete page
 DoCmd.SetWarnings (warningson)
 DoCmd.Close acForm, "DELETE HISTORY", acSaveNo
 DoCmd.OpenForm "COMPLETE", acNormal, "", "", , acNormal

 Finished:

 End Function

在SQL中,你不写:

where a < 8 and > 7

你写:

where a < 8 and a > 7

因此,您需要修复 where 子句:

objectrecordset.ActiveConnection = CurrentProject.Connection
 Call objectrecordset.Open("select START_DATE 
 from TEMP_DATE_RANGE where START_DATE IS >= "
 & begdt & " AND START_DATE <= " & enddt, , , adLockBatchOptimistic)
-----------------^

可能还有其他问题,但这在SQL中是一个明显的问题。

您可能需要在查询字符串中的日期周围插入一些单引号。像这样:

Call objectrecordset.Open("select START_DATE from TEMP_DATE_RANGE where START_DATE BETWEEN '"  & begdt & "' AND '" & enddt & "'", , , adLockBatchOptimistic)

**** 我编辑了它以将 is >= 替换为 between 语句

您的日期比较语法有点不对劲,删除 IS >= 中的 IS 并记得添加 START_DATE <= 而不仅仅是 <=

通过更正,它变成:

Call objectrecordset.Open("select START_DATE 
 from TEMP_DATE_RANGE where START_DATE >= "
& begdt & " AND START_DATE <= " & enddt, , , adLockBatchOptimistic)

首先在 Access 查询设计器中制定查询逻辑和语法。假设 START_DATE 是 Date/Time 数据类型,为目标日期范围的开始和结束选择几个静态值:

SELECT START_DATE 
FROM TEMP_DATE_RANGE
WHERE START_DATE BETWEEN #2015-1-1# AND #2015-10-30#

根据需要进行调整。

获得正确的 SQL 语句后,在 VBA 代码中构建相应的语句文本。

Dim strSelect As String
strSelect = "SELECT START_DATE FROM TEMP_DATE_RANGE " & _
    "WHERE START_DATE BETWEEN " & Format(begdt,"\#yyyy-m-d\#") & _
    " AND " & Format(enddt,"\#yyyy-m-d\#")
Debug.Print strSelect '<- inspect this in Immediate window; Ctrl+g will take you there

然后你可以使用 strSelectobjectrecordset.Open

但是,由于您的目标是删除这些行,因此您实际上并不需要记录集。您可以简单地执行 DELETE 语句。

DELETE FROM TEMP_DATE_RANGE
WHERE START_DATE BETWEEN #2015-1-1# AND #2015-10-30#

您混淆了日期值和字符串表达式,这一切都从您的输入框开始,它总是 returns 一个字符串:

Dim begdt As String
Dim enddt As String

' user inputs date range
begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE")
enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE")

If Not (IsDate(begdt) And IsDate(enddt)) Then
    ' Show error.
Else
    begdt = Format(begdt, "\#yyyy\/mm\/dd\#)
    enddt = Format(enddt, "\#yyyy\/mm\/dd\#)

    Dim SQL As String
    SQL = "Select START_DATE From TEMP_DATE_RANGE Where START_DATE Between " & begdt & " And " & enddt & ""
    Dim objectrecordset As ADODB.Recordset
    Set objectrecordset = New ADODB.Recordset

   'initiate recordset object
   objectrecordset.ActiveConnection = CurrentProject.Connection
   Call objectrecordset.Open(SQL, , , adLockBatchOptimistic)

   ' <Snip>
   ' Clean up.
End If