Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ускорение формирования экселовского отчета / 25 сообщений из 36, страница 1 из 2
11.10.2004, 16:19:32
    #32732588
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
приходится делать крупный тчет в эксель
это график занятости 200 сотрудников по 2 годам с точностью до дня

промеры скорости показывают что 95% времени - управление экселом
( форматирование ячеек, вставка примечаний )

вот что уже использую:

Set XL = CreateObject("excel.Application")

XL.Calculation = -4135 ' xlManual
XL.Interactive = False
XL.DisplayAlerts = False
XL.ScreenUpdating = False

все равно медленно.

может еще способы есть?
...
Рейтинг: 0 / 0
11.10.2004, 16:29:27
    #32732620
PA
PA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
Сократить до минимума обращения к OLE-объектам. Например, ячейки с одинаковым форматированием обрабатывать не по одельности, а одной командой(скопом, так сказать). Или вообще использовать книгу-шаблон, которая сама себя будет форматировать(т.е. будет содержать в себе форматирующий код)...
...
Рейтинг: 0 / 0
11.10.2004, 16:43:32
    #32732685
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
АлексейК
<...>
промеры скорости показывают что 95% времени - управление экселом
( форматирование ячеек, вставка примечаний )

<...>
я бы сказал - 95% времени - управление "полем печати", буде оно затрагивается.

РЗЫ
совет PA абсолютно универсально правильный.

Вариация на тему - копировать форматы с образцов на фактические диапазоны

альтернативы - 1) пробовать owc.Spreadsheet.10 с последующим сохранением в книгу. (плюс - inprocess dll)

2) ваять файл напрямую
...
Рейтинг: 0 / 0
11.10.2004, 21:15:07
    #32733084
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
АлексейКXL.Calculation = -4135 ' xlManual
Формулы, наверное, есть?

АлексейКпромеры скорости показывают что 95% времени - управление экселом
Из них 80% - работа самого Ёкселя по расчетам формул. Наверное, все, что можно считать jet'ом, лучше им и считать. Кстати, .Calculation не оказывает влияния, по крайней мере, если вставлять формулы после заполнения ячеек, которые они считают.

А вот и пример (запускать макрос "run me" или отчет - последний работает по результатам макроса):
...
Рейтинг: 0 / 0
11.10.2004, 21:28:01
    #32733089
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
Выложу и график.

Ордината - время работы екселя.
Абсцисса - количество заполняемых ячеек, от 100 до 6000 с шагом 100.

График "значений" показывает время заполнения числами и форматирования диапазона из соответствующего числа ячеек.

График "формул" - вставки соответствующего количества формул, суммирующих такое же количество ячеек с числами.

График "формул без пересчета" - то же, что и предыдущее, только с .Calculation=-4135.
...
Рейтинг: 0 / 0
12.10.2004, 09:14:51
    #32733256
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
да уж, гео научно подошел к вопросу....

в самом деле у меня формул на листе все го порядка 200 - 300 выходит ,
но по любому лучше их будет вставлять в конце скрипта.

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

наверное можно результат накапливать в массивах а потом выносить в эксел скопом, но это еще надо придумать как сделать...

