Excel-要合并2列中的数据,然后按唯一字符串和计数进行排序

时间:2019-03-13 23:49:50

标签: excel vba

我正在尝试从一个包含12个工作表(每月1个)的项目中收集数据,每月大约有1000行。每行都有一个上市公司和一个销售公司列。 我希望为每个唯一的字符串过滤两列,最后以每个公司的列表/行的形式列出它们被列出的次数。这些行然后按降序排列。 即:

CENTURY         15
CENTRAL          4
CIR              4
PROFESSIONALS   3 etc.
SUTTON          3
HOUSE           1
URBAN           1

Listing Firm 1      Selling Firm 1 Name
CENTURY             CIR 
MOUNTAINVIEW        CENTURY 
CENTRAL             CENTURY 
CIR                 SUTTON  
CENTRAL             CENTRAL
PLINTZ              DIRECT
CENTURY             CIR 
CENTURY             CENTURY
DIRECT              CENTURY 
SUTTON              CIR
CENTURY             HOUSE
CENTURY             PROFESSIONALS
REALTY              CENTURY 
CENTRAL             CENTURY 
WALLER              HOUSE
PROFESSIONALS       CENTURY
PROFESSIONALS       CENTURY 
CENTURY             URBAN
CENTURY            SUTTON 

我认为我需要执行此VBA。不知道是不是这种情况。:
我能以某种方式将2列合并为一个数组吗 然后遍历数组以获取唯一的字符串。  并将该数组分配给变量(尽管不确定如何将其用于下一步)。我仍然需要遍历原始的2000个左右的条目(第1列和第2列),以及每个公司的总数。 我希望这对某人有意义。我正在尽我所能组织有限的活动。 如果我的逻辑是正确的,那么我希望获得一些指导。 谢谢。 geddeca

1 个答案:

答案 0 :(得分:0)

字典可以为您提供唯一的列表并同时计数。信息返回到工作表后,即可进行快速排序。

以下内容从单个工作表中收集并处理信息。遍历十几个工作表并进行处理应该相对容易。

  • 从工作表中收集值
  • 处理列表和计数字典
  • 将新值返回到工作表
  • 按数值降序排序,然后按名称升序排序

代码:

Option Explicit

Sub macro()

    Dim i As Long, j As Long, w As Long
    Dim arr As Variant, dict As Object

    Set dict = CreateObject("scripting.dictionary")
    dict.comparemode = vbTextCompare

    For w = 1 To 1
        With Worksheets(w)

            'collect values from worksheet
            arr = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "B").End(xlUp)).Value2

            'process dictionary of list and count
            dict.RemoveAll
            For i = LBound(arr, 1) To UBound(arr, 1)
                For j = LBound(arr, 2) To UBound(arr, 2)
                    dict.Item(arr(i, j)) = dict.Item(arr(i, j)) + 1
                Next j
            Next i

            'return new values to worksheet
            .Cells(1, "D").Resize(1, 2) = Array("list", "count")
            .Cells(2, "D").Resize(dict.Count, 1) = Application.Transpose(dict.keys)
            .Cells(2, "E").Resize(dict.Count, 1) = Application.Transpose(dict.items)

            'sort values by count descending then name ascending
            With .Range(.Cells(1, "D"), .Cells(.Rows.Count, "E").End(xlUp))
                .Sort key1:=.Columns(2), order1:=xlDescending, _
                      key2:=.Columns(1), order2:=xlAscending, _
                      Header:=xlYes
            End With

        End With
    Next w

End Sub