powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ускорение формирования экселовского отчета
36 сообщений из 36, показаны все 2 страниц
Ускорение формирования экселовского отчета
    #32732588
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приходится делать крупный тчет в эксель
это график занятости 200 сотрудников по 2 годам с точностью до дня

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

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

Set XL = CreateObject("excel.Application")

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ЗЫ приятно что мой вопрос вызвал столько откликов. Не думал что можно что - то оптимизировать а тут столько решений ..
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #32733600
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по времени сейчас:

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

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

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

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

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

Формулы, тем более несложные, такого влияния не окажут.
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #32736075
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я видел библиотеки для формирования файла экселя напрямую, но 2года назад разобраться, как их правильно использовать, было ОЧЕНЬ не просто, зато скорости (с чухих слов) в сотни раз больше.

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32736198
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32736262
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergeySV
разница БУДЕТ ощутимой, без если.
Однако, ЕСЛИ ему уастся прийти к приемлемым временам через автоматизацию, то это и будет самый быстрый вариант макроса для непосредственного исполнения в эксель
:)
типа такое мое скромное мнение...
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #32736654
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлексейК

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

Может, покажешь код, которым набираешь строку с диапазоном?
Там наверно, что-то бегающее по рекордсету...
Может кака мысь посетит...
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #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
Ускорение формирования экселовского отчета
    #32737579
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Виктоша
автор
по рекордсету сотрудников
по месяцам полугодия
дням рекодсета месяца текущего сотрудника


все гораздо более сложно чем может показаться на первый взгляд.

1 Учитываются выходные дни и праздники и переносы праздников по компании
2 учитывается прием на работу сотрудника его увольнение и периоды когда он был уволен а потом принят снова
3 учитывается занятость сотрудника в раздичных проектах

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

дабы дать понятие о составе процедурки
вот пример сбора данных о занятости сотрудника в проекте по конкретному дню :

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
ALTER PROCEDURE sotr_project_statusInfo (@Start_date datetime ='20050301'  , @id_p_f_p	int =  11  , 	@id_sotr	int =  551 )
AS

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

SET NOCOUNT ON 

declare @SRC table ( info varchar ( 100 ), 	d1 int , d2 int , d3 int , d4 int , d5 int , d6 int , d7 int , d8 int , d9 int , d10 int , 
			d11 int , d12 int , d13 int , d14 int , d15 int , d16 int , d17 int , d18 int , d19 int , d20 int , 
			d21 int , d22 int , d23 int , d24 int , d25 int , d26 int , d27 int , d28 int , d29 int , d30 int , 
			d31 int )

insert into @src 
select  saved_clientname collate SQL_Latin1_General_CP1251_CI_AS + char( 13 ) + char( 10 )  + prj  as info,
			d1  , d2  , d3  , d4  , d5  , d6  , d7  , d8  , d9  , d10  , 
			d11  , d12  , d13  , d14  , d15  , d16  , d17  , d18  , d19  , d20  , 
			d21  , d22  , d23  , d24  , d25  , d26  , d27  , d28  , d29  , d30  , 
			d31
from dbo.pltime pt inner join dbo.partners_fplan_prop fp on id_p_f_p = idpartners_fplan_prop   where  pt.sumh <>  0   AND pt.id_sotr = @id_sotr and pt.start_date = @start_date  and id_p_f_p <> @id_p_f_p





