VBA Excel 2010 - 删除没有基于另一列的列的最大值的行

时间:2017-09-27 11:00:50

标签: excel vba excel-vba excel-2010

我有一个包含多个列的Excel电子表格,其中两个有ID(重复自己)和日期。

我想要完成的是按ID删除所有行,只留下具有最​​大日期的行。

我有一张包含所有独特IM的第二张。

这就是我现在所拥有的:

Public Sub sbMaxDateByIM()

Dim max As Date
Dim currentIM As String
Dim MaxDateCurrentIM As Date
Dim dateRange As Range
Dim imrange As Range

Application.Sheets("sheet1").Activate


Set dateRange = ActiveSheet.Range(ActiveSheet.Range("E2"), ActiveSheet.Range("E2").End(xlDown))
Set imrange = ActiveSheet.Range(ActiveSheet.Range("A2"), ActiveSheet.Range("A2").End(xlDown))

Application.ScreenUpdating = False
Application.Sheets("UniqueIMS").Activate

    For IM = 1 To ActiveSheet.Range(ActiveSheet.Range("A1"), ActiveSheet.Range("A1").End(xlDown)).Rows.Count

           currentIM = Sheets("UniqueIMS").Cells(IM, 1).Value

            MaxDateCurrentIM = Evaluate("=MAX(IF(""imrange""=""currentIM"",))""dateRange""")

        For J = 2 To Range(Range("E2"), Range("E2").End(xlDown)).Rows.Count + 1

             If currentIM = Sheets("Sheet1").Cells(IM, 1).Value And CDate(Sheets("Sheet1").Cells(J, 5).Value) < MaxDateCurrentIM Then
                Rows(J).EntireRow.Delete
             End If

        Next J
    Next IM

Application.ScreenUpdating = True

End Sub

非常感谢任何ideias,代码行不起作用:

MaxDateCurrentIM = Evaluate("=MAX(IF(""imrange""=""currentIM"",))""dateRange""")

2 个答案:

答案 0 :(得分:1)

你能试试吗?我想你的公式语法是关闭的。 (还有为什么要设置currentIM两次?)另外,删除行时你需要倒退。

Public Sub sbMaxDateByIM()

Dim max As Date
Dim currentIM As String
Dim MaxDateCurrentIM As Date
Dim dateRange As Range
Dim imrange As Range

With Sheets("sheet1")
    Set dateRange = .Range(.Range("E2"), .Range("E2").End(xlDown))
    Set imrange = .Range(.Range("A2"), .Range("A2").End(xlDown))
End With

Application.ScreenUpdating = False
Application.Sheets("UniqueIMS").Activate

For IM = 1 To Range(Range("A1"), Range("A1").End(xlDown)).Rows.Count
    currentIM = Sheets("sheet1").Cells(IM, 1).Value
    MaxDateCurrentIM = Evaluate("=MAX(IF(" & imrange.Address & "=""" & currentIM & """," & dateRange.Address & "))")
    For J = Range(Range("E2"), Range("E2").End(xlDown)).Rows.Count + 1 To 2 Step -1
        If currentIM = Sheets("Sheet1").Cells(IM, 1).Value And CDate(Sheets("Sheet1").Cells(J, 5).Value) < MaxDateCurrentIM Then
            Rows(J).EntireRow.Delete
        End If
    Next J
Next IM

Application.ScreenUpdating = True

End Sub

答案 1 :(得分:0)

Evaluate用于运行Excel函数 - 但Excel不知道什么是imrange和currentim,它们只存在于vba例程中。你需要用excel理解的术语重写你的maxif,或者使用vba代码做与maxif相同的工作