目前我正在调试一段代码。目前我的代码按预期工作,它为finaldate变量分配日期,然后在代码中查找删除高于finaldate变量的所有日期。唯一的问题是子程序需要多次运行才能使其生效。例如,当我删除大约一半的日期时,我通过它,再次运行它并且它也一样,我通常F5大约5次以确认它完成。虽然这在调试中很好,但我需要知道每次都能完美运行。
Sub Remove_Unecessary_Data_1()
Dim ALLCs As Worksheet
Dim DS As Worksheet
Dim finaldate As Date
Set DS = Sheets("Data Summary")
Set ALLCs = Sheets("Asset LLC (Input)")
ALLCs.Select
For y = 1 To 40
If InStr(1, Cells(13, y), "Timestamp of Execution") Then
finaldate = ALLCs.Cells(50, y)
End If
Next
ALLCs.Select
For u = 1 To 40
If InStr(1, Cells(13, u), "Start Date") Then
For p = 2 To 69584
If Cells(p + 14, u) > finaldate Then
Cells(p + 14, u).EntireRow.Delete
End If
Next
End If
Next
end sub
编辑:示例数据
细胞(50,y)= 1/12/15 finaldate = Cells(50,Y)
标题为“开始日期”的列包含的日期范围为2015年5月1日至2015年1月30日。
如果正常工作,2015年1月12日之后的所有日期都应该消除整行。
答案 0 :(得分:6)
删除行时,您必须自下而上工作,否则最终会跳过行。
例如,您有:
Line 1
>Line 2
Line 3
Line 4
当您的代码删除时,Line 2
," Row" 3现在变为" Row" 2,但您的代码继续前进以查看Line 4
。您的数据现在如下所示:
Line 1
Line 3
>Line 4
如果更改代码的这一部分:
For p = 2 To 69584
If Cells(p + 14, u) > finaldate Then
Cells(p + 14, u).EntireRow.Delete
End If
Next
到此:
For p = 69598 to 16 step - 1
If Cells(p, u) > finaldate Then
Cells(p, u).EntireRow.Delete
End If
Next
一切都应该没问题。
*注意:我调整了你的开始&结束点数增加了14,并从+ 14
引用中删除了Cells()
。在那里做额外的数学没有任何意义......
答案 1 :(得分:2)
使用以下方法删除行时
Cells(p + 14, u).EntireRow.Delete
已删除行下方的行向上移动以占据该空间。如果该行包含应删除的日期,则会被忽略,因为计数器会自动移动到下一行。例如,假设我们希望删除C
列中D
或Data
的所有行:
Row Number Data
1 A
2 B
3 C
4 D
5 E
变为:
Row Number Data
1 A
2 B
3 D
4 E
行计数器移至4而不检查3中的新值,因此D
不会被删除。
您可以将If...Then
语句更改为Do...While
循环来解决此问题:
Sub Remove_Unecessary_Data_1()
Dim ALLCs As Worksheet
Dim DS As Worksheet
Dim finaldate As Date
Set DS = Sheets("Data Summary")
Set ALLCs = Sheets("Asset LLC (Input)")
ALLCs.Select
For y = 1 To 40
If InStr(1, Cells(13, y), "Timestamp of Execution") Then
finaldate = ALLCs.Cells(50, y)
End If
Next
ALLCs.Select
For u = 1 To 40
If InStr(1, Cells(13, u), "Start Date") Then
For p = 2 To 69584
Do While (Cells(p + 14, u) > finaldate)
Cells(p + 14, u).EntireRow.Delete
Loop
Next
End If
Next
End sub
这应该在删除前一行后继续检查该单元格,以确保不应删除替换行。
答案 2 :(得分:2)
你在越来越多的行号中删除一行这一事实,你将错过分析刚刚删除的行之后的每一行,因为它(行(i + 1))已成为行(i)但是你随着下一个增加了。
这是你的代码考虑到这一点(并摆脱了无用的Select
)
Sub Remove_Unecessary_Data_1()
Dim ALLCs As Worksheet, _
DS As Worksheet, _
FinalDate As Date
Set DS = Sheets("Data Summary")
Set ALLCs = Sheets("Asset LLC (Input)")
For y = 1 To 40
If InStr(1, ALLCs.Cells(13, y), "Timestamp of Execution") Then
FinalDate = ALLCs.Cells(50, y)
End If
Next
For u = 1 To 40
If InStr(1, ALLCs.Cells(13, u), "Start Date") Then
For p = 69584 To 2 Step -1
If Cells(p + 14, u) > FinalDate Then
Cells(p + 14, u).EntireRow.Delete
End If
Next
End If
Next
End Sub