powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Оптимизировать ужасный код vba
9 сообщений из 9, страница 1 из 1
Оптимизировать ужасный код vba
    #38885947
viton-zizu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, написал на скоряк код, в тот момент он мне все по считал, но считает жутко долго, сам понимаю что алгоритм ужасен, поэтому прошу помощи в оптимизации, так как в vba не сильно разбираюсь)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
For Row = 1 To 12000
    
        If (arrTbl1(Row, 14) > 0 And arrTbl1(Row, 14) < 31) Then
            summ31 = summ31 + arrTbl1(Row, 18)
            count31 = count31 + 1

            For Row2 = 1 To 120000
                If (arrTbl1(Row, 1) = arrTbl2(Row2, 1)) Then
                    summ31d = summ31d + arrTbl2(Row2, 18)
                    count31d = count31d + 1
                    Exit For
                End If
            Next
            
End If
...
Next


И это только кусочек кода, он запускается 8 раз, выполняется это все секунд 15 :)
Понимаю что внутренний цикл косячный, каждый раз 12000 оборотов прогоняет, но как по шустрей можно искать элемент в массиве!?)
...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38885949
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое arrTbl1, arrTbl2? Range или массив?
...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38885950
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, лучше полностью изложить задачу, а не "угадай мелодию по первым трем нотам"
...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38885989
viton-zizu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Массивы, вопросом наверное больше в том, как сделать быстрый поиск элемента, в большом массиве!?
...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38885992
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
viton-zizuМассивы, вопросом наверное больше в том, как сделать быстрый поиск элемента, в большом массиве!?не использовать массив. Использовать, например, словарь.
...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38885999
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
viton-zizu,

Возможно внутрений запрос SQL будет быстрее.
...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38886012
a`to
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
viton-zizuМассивы, вопросом наверное больше в том, как сделать быстрый поиск элемента, в большом массиве!?
Функция Filter для массива, вроде, достаточно быстро - 8мь "поисков" (ещё и с генерацией данных) уложились в 1сек
массив только должен быть строковым или Variant
Код: plaintext
1.
2.
3.
4.
5.
Description
Returns a zero-based array containing subset of a string array based on a specified filter criteria.

Syntax
Filter(sourcesrray, match[, include[, compare]])

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub test1()
    Dim Ar(1 To 1200) ' As String
    Dim Ar2
    '
    For i = 1 To 1200
        Ar(i) = CLng(1200 * Rnd())
    Next i
    '
    Debug.Print Now
    Ar2 = Filter(Ar, 1000)
    Debug.Print Now
    
    Debug.Print UBound(Ar2)
    If UBound(Ar2) > -1 Then Debug.Print Ar2(UBound(Ar2))
    Debug.Print "------------------------------"
End Sub


Код: vbnet
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.
call test1: call test1: call test1: call test1: call test1: call test1: call test1: call test1
22.02.2015 15:21:05 
22.02.2015 15:21:05 
 2 
1000
------------------------------
22.02.2015 15:21:05 
22.02.2015 15:21:05 
-1 
------------------------------
22.02.2015 15:21:05 
22.02.2015 15:21:05 
-1 
------------------------------
22.02.2015 15:21:05 
22.02.2015 15:21:05 
 1 
1000
------------------------------
22.02.2015 15:21:05 
22.02.2015 15:21:05 
 1 
1000
------------------------------
22.02.2015 15:21:05 
22.02.2015 15:21:05 
 0 
1000
------------------------------
22.02.2015 15:21:05 
22.02.2015 15:21:05 
 0 
1000
------------------------------
22.02.2015 15:21:05 
22.02.2015 15:21:05 
 1 
1000
------------------------------

...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38886095
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
viton-zizuкак по шустрей можно искать элемент в массиве!?Быстрее всего - отсортировать диапазон по столбцу поиска до загрузки в массив, а потом искать в массиве функцией листа ПОИСКПОЗ (Application.Match в VBA) с 3-м аргументом = 1 (интервальный просмотр). С таким аргументом функция не просматривает все подряд, а использует метод половинного деления или что-то вроде того. Получается очень быстро.
...
Рейтинг: 0 / 0
Оптимизировать ужасный код vba
    #38886234
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я в таких случаях:
1. сортирую оба списка,
2. а потом иду по ним параллельно
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Оптимизировать ужасный код vba
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]