Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Оптимизировать ужасный код vba / 9 сообщений из 9, страница 1 из 1
22.02.2015, 14:34
    #38885947
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
Ребят, написал на скоряк код, в тот момент он мне все по считал, но считает жутко долго, сам понимаю что алгоритм ужасен, поэтому прошу помощи в оптимизации, так как в 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
22.02.2015, 14:35
    #38885949
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
Что такое arrTbl1, arrTbl2? Range или массив?
...
Рейтинг: 0 / 0
22.02.2015, 14:37
    #38885950
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
И вообще, лучше полностью изложить задачу, а не "угадай мелодию по первым трем нотам"
...
Рейтинг: 0 / 0
22.02.2015, 15:36
    #38885989
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
Массивы, вопросом наверное больше в том, как сделать быстрый поиск элемента, в большом массиве!?
...
Рейтинг: 0 / 0
22.02.2015, 15:39
    #38885992
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
viton-zizuМассивы, вопросом наверное больше в том, как сделать быстрый поиск элемента, в большом массиве!?не использовать массив. Использовать, например, словарь.
...
Рейтинг: 0 / 0
22.02.2015, 15:44
    #38885999
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
viton-zizu,

Возможно внутрений запрос SQL будет быстрее.
...
Рейтинг: 0 / 0
22.02.2015, 16:25
    #38886012
a`to
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
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
22.02.2015, 20:39
    #38886095
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
viton-zizuкак по шустрей можно искать элемент в массиве!?Быстрее всего - отсортировать диапазон по столбцу поиска до загрузки в массив, а потом искать в массиве функцией листа ПОИСКПОЗ (Application.Match в VBA) с 3-м аргументом = 1 (интервальный просмотр). С таким аргументом функция не просматривает все подряд, а использует метод половинного деления или что-то вроде того. Получается очень быстро.
...
Рейтинг: 0 / 0
23.02.2015, 08:53
    #38886234
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать ужасный код vba
я в таких случаях:
1. сортирую оба списка,
2. а потом иду по ним параллельно
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Оптимизировать ужасный код vba / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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