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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2015, 18:34   #1
peq
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 230
По умолчанию оптимизация быстродействия файла

добрый день!

есть вопрос по быстродействию формул.

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

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

сам алоритм выбора переносить в макросы.. тоже думал, но мне кажется встроенные формулы должны обрабатывать данные быстрее, чем код, который я придумаю.


такие вот дела...
Вложения
Тип файла: xlsx вопрос-быстродействие.xlsx (33.5 Кб, 20 просмотров)
peq вне форума Ответить с цитированием
Старый 29.12.2015, 23:30   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Если Windows, то можно делать макросом на словаре - сперва всю выгрузку загнать в словарь (через массив), затем по каждому ключу сразу выбирать подходящие по условию и сразу их считать.
Тем более что упорядочивание не критично.
Пока не известна система - нет смысла писать код.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 29.12.2015, 23:43   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

peq,
значения key и key2 заданы, или должны извлекаться из этих же данных?
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 29.12.2015, 23:55   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Хотя вот для начала - на 11 ключей:
Код:
Sub tt()
    Dim a(), i&, ii&, iii&, t, col As Object

    Application.Calculation = xlCalculationManual
    [a11].CurrentRegion.Offset(1).Clear

    a = Sheets("выгрузка").[A5].CurrentRegion.Value

    With CreateObject("scripting.dictionary"): .comparemode = 1
        For i = 2 To UBound(a)
            t = a(i, 2)
            If Not .exists(t) Then .Add t, New Collection
            .Item(t).Add Array(a(i, 3), a(i, 1))
        Next

        For i = 2 To 12
            If .exists(Cells(3, i).Value) Then
                Set col = .Item(Cells(3, i).Value)
                ReDim a(1 To col.Count, 1 To 1): iii = 0
                t = Cells(11, i).Value
                For ii = 1 To col.Count
                    If col(ii)(0) > t Then
                        iii = iii + 1
                        a(iii, 1) = col(ii)(1)
                    End If
                Next
                Cells(2, i) = iii
                Cells(12, i).Resize(iii, 1) = a
            End If
        Next
    End With

    Application.Calculation = xlCalculationAutomatic

End Sub
Выполнять при активном листе "расчёт" (его формулы частично умрут).
P.S. есть куда оптимизировать этот подход по скорости, это так для начала...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 30.12.2015 в 10:25.
Hugo121 вне форума Ответить с цитированием
Старый 30.12.2015, 15:26   #5
peq
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 230
По умолчанию

Hugo121
круто.. буст к скорости в несколько порядков..
никогда не сталкивался с коллекциями, придется их брать на регулярное вооружение, если это быстро настолько.
спасибо!

Казанский
да, можно считать, что key/key2 заданы и фиксированы, я кое-где формулы в файле оставил, просто чтобы данные были более понятными по своей природе.
peq вне форума Ответить с цитированием
Старый 30.12.2015, 15:50   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Там ключевое это словарь. Коллекция массивов - это так, один из вариантов собрать данные по ключу.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 30.12.2015, 16:31   #7
peq
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 230
По умолчанию

понял.. уже читаю..
единственный вопрос - а какие предельные размеры одного словаря? например в 2007. по размеру листа 16тыс*1млн? или можно больше?
peq вне форума Ответить с цитированием
Старый 30.12.2015, 16:38   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Размер словаря не знаю, сходите на MSDN. Но думаю скорее упрётесь в память.
Можно обойтись без массива в коллекции, и даже без коллекций вообще - запоминаем в словаре номера строк массива с уникальным ключём (например в строку, но лучше всёж в коллекцию), затем получаем номер строки, по нему из исходного массива значения.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация файла Excel ILF_ollie Microsoft Office Excel 1 09.04.2013 23:52
Увеличение быстродействия -=M{a}LoY=- Общие вопросы C/C++ 6 24.09.2012 23:37
Увеличение быстродействия chui БД в Delphi 5 17.10.2011 15:48
макрос формирования и выгрузки файла txt (оптимизация) v0r0nika Microsoft Office Excel 9 10.10.2011 15:24
Сравнение быстродействия ChaosDev Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 22.11.2010 03:32