VBA Excel 2010-删除另一列中不带列最大值的行

VBA Excel 2010-删除另一列中不带列最大值的行,vba,excel,excel-2010,Vba,Excel,Excel 2010,我有一个excel电子表格,有几列,其中两列有一个重复的ID和一个日期 我试图完成的是按ID删除所有行,只留下最长日期的行 我有第二张纸,上面有所有独特的即时通讯 这就是我目前的情况: Public Sub sbMaxDateByIM() Dim max As Date Dim currentIM As String Dim MaxDateCurrentIM As Date Dim dateRange As Range Dim imrange As Range Application.She

我有一个excel电子表格,有几列,其中两列有一个重复的ID和一个日期

我试图完成的是按ID删除所有行,只留下最长日期的行

我有第二张纸,上面有所有独特的即时通讯

这就是我目前的情况:

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

你能试试这个吗?我想你的公式语法错了。为什么要设置两次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

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

这可以在没有vba的情况下分3步完成。如果你有兴趣,请告诉我。同样的3个步骤也可以用代码编写,它可能比这里的工作效率更高、速度更快。同样,如果你感兴趣,我可以在回答中解释。嗨,斯科特,谢谢你的评论,我相信所有的例子都有助于解决这种情况,如果你能提供一个答案,那就太好了。非常感谢你的支持。我只有一个额外的问题。变量MaxDateCurrentIM当前为Date类型,这会引发类型不匹配的错误。如果它被定义为字符串,并且如果我将它定义为范围,它会给出一个对象变量的错误,或者块变量没有设置任何ideias为什么?当它出错时,MaxDateCurrentIM的值是什么?在尝试设置MaxDateCurrentIM中的值时会出现错误:MaxDateCurrentIM=Evaluate=MAXIF&imrange.Address&=¤tIM&,&dateRange.Address&&&OK,但您认为该值应该是什么?您检查过了吗?可能存在错误值?在本例中,对于IM IM1131366,该值应为12-09-2017 08:21:02,如果我在表格中的一个单元格中应用公式,则该公式返回的值。
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