Страницы: 1
RSS
VBA. Словарь. Как организовать сортировку собранных ключей по алфавиту в коде
 
Доброго времени суток тем, с кем еще сегодня не приветствовали друг друга.

Будьте добры, помогите осуществить в словаре сортировку полученных ключей по алфавиту. Спасибо!
Код
Sub ВидыТопливаЛитрыСредняяЦена()
  
 Sheets("ГПН").Select
  
'===============Создаем словарь===========
Dim dic
Set dic = CreateObject("Scripting.Dictionary") 'создаем словарь

   dic.CompareMode = TextCompare ' текстовый режим - игнорирует регистр
    
For i = 2 To Cells(Rows.Count, 3).End(xlUp).row 'цикл с ДВАДЦАТОЙ строки листа до последней заполненной
    k = Range("D" & i) 'создаем ключ для словаря сцепкой ячеек. Все ключи в словаре уникальны
    it = Range("E" & i) 'значение по ключу, в примере - количество
                If dic.Exists(k) Then 'проверяем, есть ли уже такой ключ в словаре
                  dic.item(k) = dic.item(k) + it 'если есть, суммируем колличество с тем, что уже было ранее
                Else
                  dic.Add k, it 'если нет, делаем в словаре новую запись
                End If
Next

Rows("1:" & dic.Count + 7).Insert 'вставляем сверху строки

СтрокаВыгрузки = 1 'строка формирования заголовка и первая строка для выгрузки данных
[a1] = "Вид топлива": [b1] = "Кол-во л.": 'в пятой строке делаем шапку

i = СтрокаВыгрузки + 1 'с этой строки будем выгружать данные из словаря
For Each ky In dic.keys 'цикл переборки всех записанных ключей
    ar = ky 'разделяем сцепку обратно, получаем два элемента
    Range("A" & i) = ar 'записываем эти элементы в ячейки
    Range("B" & i) = dic.item(ky) 'записываем в ячейку количество
     
    i = i + 1 'переходим к следующей строке
     
    k = 1
    k = k + 1
    Range("A" & i & ",A" & i - 1).MergeCells = True
 
Next
 
dic.RemoveAll
End Sub
Улыбнись.
 
А поискать?
http://www.cpearson.com/excel/CollectionsAndDictionaries.htm
По вопросам из тем форума, личку не читаю.
 
БМВ, it is good, но my english is bad, friend.
Улыбнись.
 
Начните с этого
По вопросам из тем форума, личку не читаю.
 
БМВ, есть !
Улыбнись.
 
Решение:
Код
Sub ВидыТопливаЛитрыСредняяЦена()
  
 Sheets("ГПН").Select
  
'===============Создаем словарь===========
Dim dic
Set dic = CreateObject("Scripting.Dictionary") 'создаем словарь

   dic.CompareMode = TextCompare ' текстовый режим - игнорирует регистр
    
    
For i = 2 To Cells(Rows.Count, 3).End(xlUp).row 'цикл с ДВАДЦАТОЙ строки листа до последней заполненной
    If Range("B" & i) <> "" Then
            k = Range("D" & i) 'создаем ключ для словаря сцепкой ячеек. Все ключи в словаре уникальны
            it = Range("E" & i) 'значение по ключу, в примере - количество
                        If dic.Exists(k) Then 'проверяем, есть ли уже такой ключ в словаре
                          dic.item(k) = dic.item(k) + it 'если есть, суммируем колличество с тем, что уже было ранее
                        Else
                          dic.Add k, it 'если нет, делаем в словаре новую запись
                        End If
    End If
Next
  
Rows("1:" & dic.Count + 7).Insert 'вставляем сверху строки

СтрокаВыгрузки = 1 'строка формирования заголовка и первая строка для выгрузки данных
Range("A" & СтрокаВыгрузки) = "Вид топлива"
Range("B" & СтрокаВыгрузки) = "Кол-во л."

i = СтрокаВыгрузки + 1 'с этой строки будем выгружать данные из словаря
For Each ky In dic.keys 'цикл переборки всех записанных ключей
    ar = ky 'разделяем сцепку обратно, получаем два элемента
    Range("A" & i) = ar 'записываем эти элементы в ячейки
    Range("B" & i) = dic.item(ky) 'записываем в ячейку количество

    i = i + 1 'переходим к следующей строке
     
    k = 1
    k = k + 1
 
