Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 36

Тормоза в Excel

03.11.2010, 12:22. Показов 1573. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
VB пишет в ячейку Excel намного медленнее, чем VBA. Не поленился, прогнал один и тот же код сначала в VB, потом в VBA. Почти в 8 раз медленнее! Может, я что-то не то делаю ?
VBA:
Visual Basic
1
2
3
4
5
6
7
8
9
Sub Макрос14()
Dim i, sT1, sT2
   sT1 = Timer
   For i = 1 To 200000
      ActiveWorkbook.ActiveSheet.Cells(1, 1).Value = '1'
   Next i
   sT2 = Timer
   MsgBox sT2 - sT1
End Sub
Результат - 64,7 секунды

Visual Basic:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim xl As Excel.Application
Public Sub form_activate()
Dim i, sT1, sT2   
   Set xl = New Excel.Application
   xl.Workbooks.Add
   sT1 = Timer
   For i = 1 To 200000
      xl.ActiveWorkbook.ActiveSheet.Cells(1, 1).Value = '1'
   Next i
   sT2 = Timer
   MsgBox sT2 - sT1
End Sub
Результат - 486,7 секунды

Вопрос важен, т.к. приходится генерить отчеты из оракловой базы, и при работе в VB ощутимо всё тормозит.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2010, 12:22
Ответы с готовыми решениями:

Тормоза в Excel при открытии и закрытии одного файла с программой на VBA
Проблема такая : Жутко тормозит Excel (минут 15) при открытии и закрытии одного файла с программой на VBA. На других компьютерах ничего...

Word automation + Windows server 2008 R2 = тормоза(очень сильные тормоза)
Здравствуйте! Есть код, написанный правда на делфи, который экспортирует содержимое ТХТ файла в DOS кодировке в WORD. Попутно, если...

Тормоза с Windows XP
Недавно удалил Avast и поставил лицензионный Доктор Веб. Начались проблемы - открытие любых файлов идет на тормозах. Объсните, в чём...

10
0 / 0 / 3
Регистрация: 28.01.2010
Сообщений: 279
03.11.2010, 12:45
А ты чего хотел? Ты ведь из VB создаешь объект и обмениваешся с ним через внешний драйвер, а в VBA напрямую. НО в твоем случае можно немного сократить время выполнения, засеть все переменные вплоть до листа, чтобы каждый проход прога не обращалась к свойствам объекта.
Visual Basic
1
2
3
4
5
6
7
8
9
10
SET AppExcel=(',Excel.Appliction')
SET wBook=AppExcel.Workbok.Add
SET wSheet=wBook.Worksheets(1)
For i=1 to 200000
wSheet.Cells(i,1).value=i
next i
 
SET wSheets=nothing
SET wBook=nothing
SET AppExcel=Nothing
0
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
03.11.2010, 13:02
И еще вот так добавь:
Visual Basic
1
2
3
4
5
With wSheet
For i=1 to 200000
.Cells(i,1).value=i
next i
End with
это оптимизация даст прирост производительности на несколько секунд.
А все остальное XPRaptor тебе уже написал

Еще можно заранее объект Excel открыть в начале работы проги, если ты конечно экспорт многократно используешь. И переменные не забудь явно объявлять:
Visual Basic
1
Dim i as Integer
0
Comanche
03.11.2010, 14:08
Ну и вместо 'next i' использовать просто 'next', коль пошла такая пьянка...

