查找值并计数表中的出现次数

时间:2019-03-04 14:31:08

标签: excel vba

我正在尝试创建一个函数或宏,该函数或宏将列出表中的不同值以及该表中出现了多少次该值。

例如,如果我有一个这样的表,则每天记录机械停机时间。

          |   Day 1    |   Day 2     |    Day 3     |
          |:----------:|:-----------:|:------------:|
Machine 1 |     a      |     a       |   No stop    |
Machine 2 |     d      |     g       |      b       |
Machine 3 |     e      |     c       |   No stop    |
Machine 4 |     g      |     i       |      a       |
Machine 5 |     c      |     a       |      b       |
Machine 6 |     a      |     b       |      c       |

(字母a-i代表不同类型的站点)

我想创建一个这样的列表。

|   Stop     | Occurances |
|:----------:|:----------:|
|     a      |      5     |
|  No stop   |      2     |
|     d      |      1     |
|     g      |      2     |
|     b      |      3     |
|     e      |      1     |
|     c      |      3     |
|     i      |      1     |

我已经找到了在单个单列范围内执行此操作的方法,但在多列范围内执行此操作时遇到了麻烦。

2 个答案:

答案 0 :(得分:0)

您可以修改代码并尝试:

Option Explicit

Sub test()

    Dim rng1 As Range, rng2 As Range, cell As Range
    Dim Lastrow As Long, Times1 As Long, Times2 As Long

    'Indicate which sheet you will use
    With ThisWorkbook.Worksheets("Sheet1")
        'Set the range where all data appears
        Set rng1 = .Range("B2:D7")
        'Loop the range
        For Each cell In rng1
            'Find the last row of the column with the results
            Lastrow = .Cells(.Rows.Count, "F").End(xlUp).Row
            'Set the range will all the stops
            Set rng2 = .Range("F2:F" & Lastrow)
            'Count how many times a stop appears in the results
            Times1 = Application.WorksheetFunction.CountIf(rng2, cell.Value)
            'If it does appears regord
            If Times1 = 0 Then

                Times2 = Application.WorksheetFunction.CountIf(rng1, cell.Value)
                .Range("F" & Lastrow + 1).Value = cell.Value
                .Range("G" & Lastrow + 1).Value = Times2

            End If

        Next cell

    End With

End Sub

答案 1 :(得分:0)

虽然我发现的解决方案不是宏/公式,但我发现解决此问题的最简单,最快的方法是取消表的摆放。 我是通过选择整个表Data-> From Table / Range并在Power Query Editor Transform-> Unpivot Columns中完成的。

这使我在同一列中的所有停靠点更加容易管理。

使用数据->删除重复项,我可以获得唯一的停靠点,并且可以使用简单的

=COUNTIF(RANGE_TABLE;STOP_NR)

获取停靠点。