我运行着一个绩效数据库,并且陷入了跟踪重复犯规者的困境。
在结果表中包含所有数据,我想创建一个遍历结果的宏,将C列过滤到每个人员编号,并计算D列中“失败”结果的次数。
如果他们的计数为2或以上,我希望工作表将其名称在B列中复制,并将工作人员编号在c列中复制到另一张名为“ Flagged”的工作表中的第一行,并在第三列中将失败计数
我的数据从b8行到b10008行,我有300名可以接受评估的员工
谢谢!
答案 0 :(得分:0)
我建议使用数组并以这种方式循环数据,它应该几乎是即时的(与工作表本身中的循环相比)。
请记住,这还没有经过充分测试,但是它应该使您非常接近要达到的目标:
Sub flagged()
Dim arrData As Variant, arrFails As Variant
Dim failCnt As Long, i As Long, j As Long, x As Long, lastRow As Long
Dim shResults As Worksheet, shFails As Worksheet
Set shResults = ActiveWorkbook.Sheets("Results")
Set shFlagged = ActiveWorkbook.Sheets("Flagged")
ReDim arrFails(0 To 300, 0 To 2)
arrData = shResults.Range("B8:D10008").Value
For i = LBound(arrData) To UBound(arrData)
For j = LBound(arrData) To UBound(arrData)
If arrData(i, 2) = arrData(j, 2) Then
If arrData(i, 3) = "FAIL" Then
failCnt = failCnt + 1
End If
If failCnt >= 2 Then
arrFails(x, 0) = arrData(i, 1)
arrFails(x, 1) = arrData(i, 2)
arrFails(x, 2) = failCnt
x = x + 1
End If
End If
Next j
failCnt = 0
Next i
For i = LBound(arrFails) To UBound(arrFails)
If arrFails(i, 0) <> "" Then
lastRow = shFlagged.Cells(1, j).End(xlDown).Row
For j = 1 To 3
shFlagged.Cells(lastRow + 1, j) = arrFails(i, j)
Next j
End If
Next i
End Sub
编辑:更改了尺寸大小,以容纳3列。另外,我最初是这样做的,目的是按人员编号查找排序的数据,但是由于数据量不大,没关系,所以我相应地编辑了代码。
答案 1 :(得分:0)
将源数据设置为表( Ctrl + T ,单元格处于选定范围内)。添加带有公式的帮助列:
=SUMPRODUCT(--([Fail/Pass]="FAIL"),--([Staff No]=[@[Staff No]]))>=2=SUMPRODUCT(--(D:D="FAIL"),--(C:C=[@[Staff No]]))>=2
使用紧凑的报表布局创建您的数据透视表 Alt + N + V ,并将您的帮助器列添加到页面字段并过滤在True
上。将name
和staff No
添加到行字段并删除小计。
由于它是Excel表,因此您可以添加更多行,并且公式将自动填充。然后,您只需刷新数据透视表即可更新已标记的列表。
数据:
字段:
紧凑的设计布局,没有小计。