Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Что лучше Dictionary или массив? - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Что лучше Dictionary или массив? (Макросы/Sub)
Что лучше Dictionary или массив?
Oleg_Nik Дата: Понедельник, 30.07.2018, 09:28 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Здравствуйте! Пытался разобраться с использованием "Dictionary", но сразу наступил на грабли. Для сравнения их работы использовал два макроса выполняющие одно и то же - один с использованием массива, второй с использованием "Dictionary". И при том, что "Dictionary" позиционируется как наиболее быстрый - в данном случае массив его обгоняет в десятки раз! Прошу Вас, посмотрите, может быть я для себя неверный пример сделал, может этот пример совсем некорректный для сравнения возможностей "Dictionary" и массива, может быть использование "Dictionary" оправдывает себя не во всех случаях, может быть именно в этом случае лучше использовать массив!? В каких вообще случаях использование "Dictionary" оправдывает себя? В общем много вопросов. В приложенном файле чуть более 5000 строк с данными (иначе не проходит по размеру файла), при этом количестве строк "Dictionary" и массив работают одинаково быстро, но если увеличить количество строк хотя бы до 50 - 100 тысяч разница в их работе становится существенной (массив быстрее).
К сообщению приложен файл: 7636480.xlsm(85.5 Kb)
 
Ответить
СообщениеЗдравствуйте! Пытался разобраться с использованием "Dictionary", но сразу наступил на грабли. Для сравнения их работы использовал два макроса выполняющие одно и то же - один с использованием массива, второй с использованием "Dictionary". И при том, что "Dictionary" позиционируется как наиболее быстрый - в данном случае массив его обгоняет в десятки раз! Прошу Вас, посмотрите, может быть я для себя неверный пример сделал, может этот пример совсем некорректный для сравнения возможностей "Dictionary" и массива, может быть использование "Dictionary" оправдывает себя не во всех случаях, может быть именно в этом случае лучше использовать массив!? В каких вообще случаях использование "Dictionary" оправдывает себя? В общем много вопросов. В приложенном файле чуть более 5000 строк с данными (иначе не проходит по размеру файла), при этом количестве строк "Dictionary" и массив работают одинаково быстро, но если увеличить количество строк хотя бы до 50 - 100 тысяч разница в их работе становится существенной (массив быстрее).

Автор - Oleg_Nik
Дата добавления - 30.07.2018 в 09:28
_Boroda_ Дата: Понедельник, 30.07.2018, 09:41 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 12761
Репутация: 5228 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
1. Переменные ОЧЕНЬ не рекомендуется называть row, item, key и т.п. Эти слова зарезервированы в VBA
2. Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете. Есть еще несколько вариантов применения, но сейчас не про это. Вы же в своем коде просто делаете перебор. Зачем для этого словарь?
3. И зачем для этого массив? Все можно написать вообще в одну строку
[vba]
Код
MsgBox Cells(Cells(Rows.Count, 2).End(3).row - 10, 3)
[/vba]

* Добавлено
Кстати, если Вы берете массив прямо с листа, то не нужно предварительно обозначать его размеры. Это я про то, что строка
[vba]
Код
ReDim mass(lLastRow, 2)
[/vba]не нужна

** Добавлено
А в словарь (не в этом примере, а вообще) лучшге добавлять данные из массива. Сначала кладеем данные с листа в массив, потом оттуда циклом в словарь (это, конечно, если данные не из рваных диапазонов, там уже сморетть нужно). К данным на листе нужно обращаться как можно реже. Именно из-за этого у Вас второй макрос и тормозит


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение1. Переменные ОЧЕНЬ не рекомендуется называть row, item, key и т.п. Эти слова зарезервированы в VBA
2. Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете. Есть еще несколько вариантов применения, но сейчас не про это. Вы же в своем коде просто делаете перебор. Зачем для этого словарь?
3. И зачем для этого массив? Все можно написать вообще в одну строку
[vba]
Код
MsgBox Cells(Cells(Rows.Count, 2).End(3).row - 10, 3)
[/vba]

