Скорость обращения к Excel ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
igor_m
Постоялец
Постоялец
 
Сообщения: 343
Зарегистрирован: 22.03.2002 (Пт) 12:40

Скорость обращения к Excel ?

Сообщение igor_m » 27.07.2004 (Вт) 8:13

Быстрее ли будет работать, если данные с xls-листа сначала забросить в массив и затем к нему обращаться? По идее,
Var=W_Excel.Workbooks(1).Worksheets(1).Cells(1,1)
значение берется по адресу в памяти, также как и из массива. Но не знаю, само обращение к объекту и использование его методов требует доп затрат, по сравнению с обращением просто к переменной ?
Вопрос возник потому, как используется многократное обращение к данным с листа.

Alex_new_2030
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 20.02.2003 (Чт) 8:00
Откуда: Kazakhstan

Сообщение Alex_new_2030 » 27.07.2004 (Вт) 8:43

У меня подобная проблема. Делаю прогу на VB. Данные из проги нужно расставить в соответствующие ячейки таблицы ексель и отправить на печать. При частом обращении к ексель и большом количестве данных уходит много времени. А если еще печатаешь данные нескольких человек (данные - база с личными данными людей) то ваще заснуть можно при печати.
я сделал так: в служебном листе документа ексель в 1 ячейку запихал все данные по распределению данных из базы в соответствующие ячейки с каким нибудь знаком препинания (я использовал *). Получатся нечто подобное *данные о 1 ячейки*данные о 2 ячейки*...*данные о N ячейки* (всего около 300 ячеек)
Затем при одном обращении к екселю забираю эти данные в VB а там уже обрабатываю как мне нужно.
А вот уже при вставке готовых данных в форму хочу так же запихать данные в одну ячейку и вызвать макрос из документа ексель, что бы распихол данные по нужным ячейкам. Только пока не знаю как из VB вызвать макрос в открытой книге ексель :oops: . Application.Run говорит что макрос найти не может.
Мне кажется получится минимум общений с ексель и максимум скорости.

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

IMHO

Сообщение TEH3OP » 27.07.2004 (Вт) 9:11

Alex_new_2030 писал(а):Только пока не знаю как из VB вызвать макрос в открытой книге ексель :oops: . Application.Run говорит что макрос найти не может.
Мне кажется получится минимум общений с ексель и максимум скорости.


У меня всё номано работает, вот прототип.

PS: мож ты не полное имя макроса указал? или у тя он не "Public Sub"?
Вложения
P_Office_run_macro_wparams.zip
Собсно оно. Запуск макроса Exel из VB.
(5.94 Кб) Скачиваний: 64

Alex_new_2030
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 20.02.2003 (Чт) 8:00
Откуда: Kazakhstan

Сообщение Alex_new_2030 » 27.07.2004 (Вт) 12:15

PS: мож ты не полное имя макроса указал? или у тя он не "Public Sub"?


Получилось :D !!!
Целый букет нодочетов был. Действительно надо макрос "Public Sub" делать, а так же перед вызовом макроса необходимо активизировать книгу в которой он находится или указывать в какой он находится.
В общем все ОК.
Спасибо.

Только вот еще вопрос можно?
Если в екселе будет стоять защита от макровирусов. Т.е. полное отключение макросов, мой макрос будет выполнятся? Если нет то как можно в екселе программно временно снизить степень защиты от вирусов?

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

Сообщение TEH3OP » 27.07.2004 (Вт) 15:05

Alex_new_2030 писал(а):В общем все ОК.
Спасибо.

Всегда рад помочь. ;-)

Alex_new_2030 писал(а):Только вот еще вопрос можно?
Если в екселе будет стоять защита от макровирусов. Т.е. полное отключение макросов, мой макрос будет выполнятся?

Хм... вы сударь,что-то, простите, ленитесь! Ж8-/
Вам что, самому посмотреть трудно?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.07.2004 (Вт) 15:28

Лучше обойтись без Excel-евских макросов, тем более тут они даром не нужны.

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

Другой способ - когда нужно сбросить табличку отформатировав ее - классический. Пример такого отчетика - в Calssic.bas.

Ну и, скорей всего, самый быстрый метод - сбрасывать в файл самостоятельно, не пользуя объектную модель Excel-я как таковую (это еще лучше и тем что будет работать на машине без Excel).
Это не столь сложно - как пример (там даже класс для этого есть, но я не пробовал его): http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=2246&lngWId=10
Вложения
Sample.rar
(3.21 Кб) Скачиваний: 99
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sslion
Постоялец
Постоялец
 
Сообщения: 334
Зарегистрирован: 12.04.2002 (Пт) 9:44
Откуда: Russia

Сообщение sslion » 28.07.2004 (Ср) 14:40

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

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 28.07.2004 (Ср) 18:30

