VBA中If语句触发类型不匹配错误的原因排查求助
问题:VBA If语句抛出类型不匹配错误
编写VBA函数时,If语句持续抛出类型不匹配错误,相关代码如下:
Dim conn As ADODB.Connection Set conn = New ADODB.Connection With conn .ConnectionString = "DRIVER={SQL Server};SERVER=SERVER;DATABASE=DB;Trust_Connection=yes;" ' connection to server End With conn.Open Dim year_goal As ADODB.Recordset sls_rep_wb.Worksheets(yy & " MO-MO").Activate Set year_goal = conn.Execute("SOME SQL QUERY THAT RETURNS A SUM NUMERIC") If IsEmpty(Range("AY3")) & year_goal.RecordCount > 0 Then ' this line throws the error Range("AY3:" & Range("AY3").Offset(0, 12).Address).Value = (year_goal!Sum) / 12 End If最初遇到的错误是循环返回的year_goal记录集为空,因此添加了记录计数判断,尝试过用BOF和EOF检查空记录集,但仍报错,即使记录集非空也会出错。
解决方案
核心错误:逻辑运算符使用错误
你在If语句里误用了&(字符串连接符),而非逻辑与运算符And。IsEmpty(Range("AY3"))和year_goal.RecordCount > 0都返回布尔值,用&会尝试将两个布尔值转为字符串拼接,再与0比较,必然触发类型不匹配。正确写法:If IsEmpty(Range("AY3")) And year_goal.RecordCount > 0 Then更可靠的空记录集判断方式
ADODB.Recordset的RecordCount属性在部分游标类型下(比如默认的仅向前游标)可能返回-1,无法准确判断记录集是否为空。更稳妥的方式是结合BOF和EOF属性:If IsEmpty(Range("AY3")) And Not (year_goal.BOF And year_goal.EOF) Then当
BOF与EOF同时为True时,说明记录集无数据。额外优化建议
- 避免使用
Activate,直接引用工作表对象,减少环境依赖:Dim ws As Worksheet Set ws = sls_rep_wb.Worksheets(yy & " MO-MO") ' 后续操作统一使用ws.Range代替Range If IsEmpty(ws.Range("AY3")) And Not (year_goal.BOF And year_goal.EOF) Then ws.Range("AY3:" & ws.Range("AY3").Offset(0, 12).Address).Value = (year_goal!Sum) / 12 End If - 数据库操作完成后,及时关闭记录集和连接,释放资源:
year_goal.Close conn.Close Set year_goal = Nothing Set conn = Nothing
- 避免使用
内容的提问来源于stack exchange,提问作者Chenese Gray
相关产品推荐
相关产品推荐

