我正在创建一个循环,该循环应该查找日期在01/01/2019之前的单元格,如果找到,则删除整行。
问题是,如果它们按示例第2行删除,则代码将传递到第3行,但是由于先前删除了第2行,因此将跳过原始第3行。
我编写了循环,并尝试添加“ i = 1-1”,但是excel从未停止运行代码并阻止程序
Dim ws As Worksheet
Dim Ldate As Date
Dim N As Long
Ldate = "01/01/2019"
N = ws.Cells(Rows.Count, 8).End(xlUp).Offset(0, 0).Row
For i = 1 To N
If ws.Cells(i, 8).Value < Ldate Then
ws.Rows(i).Delete
' i = 1 - 1
End If
Next i
答案 0 :(得分:2)
不要让Excel猜测此字符串"01/01/2019"
是mm/dd/yyyy
还是dd/mm/yyyy
切勿使用字符串写日期,而应始终使用实际日期:{{1} }创建日期。字符串日期非常邪恶!将真实日期转换为字符串的唯一用例是将其打印在纸张或屏幕上。所有其他情况必须使用真实日期(数字格式)才能可靠。
Ldate = DateSerial(2019, 1, 1)
很无用,请将其删除。从当前单元格移动0行和0列根本不会更改当前单元格。
如果删除/添加行,则循环必须向后才能正确计数:.Offset(0, 0)
所以您最终得到的是这样
For iRow = LastRow To 1 Step - 1
或者,如果您使用正向循环,则需要收集要删除的行到Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim Ldate As Date
Ldate = DateSerial(2019, 1, 1)
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, 8).End(xlUp).Row
Dim iRow As Long
For iRow = LastRow To 1 Step - 1
If ws.Cells(iRow , 8).Value < Ldate Then
ws.Rows(iRow).Delete
End If
Next iRow
变量中,并在循环结束后立即将其删除。这种删除方式不会影响循环内的行计数(因为我们在循环后删除):
Range
实际上,这种方法应该更快,因为它最后只执行一个删除操作(而不是每个删除的行执行一个删除操作)。
根据评论进行编辑:
在使用工作表之前测试它是否存在。
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim Ldate As Date
Ldate = DateSerial(2019, 1, 1)
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, 8).End(xlUp).Row
Dim RowsToDelete As Range
Dim iRow As Long
For iRow = 1 To LastRow
If ws.Cells(iRow , 8).Value < Ldate Then
If RowsToDelete Is Nothing Then
Set RowsToDelete = ws.Rows(iRow)
Else
Set RowsToDelete = Union(RowsToDelete, ws.Rows(iRow))
End If
End If
Next iRow
If Not RowsToDelete Is Nothing Then
RowsToDelete.Delete
End If
然后像
一样使用它Option Explicit
Function WorksheetExists(ByVal WorksheetName As String, Optional ByVal InWorkbook As Workbook) As Boolean
'default workbook is ThisWorkbook
If InWorkbook Is Nothing Then
Set InWorkbook = ThisWorkbook
End If
Dim ws As Worksheet
On Error Resume Next
Set ws = InWorkbook.Worksheets(WorksheetName)
On Error GoTo 0
WorksheetExists = Not ws Is Nothing
End Function
答案 1 :(得分:1)
最简单的方法就是更改
For i = 1 To N
到
For i = N To 1 step -1
这样,当您删除行时,它不会更改以下行的数目,因为这些行将是编号较低的行。