【问题标题】:Count duplicates and copy results计算重复项并复制结果
【发布时间】:2019-01-03 16:04:44
【问题描述】:

我运行了一个绩效数据库,但一直被困在追踪屡犯者的方法上。

结果表中包含所有数据,我想创建一个遍历结果的宏,将 C 列过滤到每个员工编号,并计算他们在 D 列中有多少次“失败”结果。

如果他们的计数为 2 或以上,我希望工作表将 B 列中的姓名和 c 列中的人员编号复制到名为“已标记”的不同工作表中的第一个可用行,失败计数位于第 3 列.

我的数据从 b8 行到 b10008 行,我有 300 名员工可以接受评估

提前致谢!

【问题讨论】:

  • 不能使用可枢转的工作吗?
  • 可能,但我也停止了该选项!
  • 我会尽量记得早上看看。

标签: excel vba count duplicates


【解决方案1】:

将源数据设置为表格(Ctrl+T 选择范围内的单元格)。使用公式添加辅助列:

=SUMPRODUCT(--([Fail/Pass]="FAIL"),--([Staff No]=[@[Staff No]]))>=2=SUMPRODUCT(--(D:D="FAIL"),--(C:C=[@[Staff No]]))>=2

使用紧凑的报表布局创建您的数据透视表,Alt+N+V,并将您的帮助列添加到页面字段和过滤器在True。将namestaff No 添加到行字段并删除小计。

由于它是 Excel 表格,您可以添加更多行,公式将自动填充。然后,您只需刷新数据透视表即可更新您的标记列表。

数据:


字段:

紧凑的设计布局,没有小计。

【讨论】:

  • 嗨,QHarr,这看起来像我需要的...你能帮我看看你的数据透视表设置的屏幕截图吗?它们是我擅长的弱点之一,无论我怎么玩,我都无法让它看起来像你的!
  • 现在为您添加。
  • 非常感谢,简单但就像煮饭一样我无法征服它。
  • 煮饭很简单!我应该发个帖子!
【解决方案2】:

我建议使用数组并以这种方式循环您的数据,它应该几乎是即时的(与在工作表本身中循环相比)。

请记住,这还没有经过全面测试,但它应该可以让您非常接近您想要实现的目标:

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 列。另外我最初这样做是为了按人员编号查找排序数据,但给出的数据并不多,这并不重要,所以我已经相应地编辑了代码。

【讨论】:

  • 您好 DarXyde 感谢您的回复。我在第 24 行收到运行时错误 9(超出范围)。虽然我有 300 名员工,但他们可能不会在这一年中全部得到评估。有什么想法吗?
  • 这个错误通常意味着一个数组试图访问一个没有被标注的元素,这里就是这种情况(阅读vba arrays)。请再次查看代码,但如前所述......这未经测试。它应该可以完成工作,但它也需要您进行最少的输入更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
相关资源
最近更新 更多