Ну а вообще-то - если условия задачи позволяют - лучше написАть всё в виде VBA-макроса (в книге или XLA-надстройке) и из VB его запускать (AppExcel.Run <...>).
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 36
03.11.2010, 14:53  [ТС]
Всё сделал, получил 308 секунд. Лучше, но несравнимо с VBA.
Попробую XLA-надстройку.
0
Comanche
03.11.2010, 15:53
Можно, кстати, обойтись и без надстройки - создав из VB книгу и прописав в неё VBA-код 'на лету'. Для этого создай VB-проект, подключи к нему Microsoft Excel Object Library, а также библиотеку Microsoft VBA Extensibility. Затем создай в проекте вот такую процедуру:
Visual Basic
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
Sub MakeNewModule()
    Dim excelApp As Excel.Application
    Dim oComponents As VBComponents
    Dim codeFile As String
    ' определяем имя файла, в котором содержится наш VBA-код, критичный в плане быстродействия:
    codeFile = 'C:MyVbCode.txt'
    ' создаём новую книгу:
    Set excelApp = New Excel.Application
    With excelApp
        .Workbooks.Add
        Set oComponents = .ActiveWorkbook.VBProject.VBComponents
        ' добавляем в эту новую книгу VBA-модуль:
        oComponents.Add vbext_ct_StdModule
        ' именуем добавленный модуль ('для красоты'):
        oComponents(oComponents.Count).Name = 'NewModule'
        ' вставляем в него код, взятый из файла:
        oComponents(oComponents.Count).CodeModule.AddFromFile codeFile
        Set oComponents = Nothing
        ' сохраняем новую книгу:
        .ActiveWorkbook.SaveAs 'C:MyNewBook.xls'
        ' запускаем макрос (предполагаем, что в «MyVbCode.txt» есть процедура «Sub HELLO»):
        .Run 'HELLO'
        .Quit
    End With
    Set excelApp = Nothing
End Sub
Comanche
03.11.2010, 15:57
PS: можно добавлять код не из файла, а из строки (AddFromString) - в таком случае удобно эту строку читать из файла ресурсов; это позволит в итоге иметь только один EXE-шник и не таскать с ним TXT-файл с кодом VBA-макроса. Кстати, этот механизм иногда используется некоторыми вирусописателями, туды их растуды.
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 36
07.11.2010, 18:57  [ТС]
заработало ! Спасибо большое !
0
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 36
07.11.2010, 19:02  [ТС]
Кстати, долго промучался с тем, что не находился макрос в только что созданной книге. Практически случайно обнаружил, что ошибка исчезает, если перед запуском макроса активировать книгу xls.Activate
0
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 36
08.11.2010, 10:33  [ТС]
Помогите еще одним советом.
Процедура, которая лежит в файле с ресурсами:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub Populate( _
   arr() As Variant, _
   ByRef ws As Worksheet, _
   Optional ByVal firstRow As Integer = 1, _
   Optional ByVal firstColumn As Integer = 1
   )
   Dim i As Integer, j As Integer   
   With ws
      For i = 0 To UBound(arr, 1)
         For j = 0 To UBound(arr, 2)
            If Not IsEmpty(arr(i, j)) And arr(i, j) <> '' Then
               .Cells(j + firstRow, i + firstColumn).Value = arr(i, j)
            End If
         Next j
      Next i
   End With
End Sub
Всё нормально работает, если лист перед этим был только что создан. Но если его перед этим отформатировать(раскрасить ячейки, расставить жирные границы и т.п.), то начинает сильно тормозить. Можно с этим как-нибудь бороться ?
0
0 / 0 / 0
Регистрация: 03.08.2009
Сообщений: 36
08.11.2010, 12:08  [ТС]
Всё, разобрался. Просто у листа была включена опция 'Вид->Разметка страницы', и он в цикле размечал его.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2010, 12:08
Помогаю со студенческими работами здесь

Тормоза компьютера
Компьютер: Ноутбук. Win8 Максимальная 64 бит. После включении системы на рабочем столе не загружаются файлы/ярлыки/иконки, а лишь...

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

Тормоза HDD
Всех приветствую! Подскажите пожалуйста возможно ли починить HDD или на помойку? Небольшая предистория: частенько выскакивали уведомление...

Тормоза 4790K
Не могу понять почему старенький i7 930 при загрузке 100% давал какие-то ресурсы системе, а 4790K при 100% не дает даже плавно передвинуть...

Тормоза из за вируса
Начались нереальные тормоза,проверил DrWeb почистил вирусы,но лаги остались,в диспетчере странный процесс exploer.exe который грузит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru