Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908

Ускорить работу макроса

30.11.2017, 16:27. Показов 5724. Ответов 117
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как ускорить работу скрипта?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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 часов, что мягко говоря очень медленно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2017, 16:27
Ответы с готовыми решениями:

Как ускорить работу макроса
Привет всем! Есть файл, там макрос. Макрос вычисляет наилучший доход. Макрос работает 10 минут. Это очень долго. Как ускорить работу...

Можно ли ускорить работу макроса
Здравствуйте!) У меня вот такой вопрос...возможно ли каким то образом ускорить работу макроса? Если на С++ перенести ускорится?

Как можно ускорить работу макроса Excel с большим кол-вом итерационных циклов?
Есть задача, которую решил, но хотел бы ускорить работу. Проблема в том что суть программы пройти по строкам и столбцам в 1 таблице,...

117
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
30.11.2017, 16:33
Привлекайте коллекцию или словарь.
Больше без собственно задачи и данных не скажу, голову ломать вычитывая код желания нет.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 16:39
Никто не будет это разбирать, Hugo121, меня опередил высказыванием
мой текст был побольше но смысл тот-же
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
30.11.2017, 16:53
Да, базу давать не нужно, дайте уже готовых два массива (можно два диапазона листа строк по 50) и опишите задачу (покажите нужный результат) - и кто-нибудь перепишет строки ниже 20-й.

Добавлено через 1 минуту
P.S. там ещё какой-то massoboz... Давайте 3 массива, или сколько их там...
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 18:37  [ТС]
fever brain, Hugo121,
суть проста: берём 1 элемент из arr2( с листа экселя) и проверяем входит ли он в какой либо элемент массива arr1(взятого из sql таблицы). Если есть совпадение то "закидывает" в массив arr2 в соседний столбец массива.
Все остальное это доп надстройки-проверки.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
30.11.2017, 18:40
Цитата Сообщение от blackeangel Посмотреть сообщение
проверяем входит ли он в какой либо элемент массива
- частично? Если частично - боюсь что коллекция/словарь не помогут.
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 18:43  [ТС]
Hugo121, именно частично, в противном случае можно было бы тупо запросом все сделать.
Мне кто то когда то говорил что это можно при помощи словаря сделать. Но не помню кто это был.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 18:44
Тебе надо организовать быстрый поиск
но для этого используемый для этого массив должен быть упорядочен, улавливаешь?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
30.11.2017, 18:45
Словарём нельзя. Вернее можно так же как и с массивом перебирать ключи в цикле, но это шило на мыло...
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 18:47  [ТС]
fever brain, так, а с этого момента по подробнее?
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 18:48
Цитата Сообщение от blackeangel Посмотреть сообщение
69тыс
если сделать по моим рекомендациям твоя программа выполнится менее чем за секунду
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 18:51  [ТС]
Hugo121, fever brain, вас с первого взгляда не насторожили такие строки в коде?
Visual Basic
1
If InStr(1, arr2(j, 1), arr1(i, 0), vbTextCompare) > 0 Then
Добавлено через 2 минуты
fever brain, допустим массив с листа упорядочен по возрастанию(накинул фильтр отфильтровать, уберу фильтр) чем это поможет? Все записи уникальные. В массиве из запроса(500тыс) все записи уникальные.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
30.11.2017, 18:51
Я эти строки видел, но я так же видел и много разных других кодов и юзеров... Поэтому пока не вижу данных и задачи -я не ставлю диагноз.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 18:54
1 переписываеш массив из твоей базы или что там еще
2 упорядочиваеш по возрастанию

3 есть хороший алгоритм быстрого поиска с разделяющим значением его и используй

Добавлено через 1 минуту
Если тебе подойдет это направление то скину эти методы как это сделать

Добавлено через 1 минуту
этим подходом можно также быстро найти приближенный элемент в массиве в случае его отсутствия
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 18:56  [ТС]
fever brain, в базе упорядочено уже по возрастанию. Допустим что оба массива упорядочены по возрастанию. Чем это ускорит работу? Значения в этих массивах буквенно-числено-символьные, пробелов нет.

Добавлено через 1 минуту
fever brain, в общем я заинтересован
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 19:03
Цитата Сообщение от blackeangel Посмотреть сообщение
в базе упорядочено уже по возрастанию
Упорядоченность тоже разная бывает
условия поиска должны соответствовать тому условию как было упорядоченно
если ты говориш буквенно-числовая значит это скорее всего текстовая упорядоченность
числовая от текстовой сильно отличается

смотри как будет выглядеть текстовая упорядоченность

11
2
22

и как числовая

2
11
22
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 19:07  [ТС]
fever brain, не, нас Буковки сначала сортируются по алфавиту, затем цифирки по возрастанию, а затем снова буковки или цифирки, если есть. В результате более менее что то нормальное.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 19:33
В методах баз данных должны быть и методы поиска
но если что... могу скинуть код быстрого поиска половинчатого деления
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Function BinarySearch(List As Variant, target As Long) As Long
    Dim min As Long
    Dim max As Long
    Dim middle As Long
 
    NumSearches = 0
    min = 1
    max = NumItems
    Do While min <= max
        NumSearches = NumSearches + 1
        
        middle = (max + min) / 2
        If target = List(middle) Then
            BinarySearch = middle
            Exit Function
        ElseIf target < List(middle) Then
            max = middle - 1
        Else
            min = middle + 1
        End If
    Loop
    BinarySearch = 0'здесь можно поставить -1 кому как удобнее
End Function
Добавлено через 1 минуту
результатом будет индекс искомого элемента (target) в массиве list
1
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 19:35  [ТС]
fever brain, не long а string должно быть, у меня стринговые данные на листе. Ищутся в таблице со стрингами. Или все равно?
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 19:37
Цитата Сообщение от blackeangel Посмотреть сообщение
не long а string должно быть
Возвращаемое значение это индекс массива твоего, поэтому числовой тип long
если имееш ввиду аргумент target то измени на variant и все
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2017, 19:37
Помогаю со студенческими работами здесь

Ускорить код макроса
Привет! Пожалуйста подскажите как можно ускорить код одна строяка выполняется 5 секунд, а у меня их чуть больше миллиона, но прикидкам...

Ускорить действие макроса переноса данных на другой лист
Здравствуйте, имеется макрос для переноса данных на другой лист, но когда данных много (например: около 2000 тыс строк) он начинает...

Ускорить работу кода
Привет всем, Столкнулся с такой проблемой, что мне нужно, что бы код находил нужную ячейку и удалял всю строку со смещением вверх...

Как ускорить работу пользовательской функции с диапазонами
Добрый день всем!! Имеется пользовательская функция работы с одним и тем же диапазоном ячеек, в качестве одного из объявленных...

Как прекратить работу макроса?
Кроме goto к метке в конце программы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru