VBA函数中InStr()在If Then语句里始终返回0的问题求助
问题分析与解决方案
问题根源
你写的If InStr(1, "[" & A & "].[" & B & "]", "'" & C & "'") <> 0完全逻辑错误——这里检查的是表和列的名称字符串(比如[table].[name column])里有没有带引号的分隔符(比如','),而不是检查字段实际值里有没有分隔符。这字符串里根本不会有逗号(除非你的表/列名带逗号,但你这里不是),所以InStr永远返回0,分支自然不会执行。
反过来改成=0时,会执行update语句,但update里的InStr([" & A & "].[" & B & "],'" & C & "')是对字段值操作的,那些没有逗号的记录,InStr返回0,Left(..., 0-1)就会把值截断成空,所以所有记录都被改坏了。
正确解决方案
方案1:直接在SQL里处理(最简洁)
不需要VBA的If判断,把update语句改成用IIf处理有分隔符和无分隔符的情况,这样只会修改包含分隔符的记录,不影响其他记录:
Public Function Code(A, B, C) 'From table A, truncates column B at delimiter C Dim sql As String sql = "UPDATE [" & A & "] " & _ "SET [" & B & "] = IIf(InStr([" & B & "], '" & C & "') > 0, " & _ "Left([" & B & "], InStr([" & B & "], '" & C & "') - 1), " & _ "[" & B & "])" DoCmd.RunSQL sql End Function
解释:IIf会判断当前记录的字段值里是否有分隔符,有就截断,没有就保持原数值,一步到位。
方案2:先查询再执行(保留分支判断)
如果想先确认有需要修改的记录再执行update,可以用DCount查询表中包含分隔符的记录数:
Public Function Code(A, B, C) 'From table A, truncates column B at delimiter C Dim hasRecords As Boolean '查询表A中,字段B包含分隔符C的记录数 hasRecords = DCount("*", "[" & A & "]", "InStr([" & B & "], '" & C & "') > 0") > 0 If hasRecords Then DoCmd.RunSQL "UPDATE [" & A & "] " & _ "SET [" & B & "] = Left([" & B & "], InStr([" & B & "], '" & C & "') - 1) " & _ "WHERE InStr([" & B & "], '" & C & "') > 0" End If End Function
这里update语句加了WHERE条件,只修改有分隔符的记录,避免无意义的更新,逻辑更严谨。
额外提示
- 如果分隔符C是带单引号的特殊字符,直接拼接SQL会报错,建议用参数化查询;当前需求是逗号,暂时没问题。
- 用
CurrentDb.Execute sql, dbFailOnError代替DoCmd.RunSQL更安全,不会弹出警告框,还能捕获执行错误。
内容的提问来源于stack exchange,提问作者blupepc
相关产品推荐
相关产品推荐

