【发布时间】:2020-07-13 21:47:22
【问题描述】:
我正在尝试将 mt sql 语句转换为有效的 vba 代码,以便自动执行我的查询。但是,我似乎遇到了运行时错误 3075:查询表达式中的语法错误(缺少运算符)(下面用粗体表示)。有人可以帮忙吗?
我在下面添加了我的原始 SQL 语句。我做错了什么?
谢谢!
Function Create_Queries()
Dim ticker1 As String
Dim ticker2 As String
Dim B As String
Dim A As String
ticker1 = EUF12
ticker2 = EUG12
SelectSQL = "SELECT DISTINCT CurrentDb.Series," & _
"CurrentDb.TimeStamp, CurrentDb.Trade," & _
"CurrentDb.BidOrAsk," & _
"CurrentDb.BestPrice," & _
"**CDbl(DateSerial((CInt(Left([TimeStamp],4))),(CInt(Mid([TimeStamp],6,2))),(CInt(Mid([TimeStamp],9,2))))+TimeSerial((CDbl(Mid([TimeStamp],12,2))),(CDbl(Mid([TimeStamp],15,2))),(CDbl(Mid([TimeStamp],18,6)))))+CDbl(Right([TimeStamp],4))*1/24/60/60" & _
"AS [DatenTime Value]**" & vbCrLf
fromSQL = "FROM CurrentDb"
wheresql = "WHERE (((CurrentDb.Series) = ticker1) And ((CurrentDb.Trade) Is Null) And ((CurrentDb.BidOrAsk) = B) And ((CurrentDb.BestPrice)><0) And ((CDbl(DateSerial((CInt(Left([TimeStamp], 4))), (CInt(Mid([TimeStamp], 6, 2))), (CInt(Mid([TimeStamp], 9, 2)))) + TimeSerial((CDbl(Mid([TimeStamp], 12, 2))), (CDbl(Mid([TimeStamp], 15, 2))), (CDbl(Mid([TimeStamp], 18, 6))))) + CDbl(Right([TimeStamp], 4)) * 1 / 24 / 60 / 60) < 40939))"
orderbysql = "ORDER BY CDbl(DateSerial((CInt(Left([TimeStamp],4))),(CInt(Mid([TimeStamp],6,2))),(CInt(Mid([TimeStamp],9,2))))+TimeSerial((CDbl(Mid([TimeStamp],12,2))),(CDbl(Mid([TimeStamp],15,2))),(CDbl(Mid([TimeStamp],18,6)))))+CDbl(Right([TimeStamp],4))*1/24/60/60;"
SQL = SelectSQL & vbCrLf & fromSQL & vbCrLf & wheresql & vbCrLf & orderbysql
CurrentDb.CreateQueryDef("Query1").SQL = SQL
End Function
SELECT [EU_201~1].Series, [EU_201~1].TimeStamp, [EU_201~1].Trade, [EU_201~1].BidOrAsk, [EU_201~1].BestPrice, CDbl(DateSerial((CInt (Left([TimeStamp],4))),(CInt(Mid([TimeStamp],6,2))),(CInt(Mid([TimeStamp],9,2)))))+TimeSerial((CDbl( Mid([TimeStamp],12,2))),(CDbl(Mid([TimeStamp],15,2))),(CDbl(Mid([TimeStamp],18,6)))))+CDbl(右([TimeStamp],4))*1/24/60/60 AS DatenTime 来自 [EU_201~1] WHERE ((([EU_201~1].Series)="EUF12") AND (([EU_201~1].Trade) 为空) AND (([EU_201~1].BidOrAsk)="B")) ORDER BY CDbl(DateSerial((CInt(Left([TimeStamp],4))),(CInt(Mid([TimeStamp],6,2))),(CInt(Mid([TimeStamp],9,2)) ))+TimeSerial((CDbl(Mid([TimeStamp],12,2))),(CDbl(Mid([TimeStamp],15,2))),(CDbl(Mid([TimeStamp],18,6) ))))+CDbl(右([TimeStamp],4))*1/24/60/60;
【问题讨论】:
-
请向我们展示完整的
SELECT声明。在CurrentDb.CreateQueryDef前一行添加Debug.Print SQL,运行代码,然后进入即时窗口(Ctrl+g)查看语句文本。您也可以复制该文本并将其粘贴到您的问题中,以便我们更轻松地为您提供帮助。 -
顺便说一下,
CurrentDb不是表名的好选择。你能把它重命名为别的名字吗,也许是tblCurrentDb? -
嗨,HansUp。感谢回复。我添加了 debug.print sql 代码和出现的错误消息:需要对象。突出显示的行是: CurrentDb.CreateQueryDef("Query1").SQL = SQL 我试图让 VBA 通过使用变量来选择名为 [EU201~1] 的表。那么 tblCurrentDb 会是更好的选择吗?
-
您添加到问题中的 SQL 语句以
SELECT [EU_201~1].Series开头。但是您的 VBA 代码会构建一个以SELECT DISTINCT CurrentDb.Series开头的代码。现在您报告了不同的错误消息。我帮不了你。