|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Ускорить работу макроса |
|
VBA - Ускорить работу макроса
|
Старожил Сообщения: 329 |
Как ускорить работу скрипта?
Sub test() Dim arr1() Application.ScreenUpdating = False 'range и массив рабочей книги ncolumn = Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlWhole).Column Columns(ncolumn + 1).Insert 'вставляем столбец справа Cells(1, ncolumn + 1).Value = "Карточки" 'вставляем заголовок столбца m = ActiveSheet.Cells(Rows.Count, ncolumn).End(xlUp).Row Set rn = ActiveSheet.Cells(2, ncolumn).Resize(m, 2) arr2 = rn.Value Set conn = New ADODB.Connection 'Создание соединения conn.ConnectionString = "Provider=SQLOLEDB.1;Password=132132;Persist Security Info=True;User ID=User;Initial Catalog=dbScanKD;Data Source=SQL05" 'Строка подключения conn.Open 'Открытие соединения Set rst = New ADODB.Recordset ' Создание объекта Recordset. rst.ActiveConnection = conn ' Подключение этого объекта к ранее открытому каналу связи. Ask = "SELECT DISTINCT [Oboznach] FROM [dbScanKD].[dbo].[vwScanKD] Where Not ([Oboznach] Like '%СБ'or [Oboznach] Like '%ТУ' or [Oboznach] Like '%ИМ' or [Oboznach] Like '%ДИ' or [Oboznach] Like '%РР' or [Oboznach] Like '%РИ' or [Oboznach] Like '%УД' or [Oboznach] Like '%ЛУ' or [Oboznach] Like '%ТБ' or [Oboznach] Like '%Э3' or [Oboznach] Like '%ПЭ3' or [Oboznach] Like '%Д7' or [Oboznach] Like '%К3' or [Oboznach] Like '%Д4' or [Oboznach] Like '%ДП' or [Oboznach] Like '%РИ' or [Oboznach] Like '%ПГ3' or [Oboznach] Like '%ПГ4' or [Oboznach] Like '%Г4' or [Oboznach] Like '%Э4' or [Oboznach] Like '%ТЭ4' or [Oboznach] Like '%ПИ' or [Oboznach] Like '%И2')" rst.Open Ask, conn, adOpenStatic, adLockBatchOptimistic ' выполняем запрос. arr1 = rst.GetRows 'закидываем в массив conn.Close 'закрываем соединение arr1 = TransposeDim(arr1) 'переворачиваем массив из строк в столбец через функцию TransposeDim с сайта майкрософт For i = LBound(arr1) To UBound(arr1) For j = LBound(arr2) To UBound(arr2) If Len(arr2(j, 1)) > 0 Then If InStr(1, arr1(i, 0), "СБ") > 0 Then If InStr(arr2(j, 1), "-") > 0 Then m = Left(arr2(j, 1), InStr(1, arr2(j, 1), "-") - 1) + "СБ" If InStr(1, arr2(j, 1) + "СБ", arr1(i, 0), vbTextCompare) > 0 Then If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения arr2(j, 2) = arr1(i, 0) Else arr2(j, 2) = "нет страниц" End If Else If InStr(1, m, arr1(i, 0), vbTextCompare) > 0 Then If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения arr2(j, 2) = arr1(i, 0) Else arr2(j, 2) = "нет страниц" End If End If End If Else If InStr(1, arr2(j, 1) + "СБ", arr1(i, 0), vbTextCompare) > 0 Then If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения arr2(j, 2) = arr1(i, 0) Else arr2(j, 2) = "нет страниц" End If End If End If Else If arr2(j, 2) = Empty Then If InStr(1, arr2(j, 1), arr1(i, 0), vbTextCompare) > 0 Then For k = 1 To UBound(massoboz) If InStr(arr2(j, 1), massoboz(k, 1)) > 0 Then arr2(j, 2) = "нет сборочного" Exit For Else If CInt(arr1(i, 2)) = CInt(arr1(i, 3)) Then 'cравниваем числовые значения arr2(j, 2) = arr1(i, 0) Else arr2(j, 2) = "нет страниц" End If End If Next k End If End If End If End If Next j Next i ActiveSheet.Cells(2, ncolumn).Resize(UBound(arr2), UBound(arr2, 2)) = arr2'вываливаем на лист Application.ScreenUpdating = True End Sub |
|
------- Отправлено: 16:25, 30-11-2017 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Вы проверяли, куда именно уходит время, на какие строки кода? Тупо расставить вывод времени и места в коде в текстовый файл и смотреть?
|
Отправлено: 16:57, 30-11-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Iska, здравствуйте) рад видеть вас) в общем загрузка в массив из запроса примерно 25-30 сек (это те самые 500тыс строк) это знаю точно.
По количеству комбинаций знаю что 34,5 миллиарда. Хотя это не так важно. Завтра посмотрю на время. Придется воспользоваться коллекциями или словарём, если проблема в переборе 2х массивов? |
------- Отправлено: 17:18, 30-11-2017 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата blackeangel:
|
|
Отправлено: 17:49, 30-11-2017 | #4 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Iska, суть проста: берём 1 элемент из arr2( с листа экселя) и проверяем входит ли он в какой либо элемент массива arr1(взятого из sql таблицы). Если есть совпадение то "закидывает" в массив arr2 в соседний столбец массива.
Все остальное это доп надстройки-проверки. |
|
------- Отправлено: 18:23, 30-11-2017 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Там очень много InStr().
|
Отправлено: 18:57, 30-11-2017 | #6 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Iska, это единственное что я знаю на проверку есть ли подстрока в строке.
|
------- Отправлено: 18:59, 30-11-2017 | #7 |
Старожил Сообщения: 231
|
Профиль | Отправить PM | Цитировать blackeangel,
Цитата blackeangel:
СУБД - специализированная система и все такое. Важно только про всякие тримы и тому подобное при переносе не забыть... |
|
------- Отправлено: 09:12, 01-12-2017 | #8 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать y--, вот, тоже вариант, а можно подробнее?
Ссылки, примеры? правда надо все делать средствами sql встроенными в vba, ТК акссес не у всех есть. Потом надо создать виртуальные таблицы, ТК запись на жёсткий ограничена. |
------- Последний раз редактировалось blackeangel, 01-12-2017 в 09:22. Отправлено: 09:17, 01-12-2017 | #9 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Iska, в общем померил время. Все очень и очень грустно. Во первых в память все очень закидывается, аж целую минуту. Выкидывается на лист ещё дольше - 7 минут, все остальное время это цикл.
Для того чтобы понять на сколько все реально плохо решил на 6 строках попробовать. Время выполнения 10 сек. Причем запрос выполнялся 7 сек, все остальное цикл, считывание с листа, запись на лист. Но запрос делается один раз, ему простительно это все. |
------- Отправлено: 12:45, 01-12-2017 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Возможно ли ускорить работу Findstr? | Darkar25 | Скриптовые языки администрирования Windows | 2 | 04-09-2017 23:42 | |
Блог - Как ускорить работу в системе с помощью избранного | Vadikan | Microsoft Windows 7 | 0 | 10-01-2011 10:30 | |
Как ускорить работу FreeBSD? | BSDmaster | Общий по FreeBSD | 9 | 15-09-2007 23:28 | |
Dial up. Как ускорить работу модема? | grob40 | Сетевые технологии | 6 | 12-12-2006 14:56 | |
Как ускорить загрузку и работу Windows? | TVI | Microsoft Windows 2000/XP | 32 | 03-06-2004 16:29 |
|