1

您好我有一个电子表格,我需要根据多个值进行计数和分组。使用下面的示例,仅当 Shipper - Shipper city、Recipient 和 Recipient city 都相同时,我才需要它来计算一行。否则我需要它来创建一个新条目。

除了计数之外,如果可能的话,我必须以编程方式而不是使用数据透视表,因为它将经常从 SQL DB 更新并由各种用户通过按钮控制。我已经使用 VBA 在这里获取数据,但我不知道如何继续进行排序/分组。

我尝试了一个带有嵌套条件的 for 循环,但对 VBA 还是很陌生,所以我收效甚微。

表格当前的外观;

# - Shipper - City -  Recipient - City     -   Bool
1   Bob       L.A.    Jenny      Las Vegas    True
2   Bob       L.A.    Jenny      Las Vegas    False
3   Bob       L.A.    Jenny      Portland     True
4   Bob       L.A     Jenny      Orem         True
5   Bob       L.A     Jenny      Orem         True
6   Sam       L.A     Jenny      Portland     True
7   Sam       L.A     Jenny      Portland     True
8   Sam       L.A     Jenny      Reno         False
9   Sam       L.A     Jenny      Reno         False

最终结果应该在一张新纸上;

# - Shipper - City -  Recipient - City     -   Count - Bool
1   Bob       L.A.    Jenny      Las Vegas      2     50%
2   Bob       L.A.    Jenny      Portland       1     100%
3   Bob       L.A.    Jenny      Orem           2     100%
4   Sam       L.A     Jenny      Portland       2     100%
5   Sam       L.A     Jenny      Reno           2     0%
4

2 回答 2

1

假设您的数据如下所示

在此处输入图像描述

您现在要做的就是将以下代码粘贴到模块中并运行它。输出将显示在新工作表中。您不必担心增加/减少数据中的行数。只需确保数据在列 A 到 E 中,并且从第一行开始,如上面的屏幕截图所示。否则,您将不得不修改宏。

逻辑(代码的作用)

  1. 仅将 Col 复制A-D到新工作表
  2. 使用内置.RemoveDuplicates删除过多数据
  3. 用于COUNTIFS()统计记录数并在 Col E 中显示
  4. 然后再用ColCOUNTIFS()来统计个数并显示TRUEF
  5. 用于COUNTIFS()统计个数FALSE并以Col显示G
  6. 在 ColH中,找到百分比。完成后,将其转换为值
  7. 删除 Col F 和 Col G
  8. G将 Col (现在的 Col F)格式化为%

代码

Sub Sample()
    Dim ws As Worksheet, wsOutput As Worksheet
    Dim lRow As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set wsOutput = ThisWorkbook.Sheets.Add

    With wsOutput
        ws.Range("A:D").Copy .Range("A:D")

        .Range("A:D").RemoveDuplicates Columns:=Array(1, 2, 3, 4), Header:=xlYes

        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        .Range("E2:E" & lRow).Formula = "=COUNTIFS(" & ws.Name & "!A:A,A2," & _
                                                       ws.Name & "!B:B,B2," & _
                                                       ws.Name & "!C:C,C2," & _
                                                       ws.Name & "!D:D,D2)"

        .Range("F2:F" & lRow).Formula = "=COUNTIFS(" & ws.Name & "!A:A,A2," & _
                                                       ws.Name & "!B:B,B2," & _
                                                       ws.Name & "!C:C,C2," & _
                                                       ws.Name & "!D:D,D2," & _
                                                       ws.Name & "!E:E,""TRUE"")"

        .Range("G2:G" & lRow).Formula = "=COUNTIFS(" & ws.Name & "!A:A,A2," & _
                                                       ws.Name & "!B:B,B2," & _
                                                       ws.Name & "!C:C,C2," & _
                                                       ws.Name & "!D:D,D2," & _
                                                       ws.Name & "!E:E,""FALSE"")"

        .Range("H2:H" & lRow).Formula = "=F2/SUM(F2:G2)"
        .Range("H2:H" & lRow).Value = .Range("H2:H" & lRow).Value

        .Columns("F:G").Delete Shift:=xlToLeft
        .Columns("F:F").NumberFormat = "0%"
        .Cells(1, 5).Value = "Count": .Cells(1, 6).Value = "BOOL"
    End With
End Sub

输出

在此处输入图像描述

于 2013-04-25T15:21:39.747 回答
1

您可以使用 SUMPRODUCT 函数,例如

=SUMPRODUCT((A1:A500="Bob")*(B1:B500="L.A")*(D1:D500="Las Vegas")*1)

数据透视表也是一个不错的选择...

[]的

于 2013-04-24T21:11:07.110 回答