а вот по owc.Spreadsheet.10 идея нова для меня.
этот контрол обладает всем функционалом ёкселя? примечания поддерживает?
...
Рейтинг: 0 / 0
12.10.2004, 09:42:13
    #32733302
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
так же:
- убрать нафиг все надстройки - книга будет окрыватся гораздо быстрей (помню после установки промпта с екцелевской надстройкой и включном антивирусе - файл окрывался около 30 сек)
- отключить антивирус
- проверить сам екцелевский файл (был у меня один такой: все аналогичные ему открываются 1 сек, этот более 5. Оказалось (почему-то) что при загрузке он окрывает панель отправка почты и грузит компоненты отлука (видно по SPY++).

Далее оптимизация по коду:
(может ты это и так пресно знаешь, но все же...):
- работать с ецелем гораздо (на порядок) быстрей с объектом Range в котором находится массив обрабатываемых строк. Т.е. удалять и форматировать не построчно, а сразу кучей строк.

>>наверное можно результат накапливать в массивах а потом выносить в эксел скопом, но это еще надо придумать как сделать...

Лучше через CopyFromRecordSet
...
Рейтинг: 0 / 0
12.10.2004, 10:06:38
    #32733339
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
авторЛучше через CopyFromRecordSet

проблема в том что не столько много данных сколько раскраска, формат, вставка примечаний

предполагаю что именно примечания тормозят вывод

вот фрагментик чтоб было представление о чем речь
...
Рейтинг: 0 / 0
12.10.2004, 10:20:12
    #32733367
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
Есть подозрение, что АлексейК имеет случай, когда формулы стоящие в ячейках есть выражение ссылающееся на другие ячейки, которые представляют собой тоже формулы и так достаточно большой уровень вложенности, если это так так к примеру у меня такой случай привёл к таким показателям скорости выгрузки
120 записей, 4 уровня вложенности - получение нужного массива я для выгрузки 2 сек, передача в Excel - 20 сек (форматирование ячеек и
сама передача + группировка), в моём случае шаблон не применим из-за варируемости входных данных, т.е. форматирование ячеек при экспорте.
...
Рейтинг: 0 / 0
12.10.2004, 10:56:40
    #32733454
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
2 Proga

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

думаю должно помочь вставка формул последним действием - после вставки значений

ЗЫ приятно что мой вопрос вызвал столько откликов. Не думал что можно что - то оптимизировать а тут столько решений ..
...
Рейтинг: 0 / 0
12.10.2004, 11:39:20
    #32733557
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
owc.spreadsheet комментариев не поддерживает.

а медленно - это СКОЛЬКО времени? грубо - больше 7-10 сек или меньше?


Если меньше - я бы сначала отдышался, прежде чем "опимизировать", если больше 30 - точно засучивать рукава надо.

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

Если у тебя количество (межпроцессных) передач данных порядка количества заполняемых ячеек - НЕМЕДЛЕННО выкинуть и переделать. - За вычетом времени подъема екселя выиграешь порядки по времени.

идти надо строго по дороге PA

вот как, например, можно задать цвет столбцам с нерабочими днями (стиль ссылок A1C1)

With Range("B:C,H:I,M:N")
.Font.ColorIndex = 3
With .Interior
.ColorIndex = 36
.Pattern = 1 'xlSolid
.PatternColorIndex = -4105 'xlAutomatic
End With
End with

все-таки, попробуй сократить для начала суммарное количество вызовов по присвоению значений.
...
Рейтинг: 0 / 0
12.10.2004, 11:58:54
    #32733600
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
по времени сейчас:

грубо если отчет на один лист (по полугодию)
и по группе из 10 человек - около 10 сек

если порядка 300 человек и 4 листа (за 2 года) то до 30 минут

сейчас пробую оптимизацию формул.
...
Рейтинг: 0 / 0
12.10.2004, 12:34:30
    #32733721
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
О-го!!

Тогда целиком присоединяюсь к словам PA и Виктоши. Уменьши количество обращений к экселю. Формируй строки обращений в акцессе ("A:B, F:G, L:M") и обрабатывай диапазоны скопом. То, что ставится по умолчанию (xlSolid и т.п.), не переставляй еще раз. Все, что можно ставить CopyFromRecordset, им и ставь. Лучше сделать несколько запросов, если в один данные не влазят, и из них группами покласть.

Посчитал на медленной машине:
заполнение и форматирование 1000 ячеек ёкселя по одной из акцесса на небыстрой машине - 32.6 сек,
заполнение и форматирование 10 раз по 100 ячеек - 0.74 сек.

Формулы, тем более несложные, такого влияния не окажут.
...
Рейтинг: 0 / 0
12.10.2004, 12:46:51
    #32733769
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
А никто не пробовал ХМЛ слепить типа

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"><?xml version="1.0"?>
....

а потом скормить его Excel'ю?
...
Рейтинг: 0 / 0
12.10.2004, 15:41:48
    #32734367
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
Alexey ShА никто не пробовал ХМЛ слепить типа

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"><?xml version="1.0"?>
....

а потом скормить его Excel'ю?

пробовал, оч. карашо,ОЧ. Могло бы заменить трансфер с усбехом, но

1) нет времени привести в приличный вид
2) разница в размерах файла с "родным" форматом нелинейно растет при увеличении числа заполненных клеток. что-то типа - xls - 400К, xml - 2M
При этом на коротких таблицах из нескольких клеток - ровно наоборот - xml заметно компактнее xls.
3) с картинками, кажется, проблема. баловался в начале года, подробностей не помню.
4) усбех начиная с ексель2002, в 2000, все-таки, похоже надо html ваять, и формат его (того html-a) кажется умирающим.
Примечания, между прочим, точно сохраняются.

