You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA If Not Or语句逻辑异常排查:MonCol=13时未按预期执行

问题分析与解决方案

你的问题出在逻辑表达式的错误组合上,导致条件判断完全不符合预期。咱们一步步拆解:

原逻辑的问题

你想要的是“仅当MonCol不等于12、13或14时执行删除操作”,但你写的条件:

If Not MonCol = 12 Or Not MonCol = 13 Or Not MonCol = 14 Then

这个表达式永远为True,不管MonCol是什么值。原因是逻辑运算的等价转换——根据德摩根定律:

  • 正确的“不等于12且不等于13且不等于14”,用Not包裹的话应该是 Not (MonCol = 12 Or MonCol = 13 Or MonCol = 14)
  • 而你写成了Not MonCol=12 Or Not MonCol=13 Or Not MonCol=14,这个逻辑的意思是“只要不同时等于12、13、14就成立”——但一个整数不可能同时等于这三个数,所以这个条件永远成立,自然会执行删除操作。

举个例子,当MonCol=13时:

  • Not MonCol=12 是True,整个Or表达式只要有一个True就会返回True,所以条件成立,代码执行删除。

修正后的代码

你可以选择两种写法,效果完全一致:

写法1:直接用不等号和逻辑与(更直观)

With NewPayWS
    If MonCol <> 12 And MonCol <> 13 And MonCol <> 14 Then
        .Range(.Cells(1, lastcol - 1), .Cells(1, MonCol + 1)).EntireColumn.Delete
        .Range(.Cells(1, DataType + 1), .Cells(1, MonCol - 4)).EntireColumn.Delete
    End If
    ' 后续代码...
End With

写法2:用Not包裹括号内的逻辑或(符合德摩根定律)

With NewPayWS
    If Not (MonCol = 12 Or MonCol = 13 Or MonCol = 14) Then
        .Range(.Cells(1, lastcol - 1), .Cells(1, MonCol + 1)).EntireColumn.Delete
        .Range(.Cells(1, DataType + 1), .Cells(1, MonCol - 4)).EntireColumn.Delete
    End If
    ' 后续代码...
End With

现在当MonCol=13时,条件会返回False,代码会直接跳到End If,不会执行删除操作,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Rafael Osipov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:12:04