宏 - 根据日期删除行

时间:2014-07-30 09:18:59

标签: excel vba excel-vba

我是Excel中的VBA和宏的新手。我有一个非常大的Excel电子表格,其中A列包含日期。我试图删除值小于特定日期的行,这是我到现在为止所提出的......

Sub DELETEDATE()
Dim x As Long
For x = 1 To Cells.SpecialCells(xlCellTypeLastCell).Row
Debug.Print Cells(x, "A").Value
If CDate(Cells(x, "A")) < CDate("01/01/2013") Then
Cells(i, "A").EntireRow.Delete
End If
Next x
Next i
End Sub

我收到一个没有错误的下一个...有人可以帮忙吗?

4 个答案:

答案 0 :(得分:5)

这非常适合使用.AutoFilter的{​​{1}}属性。下面的脚本包含每个步骤的注释:

Range

在一个简单的示例(在此图片中的“Sheet1”上)运行此代码,如下所示:

start

将删除日期早于1/1/2013的所有行,并为您提供以下结果:

end

答案 1 :(得分:1)

回答你的问题

  

我收到一个没有错误的下一个

问题是你试图循环i,但你还没有打开For i循环。当您将代码缩进到调用Loop或条件(即If)的任何代码下方时,它就变得明显了

Sub DELETEDATE()
Dim x As Long
    For x = 1 To Cells.SpecialCells(xlCellTypeLastCell).Row
        Debug.Print Cells(x, "A").Value
        If CDate(Cells(x, "A")) < CDate("01/01/2013") Then
            Cells(i, "A").EntireRow.Delete 'i has no value so Cells(0, "A") is ??
        End If
    Next x
    Next i 'where is the For i = ... in this code?
End Sub

编写代码时,我尝试:

  • 如果需要,立即输入结束命令。所以输入If...Then,点击[ENTER],输入End If,点击[HOME],点击[ENTER],点击[UP ARROW]然后点[TAB]到正确的地方写条件代码,以便任何人都能够轻松阅读和理解它。
  • 始终在每个模块的顶部使用Option Explicit来强制变量声明。

关于根据条件删除行的提示 如果从顶部开始向下工作,每次删除一行时,计数器将有效地移动到您删除的行下面两行的单元格,因为紧接删除行下方的行向上移动(即根本没有测试) 。

最有效的方法是从底部或行循环:

Sub DELETEDATE()
Dim x As Long
    For x = [a1].SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
        Debug.Print Cells(x, "A").Value
        If CDate(Cells(x, "A")) < CDate("01/01/2013") Then
            Cells(x, "A").EntireRow.Delete 'changed i to x
        End If
    Next x
End Sub

这样,您要测试的下一行已被保留 - 您只是将下面的行向上移动了1,并且您之前已经测试过该行。

答案 2 :(得分:0)

请尝试使用此

Sub DELETEDATE()
Dim x As Long
last = Range("A65536").End(xlUp).Row
For x = 1 To last
    Debug.Print Cells(x, "A").Value
    check:
    If x <= last Then
        If Trim(CDate(Cells(x, "A"))) <= Trim(CDate("7/29/2013")) Then
            last = last - 1
            Cells(x, "A").EntireRow.Delete
            GoTo check
        End If
    End If
Next x
End Sub

答案 3 :(得分:-1)

您的代码中出于某种原因还有一个Next i由调试器突出显示。试试以下内容:

Sub DELETEDATE()
Dim x As Long
For x = 1 To Cells.SpecialCells(xlCellTypeLastCell).Row
Debug.Print Cells(x, "A").Value
If CDate(Cells(x, "A")) < CDate("01/01/2013") Then
Cells(i, "A").EntireRow.Delete
End If
Next x
End Sub