Нет уверенности, что доделаю, однако интерес есть, т.к. может оказаться в некоторых ситуациях наилучшим решением.
...
Рейтинг: 0 / 0
13.10.2004, 10:22:02
    #32735499
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
снова засада
вместо форматирования по ходу кода решил собрать для одинаковых типов
ячеек строковые переменные со списком ячеек региона и трабл

параметр метода range и функции convertformula не может быть больше
256 символов



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 'в коде в цикле собирается строка: 
        FormatGrayMinus = FormatGrayMinus & "," & "R" & CRow & "C" & foundcol
          '.cells(CRow, foundcol).Interior.ColorIndex = 15 
          '.cells(CRow, foundcol).FormulaR1C1 = "-" 


 'в конце: 

If Len(FormatGrayMinus) >  0  Then
FormatGrayMinus = Mid(FormatGrayMinus,  2 )
 'Debug.Print FormatGrayMinus 
 'типа : R9C4,R9C5,R9C6,R9C7,R9C8,R9C9,R9C10,R9C11,R9C12,R9C13,R9C14,R9C15,R9C16 

With XL.range(XL.ConvertFormula(FormatGrayMinus, - 4150 ,  1 ))
         .Interior.ColorIndex =  15 
         .FormulaR1C1 = "-"

блин придется бить строку на куски
...
Рейтинг: 0 / 0
13.10.2004, 11:17:24
    #32735674
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
про длинную строку - отдельно, про стиль ссылок отдельно

про стиль - просто установи нужный на этапе вычислений
dim oldStyle
oldStyle=XL.ReferenceStyle
XL.ReferenceStyle = -4150 'xlR1C1
'много вычислений
'...
'возвращаем
'XL.ReferenceStyle = 1 'xlA1
XL.ReferenceStyle =oldStyle

про длину строки
в любом случае
'типа : R9C4,R9C5,R9C6,R9C7,R9C8,R9C9,R9C10,R9C11,R9C12,R9C13,R9C14,R9C15,R9C16

лучше привести к виду
'типа : R9C4:R9C16
у тебя же клетки в строке подряд идут
...
Рейтинг: 0 / 0
13.10.2004, 11:57:45
    #32735811
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
Добавлю и я что ли пару строчек от себя. Самому приходится постоянно работать с выводом отчетом в Excel. Тут все правильно сказали, что главный тормоз - это обращение к Excel (как вариант уменьшения кол-ва раз обращений к Excel через макс. общие инструкции уже предлагали).... обращение к Excel именно через OLE-COM.
Знакомая многим фишка в том, что макрос запускаемый из Access (через CreateObject(Excel.Application)) работает медленнее чем если бы этот же макрос запускали в САМОМ Excel'е. Однако не многие наверное знают, что для при частых обращениях в макросе к Excel через OLE, эта разница может быть в разы. Как вариант можно предложить АлексейК засунуть этот макрос в Excel и сообщить нам за сколько он отработал. Если разница будет очень ощутимой, можно подумать о том, чтобы не заниматься управлением Excel'ем через OLE, а просто запускать макрос в самом Excel'е. Макрос может быть уже записан там (в том же Personal.xls) или записать его в Excel на лету через библу VBIDE.
...
Рейтинг: 0 / 0
13.10.2004, 13:02:34
    #32736075
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
Я видел библиотеки для формирования файла экселя напрямую, но 2года назад разобраться, как их правильно использовать, было ОЧЕНЬ не просто, зато скорости (с чухих слов) в сотни раз больше.

IMHO, Mon$te®
...
Рейтинг: 0 / 0
13.10.2004, 13:35:28
    #32736198
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
...
Рейтинг: 0 / 0
13.10.2004, 13:56:00
    #32736262
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
2 SergeySV
разница БУДЕТ ощутимой, без если.
Однако, ЕСЛИ ему уастся прийти к приемлемым временам через автоматизацию, то это и будет самый быстрый вариант макроса для непосредственного исполнения в эксель
:)
типа такое мое скромное мнение...
...
Рейтинг: 0 / 0
13.10.2004, 15:44:28
    #32736596
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
пока сделал функцию которой скармливаю диапазон ячеек в формате R1C1
и нужный формат она бъет регион на куски порядка 200 символов
и применяет к глобальному обекту эксел

сейчас лист из порядка 300 * 200 ячеек разрисовывает и заполняет данными около 10 секунд

супротив 15 минут в предыдущем варианте существенный прогресс

можно конечно подумать о оптимизации диапазонов:
R1C1,R1C2,R1C3 - > R1C1:R1C3
но пока ничего быстрого не приходит в голову


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Private Sub ExcelOut(OutRange As String, CellValue As String, CellFormat As String)
Dim rng
Dim zpta200
 
If Len(OutRange) =  0  Then Exit Sub
OutRange = Mid(OutRange,  2 )  'Обрезка первого разделителя 

While OutRange <> ""
    zpta200 = InStr( 200 , OutRange, ",", vbTextCompare)  'Ищем позицию разделителя после 200 позиции 
    If zpta200 <>  0  Then
        rng = Left(OutRange, zpta200)
        If Right(rng,  1 ) = "," Then rng = Left(rng, Len(rng) -  1 )
         'Debug.Print rng 
        OutRange = Mid(OutRange, zpta200 +  1 )
     Else
        If OutRange = "" Then Exit Sub
        rng = OutRange
        OutRange = ""
    End If
    rng = XL.Application.ConvertFormula(rng, - 4150 ,  1 ,  4 )
     'Debug.Print rng 
    rng = Replace(rng, ",", ";", , , vbTextCompare)
    With XL.Range(rng)
        If CellValue <> "" Then .FormulaR1C1 = CellValue
        If CellFormat <> "" Then .Interior.ColorIndex = CellFormat
    End With
Wend



End Sub




в данный момент мне быстрее и не надо так как планирую запихнуть
форматирование эксела в область ожидания ассинхронной загрузки данных
...
Рейтинг: 0 / 0
13.10.2004, 16:02:37
    #32736654
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
2 АлексейК

Поздравляю прогрессом ;)
Дальше улучшения, конечно, не так заметны будут, но, все-таки как-то
нездорово у тебя со строкой диапазонов вышло...

Может, покажешь код, которым набираешь строку с диапазоном?
Там наверно, что-то бегающее по рекордсету...
Может кака мысь посетит...
...
Рейтинг: 0 / 0
13.10.2004, 16:48:35
    #32736801
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
по рекордсету сотрудников
по месяцам полугодия
дням рекодсета месяца текущего сотрудника
проверка условий на форматирование и набор строк типа:
if ..
FormatYelow = FormatYelow & "," & "R" & CRow & "C" & foundcol
else
FormatGreen = FormatGreen & "," & "R" & CRow & "C" & foundcol


в конце вызов процедуры форматирования этих диапазонов:

Call ExcelOut(FormatYelow, "", 36)
Call ExcelOut(FormatGreen, "", 4)
Call ExcelOut(FormatGrayMinus, "-", 15)
Call ExcelOut(Format8, "8", "")
Call ExcelOut(FormatSUMH, "=SUM(RC[1]:RC[222])", "")
...
Рейтинг: 0 / 0
13.10.2004, 18:05:43
    #32737008
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение формирования экселовского отчета
авторпо рекордсету сотрудников
по месяцам полугодия
дням рекодсета месяца текущего сотрудника
вопрос:
это один запрос с джойном или 3 вложенных цикла?

там еще комментарии с именами пректов проскакивали.

вечером поковыряю в носу.
Все таки полный код на тек. момент лучше было бвидеть.
Ну, что-нибудь придумается....
(на вопрос: можно и не отвечать, если выложить структуру базы с примером заполнения на 2-3 строки, или тестовый файлик с кодом с прмером
заполнения- если вырезается недолго)

как накладываются
8
36
4
15

на данные
8 - видимо работал(?)
36 - выходной?
4-15 прогул-бюллетень?

ЗЫ
по заявленному, делал, наверно бы так -
1) сваял левый джойн календарной таблицы на сотрудников и табель
2) вычитал его в массив за раз (ADODB.Recordset.GetRows)
3) по размеру получившегося массива посчитал бы границы диапазона
4) типа MyRange.VAlue = XL.WorksheetFunction.Transpose(MyArrayFromDB)
5) добавил бы итоговый столбец
6) форматировал - возможно, хватило бы условного форматирования.


где-то рядом перекресные таблицы со сводными запросами лежали
- тоже можно поковырять, но на бегу очевидного предложения пока нет.

Между прочим, xml-выгрузка тоже должна хорошо смотреться. Хотя по совокупности, может и не обгонит...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ускорение формирования экселовского отчета / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]