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