Доброго времени суток, уважаемые форумчане. Подскажите, пожалуйста, как (и можно ли) решить данный вопрос. Скажу сразу, рабочее решение есть, просто пытаюсь придумать 2 вариант для (самообразования). Итак, словарь наполняется:
Код |
---|
Dim dicData As Object, key As String, i As Long, kt As Variant
Set dicData = CreateObject("Scripting.Dictionary"): dicData.CompareMode = 1
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
key = Join(Array(i, Cells(i, 1), Cells(i, 2)), "|")
dicData.Item(key) = Cells(i, 3)
Next i |
далее требуется получить данные из этого словаря (в рабочем файле это делается циклом, а сейчас пытаюсь сделать фильтром:
Код |
---|
k = 5 & "|" & 123456 & "|" & 123456
For Each kt In Filter(dicData.keys, Split(k, "|")(2) & "|" & Split(k, "|")(2), , vbTextCompare)
res = dicData.Item(kt)
Next kt |
здесь все считает правильно. Чуть поясню по структуре данных, в словарь попадают: порядковый номер, номер счетчика и его индекс. Индексом является номер головного счетчика к которому присоединены прочие. Таким образом для получения значения "головного " счетчика подходит фильтр
Split(k, "|")(2) & "|" & Split(k, "|")(2) и, повторюсь, здесь ошибки нет. А вот для расчета значений остальных значений счетчиков, присоединенных к головному фильтр указать не получается. Фактически нужно указать
любое значение Split(k, "|")(1) & "|" & Split(k, "|")(2) или вообще
любое значение & "|" & Split(k, "|")(2) Пытался сделать "в лоб":
Код |
---|
For Each kt In Filter(dicData.keys, "*" & "|" & Split(k, "|")(2), , vbTextCompare)
sum = sum + dicDataTemp.Item(kt)
Next kt |
но не выходит. Так вот, если можно сразу 2 вопроса по теме: как это сделать и, если можно, как это сделать за 1 цикл (про цикл не так важно, просто интересно)
Заранее спасибо всем откликнувшимся