这是我的代码应该执行标题所说的内容(来自第3行),但它不起作用。有人为什么不工作?列中的数字格式为文本。感谢
Dim i As Long
For i = 3 To lastRow
If Not (wsFinal.Cells(i, "Q").Value <= 2015 Or wsFinal.Cells(i, "Q").Value >= 1910) Then
With wsFinal
.Cells(i, "Q").ClearContents
End With
End If
Next i
Dim j As Long
For j = 3 To lastRow
If Not (wsFinal.Cells(j, "R").Value <= 2015 Or wsFinal.Cells(j, "R").Value >= 1910) Then
With wsFinal
.Cells(j, "R").ClearContents
End With
End If
Next j
答案 0 :(得分:1)
你的逻辑错了。
(wsFinal.Cells(i, "Q").Value <= 2015 Or wsFinal.Cells(i, "Q").Value >= 1910)
1909返回True
,1910返回True
。您需要将Or
更改为And
。
答案 1 :(得分:0)
您可能想要修复逻辑,以便更清楚一些。您可以创建一个真值表来确定值是否会进入if语句。
<=2015 >=1910 OR Not
1900 TRUE FALSE TRUE FALSE
2000 TRUE TRUE TRUE FALSE
2100 FALSE TRUE TRUE FALSE
<=2015 >=1910 AND Not
1900 TRUE FALSE FALSE TRUE
2000 TRUE TRUE TRUE FALSE
2100 FALSE TRUE FALSE TRUE
作为一种个人风格,如果值超出范围(如下所示),我更喜欢这样做,然后执行操作而不是使用Not
关键字,并可能在阅读时添加混淆。
>2015 <1910 OR
1900 FALSE TRUE TRUE
2000 FALSE FALSE FALSE
2100 TRUE FALSE TRUE
保持代码更容易调试的其他个人建议:
with
声明中只有一行,则请勿使用with
。 if <cond> then <action>
即使将列格式化为文本,下面的代码也适用于我。
Dim wsFinal As Worksheet, LastRow As Integer
Set wsFinal = ActiveSheet
LastRow = wsFinal.UsedRange.Rows.count
For i = 3 To LastRow
If (wsFinal.Cells(i, "Q").value > 2015 Or wsFinal.Cells(i, "Q").value < 1910) Then wsFinal.Cells(i, "Q").ClearContents
If (wsFinal.Cells(i, "R").value > 2015 Or wsFinal.Cells(i, "R").value < 1910) Then wsFinal.Cells(i, "R").ClearContents
Next i