Access VBA编写SQL拼接字段触发Type Mismatch类型不匹配错误求助
错误根因
- 字符串边界识别错误:你在VBA中定义SQL字符串时,SQL语句内部用于包裹
-的双引号被VBA识别为整个sRowsource字符串的结束符,后续的-被判定为数值减运算符,尝试对前后的字符串内容执行减法运算,直接触发类型不匹配错误。 - 隐式取值风险(可选排查项):若lstReasons为列表框控件,直接写
Select Case lstReasons属于隐式取控件的默认属性,若控件绑定列数据类型非数值,也可能触发类型不匹配,可显式指定取值属性确认。
修复代码
两种兼容写法可选,均可正常在Access中运行:
写法1:SQL内部用单引号(更简洁,推荐)
Private Sub EnableRowsource() Dim sRowsource As String Select Case lstReasons.Value ' 显式指定Value属性,避免隐式取值异常 Case 13 sRowsource = "SELECT NRType, NRReason, (NRType & ' - ' & NRReason) As Concat FROM TBLnonroutine WHERE NRProcess='Bene' ORDER BY NRReason asc" cboNRReason1.RowSource = sRowsource cboNRReason2.RowSource = sRowsource cboNRReason3.RowSource = sRowsource End Select End Sub
写法2:用双引号转义(VBA字符串内双引号用两个连续双引号表示转义)
Private Sub EnableRowsource() Dim sRowsource As String Select Case lstReasons.Value Case 13 sRowsource = "SELECT NRType, NRReason, (NRType & "" - "" & NRReason) As Concat FROM TBLnonroutine WHERE NRProcess='Bene' ORDER BY NRReason asc" cboNRReason1.RowSource = sRowsource cboNRReason2.RowSource = sRowsource cboNRReason3.RowSource = sRowsource End Select End Sub
修复说明
- Access JET SQL支持单引号作为字符串常量的边界符,优先用单引号写SQL内部的字符串,可以避免和VBA的双引号字符串边界冲突,减少转义错误概率。
- 显式指定控件的Value属性取值,避免控件默认属性变更带来的隐式类型错误。
内容的提问来源于stack exchange,提问作者user16800302
相关产品推荐
相关产品推荐

