VBA Excel 2010-删除另一列中不带列最大值的行
我有一个excel电子表格,有几列,其中两列有一个重复的ID和一个日期 我试图完成的是按ID删除所有行,只留下最长日期的行 我有第二张纸,上面有所有独特的即时通讯 这就是我目前的情况: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
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