【问题标题】:Excel - want to conglomerate data from 2 columns then sort by unique strings and countExcel - 想要合并来自 2 列的数据,然后按唯一字符串排序并计数
【发布时间】:2019-03-14 09:52:40
【问题描述】:

我正在尝试从一个包含 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 列)以及每个公司拥有的总数。 我希望这对某人有意义。我正在尽我所能组织它,这是有限的。 如果我的逻辑是正确的,我希望得到一些指导,如果是的话,从哪里开始。 谢谢你。格德卡

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    字典可以同时给你一个唯一的列表和计数。信息返回到工作表后,即可进行快速排序。

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

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

    代码:

    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
    

    【讨论】:

    • 这非常有效。我对 excel 对象不太熟悉,但现在我知道字典了。我在循环中添加了工作表集合的计数,并循环遍历它们。感谢您提供这个非常有用的代码供我学习和使用。格德卡
    • 哦哦,我调整了代码以包含更多列,现在不小心得到了 D 和 E 列,它们现在保存了列表和销售价格数字,由于我缺乏理解,这些数字现在正在被代码更改.这是我尝试使用的。好的,我正在努力输入代码。剩余字符数不足。下次试试。
    • 您需要用修改后的代码提出一个新问题,并完整描述新条件和正在发生的任何错误。
    猜你喜欢
    • 2020-02-23
    • 2011-02-13
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多