Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Ускорить работу макроса

Ответить
Настройки темы
VBA - Ускорить работу макроса

Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Как ускорить работу скрипта?
Код: Выделить весь код
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
А то 2 массива: один 69тыс, второй 500тыс сравнивались друг с другом 6 часов, что мягко говоря ни в какие ворота не лезет. Рассмотрю любые варианты.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 16:25, 30-11-2017

 
y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
правда надо все делать средствами sql встроенными в vba, ТК акссес не у всех есть. »
с SQL надо работать средствами SQL - то есть процедура на сервере которая возвернет таблицу значений, а как это будет инициировано и передано на клиента - это не суть важно.
Быстродействие ПРАВИЛЬНОГО SQL-запроса должно быть зависимым от размера итоговой выборки и слабо зависимо от объема обрабатываемых данных...

Iska,
Цитата Iska:
SELECT можно и для Рабочего листа Excel выполнять, не в том дело. »
дело в производительности - СУБД штука замысловато заточенная под быструю обработку селектов, а в VBA это по-любому курсором будет - то есть производительность в лучшем случае пропорционально n*ln(n) от объема обрабатываемых данных - а это не айс...

-------
Ты это - заходи если что...


Отправлено: 20:25, 01-12-2017 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


y--, у нас ситуация другая. Работать только на текущем пк. С сервера мы только можем запросить отфильтрованные данные. Дальше, если существует такое, создать виртуальные таблицы и работать в них как на сервере. Но как это кодить вообще не знаю. От слова совсем.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 21:02, 01-12-2017 | #22

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


blackeangel,
На текущем компе:
1. Ставим SQL-сервер, создаем пустую базу, создаем две таблицы правильной структуры
2. Разово через DTS заливаем данные в таблицы из двух разных источников данных
3. Пишем нужный селект в виде сторки которая возвращает таблицу нужных данных
4. Настраиваем интерфейс запуска сторки - вот тут мороки больше всего и в зависимости от потребностей конечного пользователя надо будет подобрать нужный инструментарий(и как следствие определиться с видом СУБД).
5. Настраиваем источники ODBC к двум разным источникам данных.
6. В планировщике SQL пишем задания на периодическую синхронизацию с настроенными источниками

-------
Ты это - заходи если что...


Отправлено: 11:15, 02-12-2017 | #23


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата y--:
1. Ставим SQL-сервер, создаем пустую базу, »
Дальше читать не стал, тк нет прав на установку стороннего ПО.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 11:26, 02-12-2017 | #24


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


y--, что-то мне подсказывает, что таким макаром «…и до аэродрома недалеко» .

Отправлено: 11:26, 02-12-2017 | #25


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата Iska:
Я о том, что на всё описанное куча вопросов «Зачем?», «Зачем так?» и «Почему именно так, а не иначе?». »
Так спрашивайте - отвечу. Для этого я тут, чтоб отвечать на вопросы и задавать свои. На то он и форум.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 17:37, 02-12-2017 | #26

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


blackeangel,
Цитата blackeangel:
Дальше читать не стал, тк нет прав на установку стороннего ПО. »
ну я так прикинул - в принципе 6 часов это нормально для используемых методов и имеющихся объемов
Возможная оптимизация времени исполнения в пределах поставленных условий может составлять десятки процентов - то есть(для меня) не имеет смысла и находится в пределах погрешности на загруженность самой системы... Всего лишь замена HDD на SSD(или на RAM-диск) для времени исполнения будет иметь больший эффект.

Iska,
Цитата Iska:
что таким макаром «…и до аэродрома недалеко» . »
когда речь ведется о оптимизации времени исполнения в десятки/сотни раз (на сотни/тысячи процентов) - вправе и ВПП готовить - ну там для легкомоторников хотя бы

-------
Ты это - заходи если что...


Отправлено: 18:56, 02-12-2017 | #27

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


blackeangel,
я к тому что даже без прав на установку софта - я пас... Если админ считает что не надо - значит он прав. Если он не прав - смотри предыдущее предложение.

-------
Ты это - заходи если что...


Отправлено: 19:48, 02-12-2017 | #28


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


y--, самое странное то, что вы предлагаете что то установить, вместо того чтобы работать с имеющейся информацией. Если бы можно было бы ставить, я б поставил, и не упирался бы в оптимизацию кода. К примеру можно было б написать макрос для Акссеса.В акссесе это операция занимает пару минут.

Цитата y--:
Всего лишь замена HDD на SSD(или на RAM-диск) для времени исполнения будет иметь больший эффект. »
это тут каким боком? Все работает в оперативке.

Цитата y--:
Если админ считает что не надо - значит он прав. Если он не прав - смотри предыдущее предложение. »
"Если человек идиот, то это на долго" (с) Брильянтовая рука
А если серьёзно, если админ скажет считать столбиком, вы его послушаете?

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 21:32, 02-12-2017 | #29

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


blackeangel,
Цитата blackeangel:
А если серьёзно, если админ скажет считать столбиком, вы его послушаете? »
если я своим скажу что надо считать на абаке - уточнят что это точно счеты и будут считать на них - мне виднее.

-------
Ты это - заходи если что...


Отправлено: 23:20, 02-12-2017 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Ускорить работу макроса

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход