У меня есть некоторые данные, которые я пытаюсь проиндексировать, чтобы Excel мог их просмотреть и применить различные методы или найти различные свойства на основе каждой «группы» идентификаторов.

В столбце A у меня есть идентификатор «провайдера». Каждый провайдер будет появляться от 1 до 4 раз, в зависимости от того, сколько у него подъединиц (1,2,3 или M, указанные в столбце B). Провайдеры всегда будут последовательными (например, если провайдер появляется 4 раза, каждый будет сразу после следующего).

Таким образом, первый столбец будет выглядеть так (транспонировано для экономии места): 30111,30111,30111,30111,30113,30113,30114,30114,30114,31308 ... и т. Д.

Я хочу пройтись по этому столбцу и «сгруппировать» эти идентификаторы, чтобы затем добавить в свой макрос для выполнения действий с каждой группой идентичных идентификаторов поставщиков. Другими словами, мне нужно иметь какой-то индекс (в массиве, списке, коллекции, словаре или что-то еще), в котором говорится, что первый идентификатор включает строки 1-4, второй идентификатор включает строки 5-6 и т. Д.

Любые идеи? Я до сих пор безуспешно пытался использовать массивы, словари и коллекции. Я чувствую, что у меня, наверное, больше всего проблем с концептуальным подходом к правильному решению этой проблемы.

Я думаю, что база данных может быть более полезным решением, но для меня приоритетом является работа в Excel, поскольку это делает решение переносимым, более простым в настройке, понятным для большего числа людей и потенциально более надежным.

0
user2784067 30 Дек 2013 в 18:26
Словарь с ключом по идентификатору, содержащий номера строк каждого идентификатора в отдельной коллекции / массиве / списке, разделенном запятыми?
 – 
Chel
30 Дек 2013 в 18:36
Вопрос в том, как мне ввести ключ по ID? Насколько я могу судить, я должен явно назвать каждую запись - IE, я не могу сделать dictProviders.Add (cell.value), я должен сделать dictProviders.Add ("30111"), что делает невозможным выполнение этого цикла. . Даже если бы я мог сделать это таким образом, я не могу неявно назвать следующий массив / коллекцию / список. Во всяком случае, насколько я понимаю.
 – 
user2784067
30 Дек 2013 в 18:44
(Я предполагаю, что вы имеете в виду что-то вроде следующего) Для каждой ячейки в диапазоне dictProviders.Add (cell.value, cell.value) [end loop] Для каждого элемента в dictProviders, ~ создать массив с именем dictProviders.Item ~
 – 
user2784067
30 Дек 2013 в 18:47
С каким объемом данных вы работаете (т. Е. Должно ли решение быть эффективным)?
 – 
Blackhawk
30 Дек 2013 в 19:50
Обычно около 3000 строк и около 750 разных поставщиков. Необязательно быть очень эффективным, но повторение слишком большого количества циклов по всем ячейкам может быть проблематичным.
 – 
user2784067
30 Дек 2013 в 20:02

1 ответ

Лучший ответ

Вот что я имел в виду, имея в виду коллекции хранилищ словарей, которые содержат номера строк:

'loop to fill dictionary
For Each cell In Selection
    id = cell.Value
    If Not dict.Exists(id) Then dict.Add id, New Collection
    dict(id).Add cell.Row
Next cell

'get the first id and read out its rows
id = dict.Keys(0)
For Each v in dict(id)
    Debug.Print v
Next v

Не знаю, откуда у вас создалось впечатление, что ключи словаря всегда должны быть строковыми литералами. Но если у вас есть ячейка со значением 30111, cell.Value будет иметь тип double, поэтому после dict.Add cell.Value, ... ключ 30111 будет в словаре, но "30111" (в виде строки) не будет, а dict("30111") просто вернет пустое значение. Может, это была твоя проблема? Чтобы этого избежать, вам нужно использовать CStr().

1
Chel 30 Дек 2013 в 21:12
А, хорошо, после небольшого размышления это имеет для меня некоторый смысл. Я попробую и опубликую результаты.
 – 
user2784067
30 Дек 2013 в 21:59
Хорошо, бинго, номера строк возвращаются так четко, что это работает. Теперь мне просто нужно перебрать все идентификаторы и выполнить формулы и форматирование! Большое спасибо!
 – 
user2784067
30 Дек 2013 в 22:09
Кстати, есть ли способ получить сразу все значения, хранящиеся в каждой словарной статье? Скажем, я хочу взять все строки из первой записи и вычислить сумму из этих строк в столбце W ... есть ли способ сделать это? Извините, что оживил это днем ​​позже, но я борюсь с этим !!
 – 
user2784067
31 Дек 2013 в 18:23
Вам нужно будет пройтись по коллекции номеров строк (как во втором фрагменте) и использовать цикл для добавления значений ячеек или создания объекта Range со всеми необходимыми ячейками. Если вы пойдете вторым путем, не так уж сложно создать класс, который бы все это обернул.
 – 
Chel
31 Дек 2013 в 20:27