sslion писал(а):В качестве разделителя данных используй не звездочку, а символ табуляции - это для разделения по ячейкам, и перевод строки, для разделения по строкам.
Тогда при вставке в эксель он автоматом все раскидает по ячейкам - и все это за одно обращение к экселю!

Мысль хорошая, я ее в книге видел но пока непробовал, а раньше делал так: открыл EXCEL и сделал его невидимым, затем в простом цикле перекидывал данные из грида(8 колонок и порядка 1000 строк) перекидывалось секунд за 8-12.

sslion
Постоялец
Постоялец
 
Сообщения: 334
Зарегистрирован: 12.04.2002 (Пт) 9:44
Откуда: Russia

Сообщение sslion » 29.07.2004 (Чт) 8:12

Dzhon писал(а):
sslion писал(а):В качестве разделителя данных используй не звездочку, а символ табуляции - это для разделения по ячейкам, и перевод строки, для разделения по строкам.
Тогда при вставке в эксель он автоматом все раскидает по ячейкам - и все это за одно обращение к экселю!

Мысль хорошая, я ее в книге видел но пока непробовал, а раньше делал так: открыл EXCEL и сделал его невидимым, затем в простом цикле перекидывал данные из грида(8 колонок и порядка 1000 строк) перекидывалось секунд за 8-12.
Ну, дык, сформировать данные в переменной и скинуть за один раз в эксель будет быстрее!
Так и микросотъ рекомендует!

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

И ещё одно предложение.

Сообщение TEH3OP » 29.07.2004 (Чт) 10:58

Я чужие примеры не морел, так шо, если сплагиачу -- сорры...

Можно (да и нужно) записывать данные так:
Код: Выделить всё
Option Explicit

Public Sub Main()
    Dim bstFileName As String
    Dim clsXLApp As Excel.Application
    Dim clsXLWorkBook As Excel.Workbook
   
    'Запустили Exel.
    Set clsXLApp = New Excel.Application
    Set clsXLWorkBook = clsXLApp.Workbooks.Add
       
    'Формируем данные для передачи.
    Dim avntData(3, 5) As Variant
    Dim k As Long
   
    VBA.Randomize
   
    avntData(0, 0) = "Товары"
    avntData(0, 1) = "Мётлы"
    avntData(0, 2) = "Лопаты"
    avntData(0, 3) = "Грабли"
    avntData(0, 4) = "Тряпки"
    avntData(0, 5) = "Совки"
   
    avntData(1, 0) = "Кол-во"
    avntData(2, 0) = "Цена"
   
    For k = 1 To 5
        avntData(1, k) = VBA.CLng(1000 * VBA.Rnd())
    Next k

    For k = 1 To 5
        avntData(2, k) = VBA.CLng(100 * VBA.Rnd())
    Next k
       
    'Записываем.
    Dim clsXLSheet As Excel.Worksheet
   
    Set clsXLSheet = clsXLWorkBook.Sheets.Item(1)
    clsXLSheet.Range("A1:F3").FormulaArray = avntData
    Set clsXLSheet = Nothing
   
    'Закрыли книгу.
    clsXLApp.DisplayAlerts = False
    'Сформировали строку с именем файла
    '("<папка с программой>\test_<дата>.xls").
    bstFileName = VB.App.Path & "\test_" & _
    VBA.Format$(Date, "dd_mm_yy") & _
    ".xls"
    'Сохранили файл.
    clsXLWorkBook.Close True, bstFileName
    clsXLApp.DisplayAlerts = True
    Set clsXLWorkBook = Nothing
   
    'Выходим из Excel.
    clsXLApp.Quit
    Set clsXLApp = Nothing
End Sub


После выполнения этого кода, в папке с кодом появится Excel'евский файл "test_<сегодняшнее число>.xls" с данными из массива avntData.

igor_m
Постоялец
Постоялец
 
Сообщения: 343
Зарегистрирован: 22.03.2002 (Пт) 12:40

Re: Скорость обращения к Excel ?

Сообщение igor_m » 29.07.2004 (Чт) 16:42

igor_m писал(а):Быстрее ли будет работать, если данные с xls-листа сначала забросить в массив и затем к нему обращаться? .


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

Итак, пришлось самому экспериментировать:
Обращение к листу производилось 1 раз, только чтоб загнать данные в массив. Алгоритм не менялся, просто обрабатываемые данные брались уже из массива. Время выполнения задачи уменьшилось в 4 раза.

igor_m
Постоялец
Постоялец
 
Сообщения: 343
Зарегистрирован: 22.03.2002 (Пт) 12:40

Re: Скорость обращения к Excel ?

Сообщение igor_m » 29.07.2004 (Чт) 20:32

Вношу уточнения. Сильно зависит от конфигурации.
На работе Р4 1,4Ггц - разница 36/9сек=4 раза
Дома Р350 разогнан 450 Мгц - разница 1:50/12сек=10 раз.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 5

    TopList