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

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

30.11.2017, 16:27. Показов 5804. Ответов 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
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:00
Студворк — интернет-сервис помощи студентам
Может ты еще не понял
ты сортируешь либо строку либо столбец, заметь я еще не знаю всей твоей задачи
что вообще ты там сортируешь, но ты говорил что использовать нужно именно двумерный массив
значит делаешь цикл в котором будут просматриваться либо столбцы либо строки как будет удобнее в твоей
задаче

в теле этого цикла иксом будет значения столбцов
а процедура сортировки будет упорядочивать каждую строку

Visual Basic
1
2
3
For x= lbound(arr,1) To Ubound(arr,1)
  qSort arr, x, lbound(arr,2), ubound(arr,2)
next
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:00  [ТС]
fever brain, так подразумевалось все это хозяйство?
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
'qSort a, LBound(a), UBound(a), 1 ' Быстрая сортировка
Sub qSort(Arr, i&, j&, x&) 'Сортировка скоростной способ (рекурсия)
    Dim ii&, jj&, s$, t$
 ii = i
 jj = j
 s = Arr((ii + jj) \ 2, x)
    Do Until ii > jj
    Do While Arr(ii, x) < s
    ii = ii + 1
 Loop
Do While Arr(jj, x) > s
    jj = jj - 1
Loop
If (ii <= jj) Then 
    t = Arr(ii, x)
    Arr(ii, x) = Arr(jj, x)
    Arr(jj, x) = t
    ii = ii + 1
    jj = jj - 1
    Loop
Do While i < jj
    qSort Arr, i, jj, x
    Exit Do
Loop
Do While ii < j
    qSort Arr, ii, j, x
    Exit Do
Loop
End Sub
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:05
Цитата Сообщение от blackeangel Посмотреть сообщение
На сколько я помню, столбцы у нас вторая размерность, изменяемая
ну у кого вторая у кого первая, даже в vba есть путаница в терминах ну пусть будет строка но смысл то понятен ?

Добавлено через 2 минуты
Цитата Сообщение от blackeangel Посмотреть сообщение
fever brain, так подразумевалось все это хозяйство
ну както так, вобщем запиливай как тебе удобнее
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:09  [ТС]
fever brain, для меня правильная сортировка это когда в Экселе ставишь фильтр на все столбцы, на нужном столбце делаешь от А до Я, и все строки меняют свое местоположение, не только строки в столбце по которому фильтруют, а и по соседним столбцам. Чтоб если Маше 20, то и осталось 20, а не стало вдруг 90.

Добавлено через 2 минуты
fever brain, и ещё вопрос на засыпку, сколько на глазок будет сортироваться 500тыс строк и 3 столбца двумерного массива?
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:11
Цитата Сообщение от blackeangel Посмотреть сообщение
Чтоб если Маше 20, то и осталось 20, а не стало вдруг 90.
тогда это еще проще вообще не нужен двумерный массив
это связанный список

Добавлено через 1 минуту
Цитата Сообщение от blackeangel Посмотреть сообщение
и ещё вопрос на засыпку, сколько на глазок будет сортироваться 500тыс строк и 3 столбца двумерного массива?
500 000 * 3 ну думаю секунд 5
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:12  [ТС]
fever brain, если связанный список это хорошо, то внимание вопрос, как из запроса закинуть в этот список?

Добавлено через 58 секунд
А потом засунуть это в массив?
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:21
Список у тебя двумерный массив
для связанных списков нужна коллекция
потомучто ключи то ты можешь упорядочить любым из предложенных способов
а например связанные строки с этим ключем сортировать не нужно

Добавлено через 3 минуты
както туманно объяснил наверное сплю уже ))

Добавлено через 59 секунд
из базы у тебя что импортируется двумерный массив так ?
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:23  [ТС]
fever brain, не, просто я не в коллекциях ни в словарях ни Алё. Ни разу не использовал. Так что вернёмся к массивам двумерным)
Как в нём организовать связанный отсортированный список?)

Добавлено через 43 секунды
Да , из базы двумерный массив, с листа двумерный массив.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:33
Тебе нужно сравнить один массив с другим
берешь тот который имеет мЕньшее количество элементов

создаешь два цикла двумерного просмотра элементов в этом массиве

второй переписываешь в коллекцию, в коллекции можно связать со строками или еще с чем угодно
но сравнивать будет уж куда быстрее
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:36  [ТС]
fever brain, мне ж нужно частичное совпадение....
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:38
Что значит частичное
например аэропорт и аэродинамика чтото рядом так чтоли ?
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:41  [ТС]
fever brain, "домохозяйка" и "дом" вот они рядом.
Причем домохозяйка у нас читается с листа, а дом из таблицы с сервера. При inStr(1, дом, домохозяйка) >0 то что мне нужно.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:43
ключи в коллекцию можно записать короткими фразами например аэро
а хранить запись будет аэропорт
сравнивать условно можно тоже по коротким фразам тоесть обрезаешь это слово до приемлемого если оно есть
в коллекции то выдаст тебе все что там храниться
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:45  [ТС]
fever brain, это хорошо когда знаешь. А я вот не знаю какие могут быть данные на листе, и так же не знаю какие данные в таблице на сервере, ТК они каждый день обновляются.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 22:52
Да тебе и не обязательно знать важно по каким критериям будет поиск в этой коллекции
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 22:57  [ТС]
fever brain,
Хорошо, например
В таблице на сервере:
Абр.123654.098-12им
Ку8.905532.034
Уви.576489.098
На листе
Абр.123654.098
Ку8.905532.034-01
Уви.576489.098

Первые строки не дадут нужного результата, а остальные дадут.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 23:08
ну вот смотри, критерий такой нам нужно чтоб было совпадение первых 3 знака
в коллекции с ключем Абр хранится Абр.123654.098
если ключ занят, и появилось еще одно значение например Абр.123654.098-12им

то запишем в эту коллекцию массив array("Абр.123654.098", "Абр.123654.098-12им")

теперь вызывая значение коллекции по ключу Абр получаем сразу 2 варианта
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 23:14  [ТС]
fever brain, я догадывался что сейчас к буквам привяжешься. Хорошо. Привяжется к буквам, под этим ключом будет 300тыс записей. У нас с листа просчитались все записи по этому ключу, дальше тот же перебор значений ключа?

А теперь вопрос такой, qSort сортирует только числа или же все таки и текст? Это важный вопрос.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
30.11.2017, 23:19
Цитата Сообщение от blackeangel Посмотреть сообщение
А теперь вопрос такой, qSort сортирует только числа или же все таки и текст? Это важный вопрос.
то что я тебе показывал, это для текста
0
 Аватар для blackeangel
19 / 10 / 1
Регистрация: 22.07.2015
Сообщений: 908
30.11.2017, 23:25  [ТС]
fever brain, а вот такая вот пойдет для текста
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
Public Sub aQSort2(ByRef a() As Variant, ByVal n As Integer, ByRef low As Long, ByRef high As Long)
Dim i As Long, j As Long, k As Long
Dim m As Variant, wsp As Variant
i = low
j = high
m = a(Round((i + j) \ 2), n)
Do Until i > j
Do While a(i, n) < m
i = i + 1
Loop
Do While a(j, n) > m
j = j - 1
Loop
If (i <= j) Then
For k = LBound(a, 2) To UBound(a, 2)
wsp = a(i, k)
a(i, k) = a(j, k)
a(j, k) = wsp
Next k
i = i + 1
j = j - 1
End If
Loop
If (low < j) Then aQSort2 a(), n, low, j
If (i < high) Then aQSort2 a(), n, i, high
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2017, 23:25
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru