在VBA中删除不在1910年至2015年之间的值

时间:2015-07-01 14:31:24

标签: vba excel-vba excel

这是我的代码应该执行标题所说的内容(来自第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

2 个答案:

答案 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语句中执行一个操作,那么单行快捷方式证明非常好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