VBA中If语句结合And与Not函数的用法及代码问题排查
分析你的VBA代码问题及修复方案
首先,你的代码存在两个关键问题,导致无法达到预期效果:
多单元格Range的比较逻辑错误:
Range("'Cost Sheet'!D87", "'Cost Sheet'!D88") > 0这种写法不能正确判断D87和D88是否都大于0。当你用包含多个单元格的Range直接和数值比较时,VBA不会逐个检查单元格值,而是返回一个数组,这样的条件判断结果完全不符合你的需求(你需要的是两个单元格都满足大于0的条件)。工作表对象未明确指定:你的
Range("B97")和Range("B98")没有绑定到Cost Sheet工作表,如果当前激活的不是目标工作表,代码会错误操作其他表的单元格;同时Not Range("B97") = " • BBQ"的写法不够严谨,建议用<>直接表示不等于,同时明确引用单元格的.Value属性(虽然VBA会默认读取Value,但明确写出更清晰易懂)。
修复后的代码
With ThisWorkbook.Worksheets("Cost Sheet") ' 判断D87和D88都大于0,且B97不等于指定文本 If .Range("D87").Value > 0 And .Range("D88").Value > 0 And .Range("B97").Value <> " • BBQ" Then .Range("B98").Value = " • BBQ" End If End With
额外说明
- 用
With语句可以简化代码,同时确保所有Range操作都严格指向Cost Sheet工作表,避免因激活其他工作表导致的错误。 - 如果你的需求是D87或D88其中任意一个大于0,只需把判断里的
And改成Or即可:
With ThisWorkbook.Worksheets("Cost Sheet") If (.Range("D87").Value > 0 Or .Range("D88").Value > 0) And .Range("B97").Value <> " • BBQ" Then .Range("B98").Value = " • BBQ" End If End With
内容的提问来源于stack exchange,提问作者xVias
相关产品推荐
相关产品推荐

