【问题标题】:Delete entire row based on date -excel VBA根据日期删除整行-excel VBA
【发布时间】:2018-02-09 22:50:53
【问题描述】:

我正在尝试删除 A 列值(其格式为日期)小于今天日期的所有行。我必须通过整个非空 A 列运行这些。但面临代码在整个行中循环运行的问题。每次它只删除 1 行。请让我知道如何在整个行集中运行它。

Sub DeleteRowBasedOnDateRange()

Dim spem As Workbook
Dim ws As Worksheet
Dim N As Long, I As Long

Set spem = Excel.Workbooks("SwitchP.xlsm")
Set ws = spem.Worksheets("data")

N = ws.Cells(Rows.count, "A").End(xlUp).row

For I = 2 To N

    If Cells(I, "A").Value < Date Then

    Cells(I, "A").EntireRow.Delete

I = I + 1

    End If

Next I

End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    快速修复

    向后循环。

    您也不需要 I=I+1,因为它是自动完成的。

    Sub DeleteRowBasedOnDateRange()
    
    Dim spem As Workbook
    Dim ws As Worksheet
    Dim N As Long, I As Long
    
    Set spem = Excel.Workbooks("SwitchP.xlsm")
    Set ws = spem.Worksheets("data")
    
    N = ws.Cells(ws.Rows.count, "A").End(xlUp).row
    
    For I = N to 2 Step -1    
        If ws.Cells(I, "A").Value < Date Then    
            ws.Rows(I).Delete
        End If    
    Next I
    
    End Sub
    

    【讨论】:

    • @K.Dᴀᴠɪs 是的,至于我应该采取的良好措施,我会改变,但这真的重要吗?仅当活动工作簿是 .xslx 并且运行代码的工作簿是 .xls 时才有意义。所以我通常不包括它。因为我只使用 .xlsx 并且因为它返回的是一个数字而不是一个实际的单元格引用,所以它拉那个数字的工作表并不重要。
    • 我不确定。我认为Rows.Count 将计算活动表,而 ws.Cells() 将引用 ws。我想我从来没有测试过它,我无法真正确认任何一种方式。
    • @K.Dᴀᴠɪs 它正在计算活动表并返回一个数字,该数字不带有父表,它只是一个数字。只要运行此代码的工作簿(在这种情况下我们知道它是 .xlsm)晚于 2007 年,那么从哪个工作表检索 Rows.Count 并不重要,因为它们都是相同,或者,如果它是从 2007 年或之前获得的,则更少。在这种情况下和大多数情况下,这无关紧要。不过,这是一个很好的做法,因为未来的查看器可能在 2007 年仍在工作。就我自己而言,我放弃了它,因为不需要重复输入。
    • 没错 - 我刚刚重新意识到 Rows.Count 正在计算工作表的总行数,无论是使用 1 行还是全部 1,048,576。我们可以直接输入ws.Cells(1,048,576, "A")。有那么一刻,我觉得那句话有不同的目的。是时候喝更多咖啡了! :-)。谢谢你让我直截了当。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多