powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Перебор строк (13к+), while, медленно
7 сообщений из 7, страница 1 из 1
Перебор строк (13к+), while, медленно
    #38602000
CheaterX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Существует тяжелый файл, в который зашит макрос:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    Dim i, j As Long
    i = 2
    Do While Cells(i, 1).Value <> ""
        If Cells(i, 9).Value <> "Выбывший" Then
            If Cells(i, 18) <> "n/a" Then
                j = i + 1
                Do While Cells(j, 1) <> ""
                    If Cells(j, 18).Value = Cells(i, 18).Value Then
                        If (Cells(j, 3).Value > Cells(i, 3).Value And Cells(j, 11).Value <> "ФЛ") Or (Cells(j, 3).Value < Cells(i, 3).Value And Cells(i, 11).Value = "ФЛ") Or (Cells(j, 14).Value = 1) Or (Cells(j, 2).Value >= 0.05 Or Cells(j, 29).Value >= 500000) Then
                            Cells(i, 3).Value = Cells(j, 3).Value
                        End If
                        If (Cells(i, 3).Value > Cells(j, 3).Value And Cells(i, 11).Value <> "ФЛ") Or (Cells(i, 3).Value < Cells(j, 3).Value And Cells(j, 11).Value = "ФЛ") Or (Cells(i, 14).Value = 1) Or (Cells(i, 2).Value >= 0.05 Or Cells(i, 29).Value >= 500000) Then
                            Cells(j, 3).Value = Cells(i, 3).Value
                        End If
                    End If
                    j = j + 1
                Loop
            End If
        End If
        i = i + 1
    Loop


Модератор: Учимся использовать тэги оформления кода - FAQ

Выполняется крайне долго. Возможно есть способ обрабатывать данные быстрее. Спасибо заранее.
...
Рейтинг: 0 / 0
Перебор строк (13к+), while, медленно
    #38602043
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно возможно. каждое обращение к Cells(x,y) заставляет просматривать всю коллекцию ячеек в поисках нужного индекса. необходимо сужать области поиска.

1) определить задействованный диапазон (Dim rngOuter As Range)
2) заменить первый while на for each:
Код: vbnet
1.
2.
Dim rOuter As Row 
For Each rOuter In rngOuter.Rows


3) Далее обращаться к ячейкам конкретной строки:
Код: vbnet
1.
If rOuter.Cells(9).Value <> "Выбывший" and rOuter.Cells(18).Value <> "n/a" Then


4) заменить внутренний while по аналогии с внешним, определяя внутренний диапазон от i+1 до конца внешнего
5) в пределах внутреннего цикла не путать строки диапазонов
6) заменить многократные одинаковые вызовы Cells() единственным вызовом с присвоением значения строго типизированной переменной, далее использовать переменные:
Код: vbnet
1.
2.
3.
4.
5.
6.
Dim i3 as String , j3 as String
i3 = rOuter.Cells(3).Value
j3 = rInner.Cells(3).Value

If (j3 > i3 And rInner.Cells(11).Value <> "ФЛ") Or (j3 < i3
If (i3 > j3 And rOuter.Cells(11).Value <> "ФЛ") Or (i3 < j3

вангую ускорение на порядки
...
Рейтинг: 0 / 0
Перебор строк (13к+), while, медленно
    #38602053
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только i3 и j3 похоже должны быть не строками, а числами
...
Рейтинг: 0 / 0
Перебор строк (13к+), while, медленно
    #38602057
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyкаждое обращение к Cells(x,y) заставляет просматривать всю коллекцию ячеек в поисках нужного индекса.не совсем так.
происходит неявный обход коллекции до нужного индекса. то есть чем больше значения x и y, тем медленнее выполняется Cells(x,y)
...
Рейтинг: 0 / 0
Перебор строк (13к+), while, медленно
    #38602165
CheaterX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,
Спасибо заранее!
Объясните поподробнее про в данном контексте, какой тип переменной у rOuter, не приходилось работать с массивами.
Dim rOuter As Row
For Each rOuter In rngOuter.Rows

Прошу разжевать если не трудно.
...
Рейтинг: 0 / 0
Перебор строк (13к+), while, медленно
    #38602198
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо загрузить диапазон для обработки в массив и все действия выполнять с элементами массива, потом выгрузить обратно в диапазон. Так можно ускорить не менее чем в 10 раз.
...
Рейтинг: 0 / 0
Перебор строк (13к+), while, медленно
    #38602866
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CheaterXAntonariy,
Спасибо заранее!
Объясните поподробнее про в данном контексте, какой тип переменной у rOuter, не приходилось работать с массивами.
Dim rOuter As Row
For Each rOuter In rngOuter.Rows

Прошу разжевать если не трудно.это я ошибся, тоже должно быть Range, а не Row.

КазанскийНадо загрузить диапазон для обработки в массив и все действия выполнять с элементами массива, потом выгрузить обратно в диапазон. Так можно ускорить не менее чем в 10 раз.кстати да.

а можно создать массив из строк, основные потери приходятся как раз на ползанье по строкам:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim rows(1 To UsedRange.rows.Count) As Range
Dim r As Range
Dim x As Integer
    x = 1
    For Each r In UsedRange.rows
       rows(x) = r
       x = x + 1
    Next

в этом случае выгружать обратно ничего не надо.

Do While можно тогда оставить, а обращения к ячейкам сделать так:
Код: vbnet
1.
2.
i3 = rows(i).Cells(3).Value
j3 = rows(j).Cells(3).Value
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Перебор строк (13к+), while, медленно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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