Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2013, 12:55   #21
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Для макроса compare2:
Код:
    a = [a7:b37].Value    'ae? nanna
    b = [c7:c26].Value    'ae? nanna
Для макроса qq:
Код:
Sub qq()
    Dim i As Long, x As Range, y As Range, z As Range, a()
    Application.ScreenUpdating = False
    Set x = [a7:a37]: Set y = [c7:c26]: Set z = [b7:b37]
    ReDim a(1 To y.Count, 1 To 1)
    For i = 1 To y.Count
        a(i, 1) = Application.SumIf(x, y.Cells(i, 1), z)
    Next
    [f7].Resize(UBound(a, 1)).Value = a
    Application.ScreenUpdating = True
End Sub
на неконкретные вопросы даю неконкретные ответы ...

Последний раз редактировалось Step_UA; 26.08.2013 в 13:03.
Step_UA вне форума Ответить с цитированием
Старый 26.08.2013, 13:05   #22
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
Сообщение от Step_UA Посмотреть сообщение
Для макроса compare2:
Код:
    a = [a7:b37].Value    'ae? nanna
    b = [c7:c26].Value    'ae? nanna
Блин, точно, спасибо.
А ведь я так пробовал, но что-то не срабатывало дальше.
Теперь все отлично работает и решилась куча проблем.
И с макросом qq теперь понятно, где я косячил.
Всем спасибо!!!
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499

Последний раз редактировалось VictorM; 26.08.2013 в 13:09.
VictorM вне форума Ответить с цитированием
Старый 26.08.2013, 13:13   #23
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вероятно можно чуть ускориться в qq вот тут:

Код:
    Dim yy()
    yy = y.Value
    For i = 1 To y.Count
        a(i, 1) = Application.SumIf(x, yy(i, 1), z)
    Next
Померьте на большом количестве данных - на сколько будет быстрее?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 26.08.2013, 13:32   #24
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
Вероятно можно чуть ускориться в qq вот тут:
Обязательно все проверю и отпишусь о результатах.
Дело в том, что у меня все, о чем мы тут говорили, сделано и все работает, НО все на циклах и т.д.
Соответственно скорость обработки никакая.
Теперь я хочу внедрить новые коды и обязательно отпишусь о сравнении скорости обработки.
Еще раз спасибо всем за помощь и науку!
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 26.08.2013, 19:21   #25
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

О скорости обработки на реальных данных.
Пока только о суммировании.
Код compare2 - 0,172с
код qq - 20,9c
код qq с изменениями из поста №23 - 21,34с
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 26.08.2013, 19:57   #26
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Во как, даже дольше стало...
Вообще странно - из массива данные доставать быстрее, чем с листа. Вероятно это ускорило на столь малую часть, что её съело взятие этих данных в массив
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.08.2013, 09:31   #27
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

А вот теперь суммарная скорость.
Мой прежний вариант с циклами, Search, Find и т.п. - время обновления данных = 4мин.30сек.
Новый вариант, с кодами из этой темы с применением "Scripting.Dictionary" = 1мин.30сек.
Так что эффект ощутимый!
Знаю, где можно "добить" и эту минуту, но пока не получается.
Есть у меня "куча" данных которые "вытягиваются" ВПР(), вот тут и тормоза.
Попытался переделать на массивы, получилось, но только на основе кода от SAS88, тот-же ВПР() и скорость работы этого кода, практически не отличается от того, что у меня сейчас работает.
А вот код от Hugo121...
Попробовал переделать код compare2, вроде работает, но подставляются последние по совпадению данные, что логично, для работы этого кода.
А мне нужно, чтобы как ВПР() - брал первые встретившиеся совпадения и выводил соответствующие данные. Все дальнейшие совпадения - просто игнорировать.
А вот что и как прописать в коде макроса compare2 для этого, не знаю.
Пробовал по всякому, не то.
Подскажите пожалуйста, как заставить макрос игнорировать все дальнейшие совпадения?
Спасибо.
Вложения
Тип файла: zip совпадения_ВПР.zip (10.3 Кб, 9 просмотров)
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 27.08.2013, 09:48   #28
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Всё проще.
Код:
Sub compare3v2()    'ВПР()
    Dim a(), b(), i As Long

    a = [a7:b37].Value
    b = [c7:c26].Value
    With CreateObject("Scripting.Dictionary")
        'запоминаем в словаре перввые пары
        For i = 1 To UBound(a)
            If Not .exists(a(i, 1)) Then .Item(a(i, 1)) = a(i, 2)
        Next
        'извлекаем запомненное
        For i = 1 To UBound(b)
            b(i, 1) = .Item(b(i, 1))
        Next
    End With
    [f7].Resize(UBound(b), 1) = b
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.08.2013, 09:50   #29
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Еще вариант (маарос "qq4").
Вложения
Тип файла: rar совпадения_ВПР_2.rar (8.7 Кб, 9 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 27.08.2013, 10:04   #30
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Hugo121, SAS888, спасибо.
Цитата:
Всё проще.
Да уж Учиться мне еще и учиться.
Благодаря только одной этой теме у меня теперь есть практически универсальный набор кодов на основе которых и буду осваивать все "премудрости".
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно сравнить два массива указателей типа char Никнейм94 C++ Builder 2 22.05.2013 10:53
Сравнить два ассоциативных массива и вывести одинаковые значения. livesport PHP 1 20.10.2012 15:10
нужен макрос на выделение значения из массива в отдельный столбец 30gb Microsoft Office Excel 3 14.01.2011 09:06