Next

'Сортировка полученных значений

    Range("A" & СтрокаВыгрузки & ":B" & dic.Count + 1).Select
 
    ActiveWorkbook.Worksheets("ГПН").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("ГПН").Sort.SortFields.Add key:=Range("A" & СтрокаВыгрузки + 1 & ":A" & dic.Count + 1), _
        SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "Аи-92,Аи-95,G-95,ДТ,G-Drive 100,СУГ", DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("ГПН").Sort
        .SetRange Range("A" & СтрокаВыгрузки & ":B" & dic.Count + 1)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ThisWorkbook.ActiveSheet.Sort.SortFields.Clear

dic.RemoveAll ' удаляем словарь
End Sub
Улыбнись.
 
Доброго дня.
Для тех, кто зашёл сюда в поисках
Цитата
falmrom написал:
помогите осуществить в словаре сортировку полученных ключей
- тут такого решения нет! Да и в общем это и неосуществимо, и не имеет смысла.
Но ключи можно сортировать выгрузив их куда-то, например на лист как выше, или в массив (сортировать этот массив), и затем уже циклом по этому сортированному списку решать задачу.
 
Hugo, название темы другое (может изменено). Dic.Keys это одномерный массив и сортируется элементарно любой из известных сортировок - разве не так? На крайняк можно сделать arr=Dic.keys и уж тогда точно можно))
Так что вопрос в знании матчасти…
Изменено: Jack Famous - 21.08.2019 20:35:41
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ключи сортировать можно где угодно, но не в словаре - даже если туда последовательно загрузить уже где-то вне словаря отсортированные ключи никто не гарантирует что они там расположатся в порядке загрузки. Т.к. не это предназначение словаря. Хотя обычно так и лежат как положили.
 
Как нормально назвать?
 
Цитата
Hugo: Ключи сортировать можно где угодно, но не в словаре
проверил - подтверждаю (см. скрины)
Код проверки
Цитата
Hugo: никто не гарантирует что они там расположатся в порядке загрузки
6. КЛЮЧИ. 6.1. Последовательность хранения: Следует понимать, что элементы в словаре хранятся в той последовательности, в которой они добавлялись в словарь. Менять эту последовательность можно только путём полной перестройки словаря (хотя не совсем понятно для чего это может понадобиться) — я вот не сталкивался с исключениями…

vikttur, вопрос к ТС, т.к. не совсем понятно, что именно он хочет. Тема тянется из предыдущей его темы. Учитывая вышеизложенное можно только сказать, что сортировать внутри словаря нельзя, но можно массивом и способов много.

Я, честно говоря, не понимаю, зачем данные в словаре нужны в отсортированном виде, но сделать это в пару-тройку шагов вполне осуществимо…
Изменено: Jack Famous - 22.08.2019 09:41:29
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
vikttur написал:
Как нормально назвать?
зачем? и так все названо нормально. просто для темы;
Цитата
falmrom написал:
VBA. Словарь. Как организовать сортировку
ответ: НИКАК
а развернутый ответ:
получите ключи словаря в маччив,, посортируйте его
или
используйте коллекцию, там есть возможность добавлять новые элементы перед (после) указанного, а по умолчанию, как в словаре, новые элементы добавляются в конец списка
Изменено: Ігор Гончаренко - 22.08.2019 09:43:01
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Jack Famous написал:
Следует понимать, что элементы в словаре хранятся в той последовательности, в которой они добавлялись в словарь
- где-то у microsoft читал, что они не гарантируют совпадения позиций ключа и его итема, поэтому я не верю этой фразе из перфектэксель.
Поэтому в проектах надёжнее к каждому ключу подтягивать его итем, а не брать два параллельных массива, как делают некоторые.
 
Цитата
Hugo: надёжнее
тут я согласен, тем более, что официальная документация всегда важнее. К тому же я, собственно, никогда на порядок словаря не полагался, т.к. он для другого
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх