Excel — хотите объединить данные из 2 столбцов, затем отсортировать по уникальным строкам и посчитать

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь собрать данные из проекта с 12 рабочими листами (по 1 на каждый месяц) примерно с 1000 строками ежемесячно. В каждой строке есть как столбец с объявлением, так и столбец с продаваемой фирмой. Я хочу отфильтровать оба столбца для каждой уникальной строки и в итоге получить список / строку для каждой компании с подсчетом того, сколько раз они были перечислены. Затем эти строки были отсортированы по убыванию чисел. ie:

 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 или около того записей (column1 и column2) и подсчитать, сколько было у каждой фирмы.
Я надеюсь, что это имеет смысл для кого-то. Я пытаюсь организовать их в меру своих возможностей, которые ограничены.
Я надеюсь на некоторые указания, верна ли моя логика, и если да, то с чего начать.
Спасибо. geddeca

Ответ №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
  

Комментарии:

1. Это сработало отлично. Я не очень хорошо знаком с объектом excel, но теперь я знаю о dictionary . Я добавил количество листов коллекции в цикле, и он перебирает их все. Спасибо вам за этот очень полезный код, из которого я могу извлечь уроки и использовать. geddeca

2. О-о-о, я скорректировал код, чтобы в нем было больше столбцов, и теперь случайно получил столбцы D и E, которые теперь содержат номера списка и цены продажи, которые теперь изменяются кодом из-за моего непонимания. Вот что я пытался использовать. хорошо, я пытаюсь ввести код. Осталось недостаточно символов. попробуем дальше.

3. Вам нужно задать новый вопрос с исправленным кодом и полным описанием новых условий и любых возникающих ошибок.