Скорость обработки 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
Листинг программы
  1. Sub bb()
  2. Const TRASH As String = "|Кондиционеры, вентиляторы|Пылесосы|Блендеры|Чайники|Хлебопечки|" & _
  3.     "Мультиварки|Измерительные инструменты|Светодиодные (LED) лампы, светильники|" & _
  4.     "Дисководы|NAS-серверы, SOHO-серверы|Мыши|Телевизоры|USB флешки|Карты памяти|" & _
  5.     "Кронштейны и VESA-крепления|Источники бесперебойного питания|Сумки, чехлы|" & _
  6.     "Тонеры, фотовалы, пленки|Картриджи|Струйные принтеры|Лазерные принтеры|" & _
  7.     "МФУ струйные|МФУ лазерные|Телефоны, факсы|"
  8.  
  9. Dim v(), li&, lLastRow&
  10. Dim lFirst&                                           'номер 1-й строки блока на удаление
  11. Dim rDel As Excel.Range                               'диапазон на удаление
  12.  
  13. lLastRow = Cells(Rows.Count, 2).End(xlUp).Row         'определяем по 2 столбцу
  14.  
  15. v = Range(Cells(1, 1), Cells(lLastRow, 11)).Value     'массив значений с 1 по 11 столбец
  16. 'lFirst = 1
  17. For li = 1 To lLastRow
  18.   If Not IsEmpty(v(li, 1)) Then                       'непустой 1 столбец
  19.    If InStr(1, TRASH, "|" & v(li, 1) & "|", vbTextCompare) Then  'отстойная категория
  20.      If lFirst = 0 Then lFirst = li                  'устанавливаем начало блока
  21.    Else                                              'НЕ отстойная категория
  22.                                  'добавляем предыдущий блок строк к диапазону на удаление
  23.      If lFirst Then RangeAdd rDel, Range(Cells(lFirst, 1), Cells(li - 1, 1)).EntireRow
  24.       lFirst = 0                                      'признак неотстойной категории
  25.    End If
  26.   End If
  27. Next
  28.                       'если последний блок был отстоем - добавляем к диапазону на удаление
  29. If lFirst Then RangeAdd rDel, Range(Cells(lFirst, 1), Cells(li - 1, 1)).EntireRow
  30.  
  31. rDel.Cut Sheets("Delete").Cells(1, 1)                 'переносим строки на другой лист
  32.  
  33. End Sub
  34.  
  35. Sub RangeAdd(r1 As Excel.Range, r2 As Excel.Range)
  36. If r1 Is Nothing Then
  37.   Set r1 = r2
  38. Else
  39.   Set r1 = Excel.Application.Union(r1, r2)
  40. End If
  41. End Sub

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут