在Sheet2中
C列(计划ID)可以有多个记录
列K(状态)可以是“已批准”或“已拒绝”
L栏(状态日期)
我正在尝试创建一个VBA宏来查看Sheet2中的数据,以查找每个计划ID的最新“已批准”状态,并将整行数据放入Sheet3。
我基本上想要删除重复项,但是,抓住最后批准的计划。我认为一些Max Date功能会有所帮助,但我以前从未使用它。
答案 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输入:
Sheet3输出:
答案 1 :(得分:0)
@ user1274820与他的评论在正确的轨道上,但我认为你可以让自己更轻松。
一种简单的方法(无需编写宏)将是: