我是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
我收到一个没有错误的下一个...有人可以帮忙吗?
答案 0 :(得分:5)
这非常适合使用.AutoFilter
的{{1}}属性。下面的脚本包含每个步骤的注释:
Range
在一个简单的示例(在此图片中的“Sheet1”上)运行此代码,如下所示:
将删除日期早于1/1/2013的所有行,并为您提供以下结果:
答案 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