Excel Access VBA中的StrSQL错误
我有一个Access VBA子程序,如下所示:Excel Access VBA中的StrSQL错误,excel,vba,ms-access,Excel,Vba,Ms Access,我有一个Access VBA子程序,如下所示: Sub SampleReadCurve() Dim rs As Recordset Dim iRow As Long, iField As Long Dim strSQL As String strSQL = "SELECT * FROM dbo_VolatilityInput5" & "ORDER BY MaturityDate" Set rs = CurrentDb.OpenRecords
Sub SampleReadCurve()
Dim rs As Recordset
Dim iRow As Long, iField As Long
Dim strSQL As String
strSQL = "SELECT * FROM dbo_VolatilityInput5" & "ORDER BY MaturityDate"
Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)
If rs.RecordCount <> 0 Then
Do While Not rs.EOF
Dim BucketTermAmt As Long
Dim BucketTermUnit As String
Dim BucketDate As Date
Dim MarkAsOfDate As Date
Dim InterpRate As Double
MarkAsOfDate = rs!MarkAsOfDate
BucketTermAmt = 3
BucketTermUnit = "m"
BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, MarkAsOfDate)
InterpRate = CurveInterpolateRecordset(rs, BucketDate)
Debug.Print BucketDate, InterpRate
rs.MoveNext
Loop
End If
End Sub
strSQL = "SELECT * FROM dbo_VolatilityInput5 " & some_variable & " ORDER BY MaturityDate"
dbo_volatity5是Access数据库中的一个表
然而,当我执行这段代码时,它在strSQL语句的FROM子句中给了我一个运行时错误语法错误。据我所知,strSQL语法是正确的。我做错了什么?在dbo_VolatilityInput5之后,您缺少一个空格。在连接多个字符串以形成SQL查询时,这是一个非常常见的错误 我更喜欢将每个部分放在新的行上:
strSQL = "SELECT * "
strSQL = strSQL & "FROM dbo_VolatilityInput5 "
strSQL = strSQL & "ORDER BY MaturityDate"
等等。在dbo_VolatilityInput5之后缺少一个空格。在连接多个字符串以形成SQL查询时,这是一个非常常见的错误 我更喜欢将每个部分放在新的行上:
strSQL = "SELECT * "
strSQL = strSQL & "FROM dbo_VolatilityInput5 "
strSQL = strSQL & "ORDER BY MaturityDate"
等等。只需更正您的代码,这样:
strSQL = "SELECT * FROM dbo_VolatilityInput5 ORDER BY MaturityDate"
没有必要连接字符串,因为它没有任何变量。
如果是,如WHERE子句,请执行以下操作:
Sub SampleReadCurve()
Dim rs As Recordset
Dim iRow As Long, iField As Long
Dim strSQL As String
strSQL = "SELECT * FROM dbo_VolatilityInput5" & "ORDER BY MaturityDate"
Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)
If rs.RecordCount <> 0 Then
Do While Not rs.EOF
Dim BucketTermAmt As Long
Dim BucketTermUnit As String
Dim BucketDate As Date
Dim MarkAsOfDate As Date
Dim InterpRate As Double
MarkAsOfDate = rs!MarkAsOfDate
BucketTermAmt = 3
BucketTermUnit = "m"
BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, MarkAsOfDate)
InterpRate = CurveInterpolateRecordset(rs, BucketDate)
Debug.Print BucketDate, InterpRate
rs.MoveNext
Loop
End If
End Sub
strSQL = "SELECT * FROM dbo_VolatilityInput5 " & some_variable & " ORDER BY MaturityDate"
请看引号后面有一个空格。只需更正代码,这样:
strSQL = "SELECT * FROM dbo_VolatilityInput5 ORDER BY MaturityDate"
没有必要连接字符串,因为它没有任何变量。
如果是,如WHERE子句,请执行以下操作:
Sub SampleReadCurve()
Dim rs As Recordset
Dim iRow As Long, iField As Long
Dim strSQL As String
strSQL = "SELECT * FROM dbo_VolatilityInput5" & "ORDER BY MaturityDate"
Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)
If rs.RecordCount <> 0 Then
Do While Not rs.EOF
Dim BucketTermAmt As Long
Dim BucketTermUnit As String
Dim BucketDate As Date
Dim MarkAsOfDate As Date
Dim InterpRate As Double
MarkAsOfDate = rs!MarkAsOfDate
BucketTermAmt = 3
BucketTermUnit = "m"
BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, MarkAsOfDate)
InterpRate = CurveInterpolateRecordset(rs, BucketDate)
Debug.Print BucketDate, InterpRate
rs.MoveNext
Loop
End If
End Sub
strSQL = "SELECT * FROM dbo_VolatilityInput5 " & some_variable & " ORDER BY MaturityDate"
请看,引号后面是一个空格。当我遇到这样的问题时,我会使用调试器:在set rs=行上设置断点,在strSQL中获取字符串的副本,并将其粘贴到Access中的查询设计器中。这是一个可视化问题的好方法。是的,或者添加一个快速而肮脏的调试。在设置rs=…嘿,谢谢你的回复之前打印strSQL。正如您所示,我将其替换为新行中的每个部分,但我仍然得到相同的错误。还有什么不对劲吗?当然。如果缺少空间,通常就足够了。除非我已经盯着它看了3个小时这正是你说的缺少空间的问题。但是,直到我重新启动Access,它才起作用。当我遇到这样的问题时,我使用调试器:在set rs=行上设置断点,在strSQL中获取字符串的副本,并将其粘贴到Access中的查询设计器中。这是一个可视化问题的好方法。是的,或者添加一个快速而肮脏的调试。在设置rs=…嘿,谢谢你的回复之前打印strSQL。正如您所示,我将其替换为新行中的每个部分,但我仍然得到相同的错误。还有什么不对劲吗?当然。如果缺少空间,通常就足够了。除非我已经盯着它看了3个小时这正是你说的缺少空间的问题。但是,直到我重新启动Access.hi,它才起作用。如果我遵循第二个示例,那么要添加一个变量,语法应该是CurveID=15 strSQL=SELECT*fromvolatityyoutput,其中CurveID=&CurveID&orderbydurityDate是否正确?您好。如果我遵循第二个示例,那么要添加一个变量,语法应该是CurveID=15 strSQL=SELECT*FROM volatityyoutput,其中CurveID=&CurveID&ORDER BY durityDate是否正确?