Скорость обработки 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5