select
(select top  1  info as sd1 from @SRC pt   where D1 <>  0   ) as d1 , 
(select top  1  info as sd1 from @SRC pt   where D2 <>  0   ) as d2 ,  
(select top  1  info as sd1 from @SRC pt   where D3 <>  0   ) as d3 , 
(select top  1  info as sd1 from @SRC pt   where D4 <>  0   ) as d4 , 
(select top  1  info as sd1 from @SRC pt   where D5 <>  0   ) as d5 , 
(select top  1  info as sd1 from @SRC pt   where D6 <>  0   ) as d6 , 
(select top  1  info as sd1 from @SRC pt   where D7 <>  0   ) as d7 , 
(select top  1  info as sd1 from @SRC pt   where D8 <>  0   ) as d8 , 
(select top  1  info as sd1 from @SRC pt   where D9 <>  0   ) as d9 , 
(select top  1  info as sd1 from @SRC pt   where D10 <>  0  ) as d10 , 
(select top  1  info as sd1 from @SRC pt   where D11 <>  0  ) as d11 , 
(select top  1  info as sd1 from @SRC pt   where D12 <>  0  ) as d12 , 
(select top  1  info as sd1 from @SRC pt   where D13 <>  0  ) as d13 , 
(select top  1  info as sd1 from @SRC pt   where D14 <>  0  ) as d14 , 
(select top  1  info as sd1 from @SRC pt   where D15 <>  0  ) as d15 , 
(select top  1  info as sd1 from @SRC pt   where D16 <>  0  ) as d16 , 
(select top  1  info as sd1 from @SRC pt   where D17 <>  0  ) as d17 , 
(select top  1  info as sd1 from @SRC pt   where D18 <>  0  ) as d18 ,  
(select top  1  info as sd1 from @SRC pt   where D19 <>  0  ) as d19 , 
(select top  1  info as sd1 from @SRC pt   where D20 <>  0  ) as d20 ,  
(select top  1  info as sd1 from @SRC pt   where D21 <>  0  ) as d21, 
(select top  1  info as sd1 from @SRC pt   where D22 <>  0  ) as d22 , 
(select top  1  info as sd1 from @SRC pt   where D23 <>  0  ) as d23 ,  
(select top  1  info as sd1 from @SRC pt   where D24 <>  0  ) as d24 , 
(select top  1  info as sd1 from @SRC pt   where D25 <>  0  ) as d25 ,  
(select top  1  info as sd1 from @SRC pt   where D26 <>  0  ) as d26 , 
(select top  1  info as sd1 from @SRC pt   where D27 <>  0  ) as d27 , 
(select top  1  info as sd1 from @SRC pt   where D28 <>  0  ) as d28 ,  
(select top  1  info as sd1 from @SRC pt   where D29 <>  0  ) as d29 , 
(select top  1  info as sd1 from @SRC pt   where D30 <>  0  ) as d30 , 
(select top  1  info as sd1 from @SRC pt   where D31 <>  0  ) as d31




можно конечно сделать процедуру
собирающую данные из других процедур, но часть логики пока на
клиенте (не всегда нужен отчет по всем сотрудникам и иногда вообще ой алгоритм ...)
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32737825
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот это
Код: 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.
31.
32.
select
(select top  1  info as sd1 from @SRC pt   where D1 <>  0   ) as d1 , 
(select top  1  info as sd1 from @SRC pt   where D2 <>  0   ) as d2 ,  
(select top  1  info as sd1 from @SRC pt   where D3 <>  0   ) as d3 , 
(select top  1  info as sd1 from @SRC pt   where D4 <>  0   ) as d4 , 
(select top  1  info as sd1 from @SRC pt   where D5 <>  0   ) as d5 , 
(select top  1  info as sd1 from @SRC pt   where D6 <>  0   ) as d6 , 
(select top  1  info as sd1 from @SRC pt   where D7 <>  0   ) as d7 , 
(select top  1  info as sd1 from @SRC pt   where D8 <>  0   ) as d8 , 
(select top  1  info as sd1 from @SRC pt   where D9 <>  0   ) as d9 , 
(select top  1  info as sd1 from @SRC pt   where D10 <>  0  ) as d10 , 
(select top  1  info as sd1 from @SRC pt   where D11 <>  0  ) as d11 , 
(select top  1  info as sd1 from @SRC pt   where D12 <>  0  ) as d12 , 
(select top  1  info as sd1 from @SRC pt   where D13 <>  0  ) as d13 , 
(select top  1  info as sd1 from @SRC pt   where D14 <>  0  ) as d14 , 
(select top  1  info as sd1 from @SRC pt   where D15 <>  0  ) as d15 , 
(select top  1  info as sd1 from @SRC pt   where D16 <>  0  ) as d16 , 
(select top  1  info as sd1 from @SRC pt   where D17 <>  0  ) as d17 , 
(select top  1  info as sd1 from @SRC pt   where D18 <>  0  ) as d18 ,  
(select top  1  info as sd1 from @SRC pt   where D19 <>  0  ) as d19 , 
(select top  1  info as sd1 from @SRC pt   where D20 <>  0  ) as d20 ,  
(select top  1  info as sd1 from @SRC pt   where D21 <>  0  ) as d21, 
(select top  1  info as sd1 from @SRC pt   where D22 <>  0  ) as d22 , 
(select top  1  info as sd1 from @SRC pt   where D23 <>  0  ) as d23 ,  
(select top  1  info as sd1 from @SRC pt   where D24 <>  0  ) as d24 , 
(select top  1  info as sd1 from @SRC pt   where D25 <>  0  ) as d25 ,  
(select top  1  info as sd1 from @SRC pt   where D26 <>  0  ) as d26 , 
(select top  1  info as sd1 from @SRC pt   where D27 <>  0  ) as d27 , 
(select top  1  info as sd1 from @SRC pt   where D28 <>  0  ) as d28 ,  
(select top  1  info as sd1 from @SRC pt   where D29 <>  0  ) as d29 , 
(select top  1  info as sd1 from @SRC pt   where D30 <>  0  ) as d30 , 
(select top  1  info as sd1 from @SRC pt   where D31 <>  0  ) as d31
можно и покороче, попробуй динамически+зациклить
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32738053
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если динамически и зациклить - код красивее
если статически - работает быстрее

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


в целом твой вариант именно заполнения выглядит как оптимальный
в своей идее. Cильно он мине приглянулся…
Вот только с перечислением рядом сидящих диапазонов захотелось всё-таки
разобраться.

Вот сваял набросок класса для формирования адресной строки.
Назвал его clsAddressFormatter
метод Function AddCellToAdrRow(tRow As Long, tCol As Long) As Boolean
'tRow - номер строки
'tCol - номер столбца
Предназначен для добавления клетки с указанным номером строки и столбца к
текущему набору адресов.
возвращает логическое значение. Если ложь, значит, класс не сумел
добавить переданные координаты клетки по причине того, что итоговая длина
строки адреса оказывается больше 255 символов. (Я просто поверил, что 255 – граница)

Метод getWorkSheetRange возвращает диапазон Ексель, применив адресную
строку к полученной в качестве параметра объектную переменную рабочего
листа Ексель.

Метод getAddrString возвращает строку адреса для внешнего пользователя,
чтобы он сам с ней обошелся по своему усмотрению

Метод ClearAddress очищает внутренние структуры, подготавливая объект для
формирования новой адресной строки


У меня просьба большая к тебе, - если не сильно затруднит –
опробовать его на своей задаче. И как-то сообщить – насколько что
ухудшилось по времени, иполучилось ли в обмен хоть какое-нибудь удобство
.

Как мне понялось, клетки ты набираешь поштучно, поэтому вставил только
метод добавления одной клетки по номеру строки и столбца.
Хотя для добавления диапазона все готово.


Чистую работу твоего алгоритма он замедлит, возможно, наполовину, но
позволит не заботиться по крайней мере о сплошном диапазоне в строке или
столбце.

Он может и прямоугольные диапазоны формировать, но делает это весьма
неэффективно (мне любопытно было идею увидеть в действии)


Вот на таком скрипте время работы меньше 3 сек
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Sub testMyClass()
  Dim tObj As clsAddressFormatter
  Set tObj = New clsAddressFormatter
  Dim tt As Double
  Dim inDex As Long, jIndex As Long
  Dim wR As Worksheet
  Dim tR  As Excel.Range
  Set wR = Application.ActiveSheet
  
  tt = Timer
  
  With tObj
    .AddCellToAdrRow  5 ,  1 
    .AddCellToAdrRow  6 ,  1 
    .AddCellToAdrRow  1 ,  3 
    .AddCellToAdrRow  1 ,  4 
    .AddCellToAdrRow  1 ,  6 
    .AddCellToAdrRow  2 ,  3 
    .AddCellToAdrRow  2 ,  4 
    .AddCellToAdrRow  2 ,  6 
    
  End With
  
  
  Application.ScreenUpdating = False
  For inDex =  10  To  610 
    For jIndex =  5  To  55   '205 
      tObj.AddCellToAdrRow inDex, jIndex
    Next
    Set tR = tObj.getWorkSheetRange(wR)
    tR.Value = inDex
    tObj.ClearAddress
  Next
  For inDex =  10  To  610 
    For jIndex =  65  To  215 
      tObj.AddCellToAdrRow inDex, jIndex
    Next
    Set tR = tObj.getWorkSheetRange(wR)
    tR.Value = inDex
    tObj.ClearAddress
  Next
  Application.ScreenUpdating = True
  MsgBox Timer - tt
  
End Sub

Извинения за некоторое количество (закладочной) грязи
Все сильно наспех.
Класс требует объявления структуры
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Type tSubArea
  aStartRow As Long
  aStartCol As Long
  bLastRow As Long
  bLastCol As Long
  subAdrLen As Long
  strSubAddress As String *  20 
End Type
Это объявление должно быть размещено в отдельном модуле.
(на всякий случай – в 97 «это» работать не будет)
Текст класса прикладывается
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740439
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока не пробовал
пара вопосов :

нужно чтоб класс запоминал различные типы форматов цвет, значение, примечание

то есть добавить ячейку с цветом зеленый
или значением 8
или с комментарием "qwer"

чтоб класс группировал эти диапазоны по видам формата
может я просто не могу усмотреть где это делается?

а проблему с длинной в 255 можно наверное
решить автовыводом результата когда накапливается скажем больше 200
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740470
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейКпока не пробовал
пара вопосов :

нужно чтоб класс запоминал различные типы форматов цвет, значение, примечание

то есть добавить ячейку с цветом зеленый
или значением 8
или с комментарием "qwer"

чтоб класс группировал эти диапазоны по видам формата
может я просто не могу усмотреть где это делается?

а проблему с длинной в 255 можно наверное
решить автовыводом результата когда накапливается скажем больше 200
класс предназначен ТОЛЬКО для того, чтобы сформировать набор (строго юнион) адресных диапазанов В ВИДЕ СТРОК из тех номеров клеток, которые были отданы ему в виде номера строки и номера столбца.
Он может отдать адресную строку или сформировать диапазон на отданной ему как параметр странице.
Все остальное - значение (или массив значений) для этого диапазона - внешнее по отношению к классу знание.
Ты можешь накапливать по каким-то критериям набор диапазонов
(или коллекцию таких классов, или пользоваться одним экземпляром последовательно) , которому соответствуют те или иные значения и цвета.
Ты можешь при помощи этого класса сформировать объект диапазона.
НО ПРИСВОИТЬ ЗНАЧЕНИЯ И ОТФОРМАТИРОВАТЬ должен сам/
:)


НО
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740474
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без НО
;))

(с выражением лица)
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740914
авторнужно чтоб класс запоминал различные типы форматов цвет, значение, примечание

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


2виктоша
что именно не влезет в 97?
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740933
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
буду посмотреть
<...>
2виктоша
что именно не влезет в 97?

млжет и будет - плохо помню уже как он там обходился с приемом/возвратом пользовательских типов.
остальное влезет.
если с типами проблема, то поменять на вариант и влезет.
....эх, вот только медленный он получился. за ускорением в апи лезть придется, или ваять библиотеку типов. Второе лучше первого но тоже не без проблем...
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32741120
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А диапазон возвращается в виде строки?
Т.е. потом нужно что-то вроде Range(RetAddress).Font.Bold=true?

Просто дело в том что у Ёкселя есть ограничение на количество Area в диапазоне. Поэтому даже выделить(просто тыкая мышкой и держа ctrl, без vba) некое количество несвязанных ячеек не выйдет. А выдать строку с неким набором ячеек можно в принципе проще, самим Ёкселём. Только если она достигнет некоего предела, обработать ее будет нельзя. Единственный выход - разбивать лист на поддиапазоны и их обрабатывать отдельно, но мне кажется это уже криво как-то.

Правда если предположить, что количество несвязанных областей невелико (а судя по примеру так и есть), то может и прокатит.
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32741180
Dim P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много написали, возможно я повторюсь (побежал по диагонали). Позвольте мои 2 копейки. Я в своих программах делаю следующее: в Excel-шаблоне - набор стандартных функций (их 3: для регистрации, для заполнения, для закачки в БД из книги). В приложении соответственные вызовы.
Вызываем регистрацию - Excel возвращает массив заначений, повествующий о том что этому шаблону нужно для настройки. Сохраняем в базе и даем юзеру возможность настроить (минус - юзер настраивает, плюс - однотипные решения накрываются одним шаблоном).
Заполнение - вызываем Excel, создаем документ на основании шаблона, вызываем функцию заполнения - туда в качестве входных параметров, где зарегистрирован (соответственно как настроен), с какой базой работаем, ну и что вам там нужно. Весь код сидит в самом Excele - соответственно количество межпроцессовых взаимодействий минимально (в пределе только вызов функции заполнения). С базами связываться - баз проблем через ADO. Да, если тормозит сильно, еще дополнительно отключаем обновление экрана.
Закачка в БД из отработанного документа (к сожалению бывает и такое) - опасно делать сразу, поэтому делаю в 2 прохода - при первом вызове - есть ли лист ПРОВЕРКИ, если нет - создаем и пишем в него все несуразности, которые обнаружили в процессе эмуляции закачки. Что-то увидели, кроме технологических сообщений - в проверку отдельную книгу, лист удаляем и шлем пользователю - будте добры разбираться, почему такое наваяли. Все нормально - повторный проход с реальной закачкой.
На мой взгляд такой подход позволяет максимально отвязать отчеты от базы и приложения, не загромождая ни то ни другое.
Если немного не в тему, прошу извинить
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ускорение формирования экселовского отчета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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