You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA查询Access数据时WHERE子句触发运行时错误3075求助

嘿,我马上就发现你代码里的问题了——SQL语句的子句顺序完全搞反了,这就是触发运行时错误3075的直接原因!

核心问题:SQL语法顺序错误

在标准SQL语法里,子句的执行顺序是有严格规定的,正确的结构应该是:
SELECT 字段列表 FROM 表名 WHERE 筛选条件 ORDER BY 排序字段

你现在把ORDER BY放在了WHERE前面,数据库根本没法解析这个混乱的查询结构,自然会抛出“查询表达式中存在语法错误(缺少运算符)”的提示。

额外的优化与注意点

除了顺序问题,还有两个细节能帮你避免后续可能的bug:

  1. 字符串类型值的引号处理:如果PROCEDURE_NM_WID是字符串类型的字段,你必须给size_system的值加上单引号;如果是数字类型则不需要。我在修正代码里加了类型判断,还处理了值本身包含单引号的转义问题(比如O'Neil这类值,直接加单引号会报错,替换成双单引号就能正常解析)。
  2. 强制变量声明:你的代码里很多变量(比如size_system、tool_file_path)都没有显式声明,建议在模块最顶部加上Option Explicit,强制所有变量必须声明,能避免很多因拼写错误导致的隐性问题。

修正后的完整代码

Option Explicit ' 强制变量声明,避免隐性错误

Sub ImportFromAccess_Size()
    Dim database_file_path As String
    Dim DbLoc As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim xlbook As Workbook
    Dim xlsheet As Worksheet
    Dim recCount As Long
    Dim SQL As String
    Dim size_system As Variant
    Dim tool_file_path As String
    
    ' 读取单元格值
    database_file_path = Range("Database_File_Path").Value
    DbLoc = database_file_path
    tool_file_path = Range("Tool_File_Path").Value
    size_system = Range("Size_System").Value
    
    ' 关闭屏幕刷新提升效率
    Application.ScreenUpdating = False
    Set xlbook = ActiveWorkbook
    Set xlsheet = Sheets("Simulation Input Data")
    
    Application.StatusBar = "Connecting to an external database..."
    
    ' 连接Access数据库
    Set db = OpenDatabase(DbLoc)
    
    ' 构建正确顺序的SQL语句,处理值的引号问题
    SQL = "SELECT SCHED_SURGERY_DATETIME "
    SQL = SQL & "FROM Raw_Data "
    ' 根据类型判断是否添加单引号
    If VarType(size_system) = vbString Then
        SQL = SQL & "WHERE [PROCEDURE_NM_WID] = '" & Replace(size_system, "'", "''") & "' "
    Else
        SQL = SQL & "WHERE [PROCEDURE_NM_WID] = " & size_system & " "
    End If
    ' ORDER BY必须放在WHERE之后
    SQL = SQL & "ORDER BY SCHED_SURGERY_DATETIME "
    
    ' 执行查询并写入数据
    Sheets("Simulation Input Data").Activate
    Set rs = db.OpenRecordset(SQL, dbOpenSnapshot)
    xlsheet.Range("A2").CopyFromRecordset rs
    
    ' 释放资源,避免内存泄漏
    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing
    
    ' 恢复屏幕刷新和状态栏
    Application.ScreenUpdating = True
    Application.StatusBar = False
End Sub

内容的提问来源于stack exchange,提问作者MStudz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:28:58