Скорость обработки Excel-файлов - VB
Формулировка задачи:
Всем доброго времени суток, столкнулся со следующим вопросом...
Изначально были написаны макрос в самом эксель-файле, позже через Visual Basic 6.0 решили создать формы\кнопочки и тд, и туда залили макросы. Подключили Microsoft Excel 12.0 Object library дабы VB понимал команды экселя и вуаля, скомпилировали .ехе файл и запустили.
Всё работает, но появилась следующая проблема. если запускать эти макросы напрямую из эксел-файла то они выполняются в 4, а то и 5 раз быстрее, чем через этот ехе-шник.
Как можно увеличить скорость обработки эксель файлов хотя бы до такого же уровня?
может подключить еще какие библиотеки или что...подскажите пожалуйста люди добрые!!!http://i10.pixs.ru/storage/5/2/9/sdadpng_3957652_16100529.png
п.с. в одном из макросов есть банальный цикл, перебрать эксель-файл с 10к строк, на 50 условий если-то, т.е. каждую строку из проверить на 50 условий, и вот сам эксель выполняет этот цикл где то за минуту, а .ехе более 5 минут(сначала думали что он повис вообще, а оказывается нет, просто медленно прогоняет)
Решение задачи: «Скорость обработки Excel-файлов»
textual
Листинг программы
Sub bb()
Const TRASH As String = "|Кондиционеры, вентиляторы|Пылесосы|Блендеры|Чайники|Хлебопечки|" & _
"Мультиварки|Измерительные инструменты|Светодиодные (LED) лампы, светильники|" & _
"Дисководы|NAS-серверы, SOHO-серверы|Мыши|Телевизоры|USB флешки|Карты памяти|" & _
"Кронштейны и VESA-крепления|Источники бесперебойного питания|Сумки, чехлы|" & _
"Тонеры, фотовалы, пленки|Картриджи|Струйные принтеры|Лазерные принтеры|" & _
"МФУ струйные|МФУ лазерные|Телефоны, факсы|"
Dim v(), li&, lLastRow&
Dim lFirst& 'номер 1-й строки блока на удаление
Dim rDel As Excel.Range 'диапазон на удаление
lLastRow = Cells(Rows.Count, 2).End(xlUp).Row 'определяем по 2 столбцу
v = Range(Cells(1, 1), Cells(lLastRow, 11)).Value 'массив значений с 1 по 11 столбец
'lFirst = 1
For li = 1 To lLastRow
If Not IsEmpty(v(li, 1)) Then 'непустой 1-й столбец
If InStr(1, TRASH, "|" & v(li, 1) & "|", vbTextCompare) Then 'отстойная категория
If lFirst = 0 Then lFirst = li 'устанавливаем начало блока
Else 'НЕ отстойная категория
'добавляем предыдущий блок строк к диапазону на удаление
If lFirst Then RangeAdd rDel, Range(Cells(lFirst, 1), Cells(li - 1, 1)).EntireRow
lFirst = 0 'признак неотстойной категории
End If
End If
Next
'если последний блок был отстоем - добавляем к диапазону на удаление
If lFirst Then RangeAdd rDel, Range(Cells(lFirst, 1), Cells(li - 1, 1)).EntireRow
rDel.Cut Sheets("Delete").Cells(1, 1) 'переносим строки на другой лист
End Sub
Sub RangeAdd(r1 As Excel.Range, r2 As Excel.Range)
If r1 Is Nothing Then
Set r1 = r2
Else
Set r1 = Excel.Application.Union(r1, r2)
End If
End Sub