查找符合条件的最新值

时间:2015-05-21 14:51:17

标签: excel vba date excel-vba maxdate

在Sheet2中

C列(计划ID)可以有多个记录

列K(状态)可以是“已批准”或“已拒绝”

L栏(状态日期)

我正在尝试创建一个VBA宏来查看Sheet2中的数据,以查找每个计划ID的最新“已批准”状态,并将整行数据放入Sheet3。

我基本上想要删除重复项,但是,抓住最后批准的计划。我认为一些Max Date功能会有所帮助,但我以前从未使用它。

2 个答案:

答案 0 :(得分:0)

修改:已更新以满足新要求。

正如我在评论中所说,你可以做这样的事情。

它不是世界上最漂亮/最快的代码,但它可以完成任务:

Sub GetMostRecentApproved()

Application.ScreenUpdating = False
Dim OutputSheet, x, OtherID
OutputSheet = "Sheet3"

'Clear the OutputSheet
Sheets(OutputSheet).Cells.ClearContents

'Copy our data to the output sheet
Sheets("Sheet2").UsedRange.Copy Sheets(OutputSheet).Range("A1")

'Sort by Plan ID, Status, Status Date (Oldest to Newest)
ActiveWorkbook.Worksheets(OutputSheet).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(OutputSheet).Sort.SortFields.Add Key:=Range("C:C"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets(OutputSheet).Sort.SortFields.Add Key:=Range("K:K"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets(OutputSheet).Sort.SortFields.Add Key:=Range("L:L"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(OutputSheet).Sort
    .SetRange Sheets(OutputSheet).UsedRange
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

'x = 2 assumes we have headers
'This pass deletes all non-unique rejected rows
With Sheets(OutputSheet)
    For x = 2 To .UsedRange.Rows.Count
        If UCase(.Range("K" & x)) = "REJECTED" Then
            Set OtherID = Union(.Range("C2:C" & x - 1), .Range("C" & x + 1 & ":C" & .UsedRange.Rows.Count))
            If Not OtherID.Find(.Range("C" & x).Value, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
                .Range("K" & x).EntireRow.Delete
                x = x - 1
            End If
        End If
    Next x

    For x = 2 To .UsedRange.Rows.Count
        If .Range("C" & x) = vbNullString Then Exit Sub
        If .Range("C" & x + 1) = .Range("C" & x) Then
            .Range("C" & x).EntireRow.Delete
            x = x - 1 'careful with that iterator eugene
        End If
    Next x
End With
Application.ScreenUpdating = True

End Sub

Sheet2输入:

Input

Sheet3输出:

Output

答案 1 :(得分:0)

@ user1274820与他的评论在正确的轨道上,但我认为你可以让自己更轻松。
一种简单的方法(无需编写宏)将是:

  • 复制Sheet2
  • 按计划ID排序>状态(A至Z)>状态日期(最新到最旧)
  • 数据>删除重复项(仅保留计划ID)