powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Какой самый быстрый способ обработки большого диапазона ячеек?
19 сообщений из 19, страница 1 из 1
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37202982
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Субж.
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203016
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что подразумевается под обработкой?
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203045
Thermik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist,
хотя бы считать данные в массив что-то сделать с массивом и обрано вывести данные из массива в ячейки
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203064
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist,

Например, диапазон Range("A1:A500000") забит разными цифрами - как отрицательными, так и положительными. Надо выбрать из них все отрицательные числа и показать их в столбце B. Предположим, 139567 ячеек из них - отрицательные числа. Следовательно, они должны находиться в Range("B1:B139567").
Вот такая простенькая задача. :)
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203065
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thermik,

А конкретно?
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203087
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yudzhin,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub Test()
    Dim avArr(), li, avRezhArr(), lr
    Dim iTimer: iTimer = Timer
    avArr = Range("A1:A500000")
    ReDim avRezhArr( 1  To UBound(avArr,  1 ),  1  To  1 )    'можно и (1 To 500000), если заранее известно кол-во ячеек
    For li =  1  To UBound(avArr,  1 )
        If Len(avArr(li,  1 )) Then
            If avArr(li,  1 ) <  0  Then
                lr = lr +  1 : avRezhArr(lr,  1 ) = avArr(li,  1 )
            End If
        End If
    Next li
    [B1].Resize(lr).Value = avRezhArr
    MsgBox Timer - iTimer
End Sub
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203116
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist,

Ошибка, однако! Application-defined or object-defined error. VBE подсветил строку:
Код: plaintext
1.
[B1].Resize(lr).Value = avRezhArr
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203137
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А отрицательные числа есть на листе?
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203139
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать проверку перед выгрузкой:
Код: plaintext
If lr then [B1].Resize(lr).Value = avRezhArr
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203171
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код писал на коленке, там объявления надо проставить нормально:
Код: plaintext
Dim avArr(), li As Long, avRezhArr(), lr As Long
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203822
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_PristА отрицательные числа есть на листе?
Сработало! Просто я пробовал на пустом диапазоне. После добавления
Код: plaintext
If lr Then [B1].Resize(lr).Value = avRezhArr
всё заработало! Очень быстро!

А если задачу усложнить: в столбце B , напротив отрицательного числа, стоит какое-либо описание данного отрицательного числа, и нужно вместе с отрицательным числым "подхватить" это описание?

Другими словами:
1. Исходный диапазон - Range("A1:B500000") .
2. Целевой диапазон - столбцы C (содержит отрицательнок число) и D (содержит описание).
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203922
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub Test()
    Dim avArr(), li as long, avRezhArr(), lr as long
    Dim iTimer: iTimer = Timer
    avArr = Range("A1", Cells(Rows.count, 1 ).End(xlup).Offset(, 1 )) 'до последней ячейки стобца А
    ReDim avRezhArr( 1  To UBound(avArr,  1 ),  1  To  2 )
    For li =  1  To UBound(avArr,  1 )
        If Len(avArr(li,  1 )) Then
            If avArr(li,  1 ) <  0  Then
                lr = lr +  1 : avRezhArr(lr,  1 ) = avArr(li,  1 ): avRezhArr(lr,  2 ) = avArr(li,  2 )
            End If
        End If
    Next li
    [C1].Resize(lr, 2 ).Value = avRezhArr
    MsgBox Timer - iTimer
End Sub
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37203968
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist,

Не успел и глазом моргнуть! Благодарю! :)
Но не пойму, зачем ненужная проверка Len?
Код: plaintext
1.
2.
3.
4.
...
    If Len(avArr(li,  1 )) Then
            If avArr(li,  1 ) <  0  Then
...

Я забил все 500 тысяч ячеек отрицательными числами. И вот результат:

1. C Len время выполнения - 3,23.
2. Без Len время выполнения - 2,23.
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37204050
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yudzhin,

А теперь забейте вразнобой - пустые в перемешку с заполненными :-)
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37204059
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя...наверное, можно и без Len обойтись. С числами не нужно. С текстом доп.сравнение будет тормозить. В данном случае действительно эта проверка лишняя. Но если внутри цикла будут производится доп.действия с массивами, то такая проверка может сэкономить значительное время.
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37204118
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist,

Забил числа по шаблону "1 отрицательное - 2 положительных":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub FillDumpData()

    Dim i As Long
    Dim lNegative As Long
    Dim lPositive As Long
    Dim arr( 1  To  500000 ,  1  To  1 ) As Long

    lNegative = - 500000 
    lPositive =  500000 

    For i =  1  To  500000 
        If i Mod  3  =  0  Then
            arr(i,  1 ) = lNegative
            lNegative = lNegative +  1 
        Else
            arr(i,  1 ) = lPositive
            lPositive = lPositive -  1 
        End If
    Next

    Range("A1").Resize( 500000 ,  1 ).Value = arr

End Sub

Результат:
1. C Len время выполнения - 2,05.
2. Без Len время выполнения - 1,05.

Разница в секунду так и остаётся. :)
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37204192
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yudzhin,

Я вообще-то написал забить вперемешку с ПУСТЫМИ ячейками :-) Т.к. Len проверяет наличие данных в ячейке.
А чуть позже написал, что в данном случае действительно такая проверка лишняя, т.к. никаких особо долгих действий внутри цикла мы не проводим. Если бы в цикле мы еще вдобавок вызывали какие-либо функции и разные действия производили с данными - то Len помогла бы ускорить. Но повторюсь - это применимо, если пусте ячейки имеют место быть.
Например, Вы применяете назначение массиву значения дипазона не вычисляя последнюю ячейку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub Test()
    Dim avArr(), li As Long, avRezhArr(), lr As Long
    Dim iTimer: iTimer = Timer
    avArr = Range("A1:A65000").Value 'фиксированный диапазон
    ReDim avRezhArr( 1  To UBound(avArr,  1 ),  1  To  1 )
    For li =  1  To UBound(avArr,  1 )
        If Len(avArr(li,  1 )) Then
            If avArr(li,  1 ) Like "*2*" And Not IsNumeric(avArr(li,  1 )) Then
                If InStr(avArr(li,  1 ), "1") Then
                    lr = lr +  1 : avRezhArr(lr,  1 ) = avArr(li,  1 ) & avArr(li +  1 ,  1 )
                End If
            End If
        End If
    Next li
    [C1].Resize(lr,  2 ).Value = avRezhArr
    MsgBox Timer - iTimer
End Sub
Заполните столбец А только до 10-ой строки. Сравните скорость с Len и без неё. Обращаю внимание за воткнутую заранее в цикл строку сравнения с Like. Она тоже тормозить слегка процесс.
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37204299
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist,

В этом случае, действительно, нет никакой разницы. Я убрал проверку Len - никакой разницы. :-)
...
Рейтинг: 0 / 0
Какой самый быстрый способ обработки большого диапазона ячеек?
    #37204309
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yudzhin,

А вот у меня есть разница во времени(если брать приведенную выше процедуру), если забирать в массив фиксированный диапазон, а заполнить значениями лишь его часть. В данном случае проверка на заполненность ячейки экономит время, а не наоброт.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Какой самый быстрый способ обработки большого диапазона ячеек?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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