【问题标题】:I am trying to convert my sql statement into vba but nothing seems to work我正在尝试将我的 sql 语句转换为 vba,但似乎没有任何效果
【发布时间】: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 开头的代码。现在您报告了不同的错误消息。我帮不了你。

标签: ms-access vba


【解决方案1】:

这是我简化调试过程的建议

  1. 创建一个简单的选择查询并尝试运行它
  2. 使用debug.print 确保您已做出正确的查询以运行
  3. 使用空格代替vbcrlf

希望它能给你一些解决问题的想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 2011-01-24
    • 2022-11-23
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多