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
相关产品推荐
相关产品推荐

