Скорость обработки 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д