此 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
然后你可以使用 strSelect 和 objectrecordset.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
我构建此代码是为了测试根据日期范围从 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
然后你可以使用 strSelect 和 objectrecordset.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