* Добавлено
Кстати, если Вы берете массив прямо с листа, то не нужно предварительно обозначать его размеры. Это я про то, что строка
[vba]
Код
ReDim mass(lLastRow, 2)
[/vba]не нужна

** Добавлено
А в словарь (не в этом примере, а вообще) лучшге добавлять данные из массива. Сначала кладеем данные с листа в массив, потом оттуда циклом в словарь (это, конечно, если данные не из рваных диапазонов, там уже сморетть нужно). К данным на листе нужно обращаться как можно реже. Именно из-за этого у Вас второй макрос и тормозит

Автор - _Boroda_
Дата добавления - 30.07.2018 в 09:41
RAN Дата: Понедельник, 30.07.2018, 09:49 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4817
Репутация: 968 ±
Замечаний: 0% ±

2010
Для сравнения - правильная работа со словарем, и не правильная - с массивом.
[vba]
Код
Sub mass()
    Dim mass As Variant
    Dim i As Variant
    Dim lLastRow As Long
    Dim t!: t = Timer
    lLastRow = Cells(Rows.Count, 2).End(xlUp).row
    ReDim mass(lLastRow, 2)
    For i = 1 To lLastRow
        mass(i - 1, 1) = Cells(i, 2).Value
    Next
    MsgBox Format(Timer - t, "0.00000")
End Sub
Sub dic()
    Dim odic As Object, arr, lLastRow&, i&
    Dim t!: t = Timer
    Set odic = CreateObject("Scripting.Dictionary")
    lLastRow = Cells(Rows.Count, 2).End(xlUp).row
    arr = Range(Cells(1, 2), Cells(lLastRow, 3))
    For i = 1 To UBound(arr)
        odic.Item(i) = arr(i, 1)
    Next
    MsgBox Format(Timer - t, "0.00000")
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеДля сравнения - правильная работа со словарем, и не правильная - с массивом.
[vba]
Код
Sub mass()
    Dim mass As Variant
    Dim i As Variant
    Dim lLastRow As Long
    Dim t!: t = Timer
    lLastRow = Cells(Rows.Count, 2).End(xlUp).row
    ReDim mass(lLastRow, 2)
    For i = 1 To lLastRow
        mass(i - 1, 1) = Cells(i, 2).Value
    Next
    MsgBox Format(Timer - t, "0.00000")
End Sub
Sub dic()
    Dim odic As Object, arr, lLastRow&, i&
    Dim t!: t = Timer
    Set odic = CreateObject("Scripting.Dictionary")
    lLastRow = Cells(Rows.Count, 2).End(xlUp).row
    arr = Range(Cells(1, 2), Cells(lLastRow, 3))
    For i = 1 To UBound(arr)
        odic.Item(i) = arr(i, 1)
    Next
    MsgBox Format(Timer - t, "0.00000")
End Sub
[/vba]

Автор - RAN
Дата добавления - 30.07.2018 в 09:49
Oleg_Nik Дата: Понедельник, 30.07.2018, 09:52 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
_Boroda_, спасибо!
1. Переменные оставил такими же как в примере файла который взял из Интернет. (были мысли о том, что при использовании "Dictionary" так и нужно).
2. Я Вас правильно понял, что применение словаря в данном случае некорректно - потому и нет никаких преимуществ в сравнении с массивом?

И ещё: "Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете" - это основное использование словаря?
 
Ответить
Сообщение_Boroda_, спасибо!
1. Переменные оставил такими же как в примере файла который взял из Интернет. (были мысли о том, что при использовании "Dictionary" так и нужно).
2. Я Вас правильно понял, что применение словаря в данном случае некорректно - потому и нет никаких преимуществ в сравнении с массивом?

И ещё: "Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете" - это основное использование словаря?

