VBA调用MS Access SELECT查询无法取值,下标越界问题求助
VBA拼接SQL后执行报错:下标越界(错误9)
使用VBA从MS Access表读取数据时,拼接SQL语句后执行触发「下标越界」错误,但直接写死SQL语句却能正常运行。
原代码
KKS = "11LAB10" id& = SQLOpen("DSN=MJC_Experiencia;DBQ=c:\equipamentos.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;",,3) query_SQL = "SELECT * FROM my_table WHERE kks=" & Chr(39) & KKS & Chr(39) msgbox query_SQL qry& = SQLExecQuery(id&,querySQL) i% = SQLBind(id&, b, 3) i% = SQLBind(id&, b, 1) i% = SQLBind(id&, b, 2) i% = SQLBind(id&, b, 4) l& = SQLRetrieve(id&, c) msgbox "KKS = " & c(0,0)
执行情况
- 第一个
msgbox显示的SQL语句(注:描述中的"为HTML转义字符,实际显示如下):
SELECT * FROM my_table WHERE kks='11LAB10'
- 执行报错:
9 - Subscript out of range
(错误指向代码中的c(0,0))
- 硬编码SQL语句则正常运行:
query_SQL = "SELECT * FROM my_table WHERE kks='11LAB10'"
问题原因及解决办法
核心问题是变量名拼写错误:
- 拼接SQL时使用的变量是
query_SQL(包含下划线),但调用SQLExecQuery时传入的是querySQL(无下划线)。 - 未赋值的
querySQL会被当作无效SQL执行,导致查询无返回数据,后续SQLRetrieve得到的数组c为空,访问c(0,0)自然触发「下标越界」错误。
解决办法:将SQLExecQuery的参数修改为query_SQL,保持变量名一致即可:
qry& = SQLExecQuery(id&, query_SQL)
另外说明:你使用Chr(39)拼接单引号包裹字符串值的SQL写法是正确的,不存在语法问题。
内容的提问来源于stack exchange,提问作者Mario Cordeiro
相关产品推荐
相关产品推荐

