一段代码仅在多次运行时按预期工作

时间:2015-04-17 14:13:45

标签: excel vba date excel-vba debugging

目前我正在调试一段代码。目前我的代码按预期工作,它为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日之后的所有日期都应该消除整行。

3 个答案:

答案 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列中DData的所有行:

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