Автор - Oleg_Nik
Дата добавления - 30.07.2018 в 09:52
Oleg_Nik Дата: Понедельник, 30.07.2018, 09:56 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
_Boroda_, RAN, Спасибо большое!
Кажется разобрался с Вашей помощью, по крайней мере пока дополнительных вопросов нет!
 
Ответить
Сообщение_Boroda_, RAN, Спасибо большое!
Кажется разобрался с Вашей помощью, по крайней мере пока дополнительных вопросов нет!

Автор - Oleg_Nik
Дата добавления - 30.07.2018 в 09:56
Hugo Дата: Понедельник, 30.07.2018, 16:53 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2837
Репутация: 639 ±
Замечаний: 0% ±

1. Словарь содержит только уникальные ключи, но к каждому ключу можно "прикрепить" практические любую информацию.
2. Взять эту информацию по ключу можно без поиска/перебора.
Вот и используйте эти свойства, когда они подходят для задачи.
Я например вчера словарь использовал для такой задачи (первый раз) - есть например два списка уникальных значений, частично пересекающиеся, нужно их расположить в двух столбцах, чтоб совпадающие были в одной строке, остальные не важно как (но в одной только совпадающие!).
Делается легко и без всякой сортировки, просто берём значение из одной группы, заносим в словарь с порядковым номером (новому номер берём от количества ключей словаря +1), пишем значение в столбец в строку с таким номером. Затем берём значения второй группы и аналогично записываем в словарь если его там ещё нет, значение пишем в строку с номером, полученным из словаря. Т.е. если новое - будет ниже, если уже было - будет в одной строке с предыдущим.


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
Сообщение1. Словарь содержит только уникальные ключи, но к каждому ключу можно "прикрепить" практические любую информацию.
2. Взять эту информацию по ключу можно без поиска/перебора.
Вот и используйте эти свойства, когда они подходят для задачи.
Я например вчера словарь использовал для такой задачи (первый раз) - есть например два списка уникальных значений, частично пересекающиеся, нужно их расположить в двух столбцах, чтоб совпадающие были в одной строке, остальные не важно как (но в одной только совпадающие!).
Делается легко и без всякой сортировки, просто берём значение из одной группы, заносим в словарь с порядковым номером (новому номер берём от количества ключей словаря +1), пишем значение в столбец в строку с таким номером. Затем берём значения второй группы и аналогично записываем в словарь если его там ещё нет, значение пишем в строку с номером, полученным из словаря. Т.е. если новое - будет ниже, если уже было - будет в одной строке с предыдущим.

Автор - Hugo
Дата добавления - 30.07.2018 в 16:53
nilem Дата: Вторник, 31.07.2018, 06:05 | Сообщение № 7
Группа: Авторы
Ранг: Старожил
Сообщений: 1473
Репутация: 519 ±
Замечаний: 0% ±

Excel 2013
[offtop]
Я например вчера словарь использовал для такой задачи (первый раз)

Точно первый раз? ))[/offtop]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение[offtop]
Я например вчера словарь использовал для такой задачи (первый раз)

Точно первый раз? ))[/offtop]

Автор - nilem
Дата добавления - 31.07.2018 в 06:05
Hugo Дата: Вторник, 31.07.2018, 13:49 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2837
Репутация: 639 ±
Замечаний: 0% ±

[offtop]Вот именно так - первый :) И придумал этот алгоритм тоже именно для этой задачи. Сначала думал грузить всё в коллекцию, из неё в массив, сортировать... Чушь...[/offtop]


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
Сообщение[offtop]Вот именно так - первый :) И придумал этот алгоритм тоже именно для этой задачи. Сначала думал грузить всё в коллекцию, из неё в массив, сортировать... Чушь...[/offtop]

Автор - Hugo
Дата добавления - 31.07.2018 в 13:49
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Что лучше Dictionary или массив? (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2018 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!