Строительный индекс на основе столбца / категории - PullRequest
0 голосов
/ 09 апреля 2020

Мой набор данных с 2 столбцами (в действительности 22) выглядит следующим образом:

filename1 -"123"
filename1 -"xyz"
filename1 -"abc"
filename2 -"123"
filename2 -"Pieter"
etc.

Я хочу пройтись по нему в блоках на основе имени файла. Для этого мне нужно вернуть вертикальный диапазон одного или нескольких столбцов на основе имени файла (отсортировано в порядке возрастания).

Прямо сейчас я строю индекс, используя словарь. С простым l oop, который считает каждое уникальное значение, таким образом, имя файла 1, 3 - имя файла 2, 2 и т.д. c, а затем второй l oop для считывания количества строк в имени файла. С этим я, конечно, могу просчитать свой путь. Но есть ли другая, может быть, умнее техника?

Set dictFilenames = CreateObject("scripting.dictionary")

For Each row In Range("A:A")
    file = row.Value
    If Len(file) > 0 Then dictFilenames(file) = dictFilenames(file) + 1
Next row

For i = 0 To dictFilenames.Count - 1
    Debug.Print dictFilenames.Keys()(i), dictFilenames.Items()(i)
Next

1 Ответ

0 голосов
/ 09 апреля 2020

Словарь может содержать словарь как элемент

If Not dictfilenames.exists(file) then

    dictfilenames.add, file, New Scripting.Dictionary  ' or CreateObject("Scripting.Dictionary)

End If

with dictfilenames.Item(file)

    .Add key:=.count, Item:=<value from next column>

End With

Таким образом, вы получаете словарь, в котором ключами являются имена файлов, а элементом является еще один scripting.dictionary с последовательными ключами, начинающимися с 0. Конечно, вам не нужно использовать счетчик для автоматического индексации, вы можете использовать номер строки значения в следующем столбце.

например,

    .add key:=<row_number>, Item:=<value from next column>

Теперь вы можете читать обратно значения во вложенном словаре, используя

Dim myItem as variant
For each myItem in dictfilenames.item(file) ' myItem is the key in the nested dictionary
    myValue = dictfilenames.item(file).item(myItem)
Next

или получить массив

Dim myArray as variant
myArray = dictfilenames.item(file).Items
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...