Excel, обработка нескольких тысяч строк тормозит

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

При провеке считываю информацию с 6000-10000 строк.
Заметил феномен, чем дальше от ActiveCell тем дольше длится это дело.
Не беда, каждые 100 строк ставлю ActiveCell поближе. Но это не прокатывает с cкрытой WorkBook, а хотелось бы. Когда много ошибок, на прорисовку цветов и комментариев много время уходит. Да и Screen прыгает....

Делаю так

Код: Выделить всё

for Pos = 1 to 6000
Check_Function_1 (My_Wkb.Range(Pos,1))
...
Check_Function_10 (My_Wkb.Range(Pos,10))
if Pos / 100 = Pos \ 100 then My_Wkb.Range(Pos,10).ActiveCell
next
Application.ScreenUpdate = false не предлогать :roll:
Много не даёт, и My_Custom_CommandBar не видно, а в нём есть кнопка "Cancel"

Есть ли у кого советы?
-------------
Лень - двигатель прогресса!
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

1. Не использовать без крайней необходимости методы .Select и .Activate. Кстати, не подскажите в какой версии MS Excel разрешено использовать используемый Вами синтаксис Range(Строка, Столбец) + .ActiveCell …

2. Если у Вас наличествуют ссылки, формулы и т.д., много графических об'ектов и комментариев/примечаний, то в этом случае можно использовать :

Код: Выделить всё

With Application
     .ThisWorkbook.DisplayDrawingObjects = xlHide
     .DisplayCommentIndicator = xlNoIndicator
     .Calculation = xlCalculationManual 'xlManual
     ...
         
     ...
     .ThisWorkbook.DisplayDrawingObjects = xlAll
     .DisplayCommentIndicator = xlCommentAndIndicator
     .Calculation = xlCalculationAutomatic 'xlAutomatic
End With
3. Что касается "невидимой" панели, то Вам необходимо сначала отобразить эту панель инструментов, т.е. установить значение свойства .Visible = True, а только затем использовать Application.ScreenUpdate = False
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

P.S. Если речь идёт о "считывании" данных, то можно использовать что-то типа :

Код: Выделить всё

iMassiv = Range("A7:A25").Value

For Each iItem In iMassiv
    MsgBox iItem, , ""
Next

Код: Выделить всё

iMassiv = Range("A7:A25").Value

iMin = LBound(iMassiv)
iMax = UBound(iMassiv)

For iCount = iMin To iMax
    MsgBox iMassiv(iCount, 1), , ""
Next
treider
Сообщения: 57
Зарегистрирован: 01 сен 2005, 13:29
Откуда: Алматы
Контактная информация:

На сколько я понимаю Excel тормозит когда вы обращаетесь к ячейкам удаленным друг от друга.
Я решел эту проблему загрузкой необходимого диапазона ячеек в масив
Например

Код: Выделить всё

Sub f()
Dim h(64000) As String
For n = 1 To 64000
 h(1) = Cells(n, 1).Value
Next
MsgBox ("dd")
End Sub
Выполняется около секунды
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

пардон, ActiveCell делaю тaк:

WK_Sheet.Range("A" & Pos ).Select

а вот это попробую

Код: Выделить всё

iMassiv = Range("A7:A25").Value 

For Each iItem In iMassiv 
    MsgBox iItem, , "" 
Next
и это

Код: Выделить всё

Sub f() 
Dim h(64000) As String 
For n = 1 To 64000 
 h(1) = Cells(n, 1).Value 
Next 
MsgBox ("dd") 
End Sub
попробую!
-------------
Лень - двигатель прогресса!
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

пардон, ActiveCell делaю тaк:

WK_Sheet.Range("A" & Pos ).Select © alexx 2005
В 90% использование метода .Select абсолютно не нужно, тем более вкупе с об'единением.

Код: Выделить всё

For iPos = 1 To 6000 ' 10000
    MsgBox WK_Sheet.Cells(iPos, 1), , ""
Next
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

дa, но Select поднял скорость, c 90 сeк. до 15 сeк!

я кaжется понял в чем дело! я привязывaю Cells:

Код: Выделить всё

Dim Recv_Name as Range

Set Recv_Name = My_Range.Cells(1,1)
a потом проверяю

Код: Выделить всё

if Check_Function_1 (Recv_Name) then ...
нaдо

Код: Выделить всё

Check_Function_1(My_Sheet.Cells(1,1))
и веселей бежит!
-------------
Лень - двигатель прогресса!
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Никаких но … нельзя сравнивать два извращения между собой, если передо мной поставят на выбор - отпиливание моей головы тупой ножовкой и применение гильотины, то я конечно выберу последнее, но ни один из вариантов мне не понравится, особенно после применения :P
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

это опять я!
долго искал и локализовал тормоз...
время обработки растет при использовании AddComment

Код: Выделить всё

Dim Cur_Book As Worksheet, Cur_Range As Range, Cur_Pos As Long, Time_Step As Long
Sub Test1()
Set Cur_Book = ActiveWorkbook.ActiveSheet
Set Cur_Range = Cur_Book.Range("A1:A60000")
Cur_Range.ClearComments
tm = Timer

For Cur_Pos = 1 To 60000 '1
Cur_Range.Item(Cur_Pos).AddComment "a"
'Cur_Range.Cells(Cur_Pos, 1).AddComment "a" '2
'Set Cur_Range = Cur_Book.Range("A" & Cur_Pos) '3
'Cur_Range.AddComment "a" '3

If Time_Step = 999 Then
Application.StatusBar = Timer - tm & "  -  " & Cur_Pos
tm = Timer
Time_Step = 0
Else
Time_Step = Time_Step + 1
End If
DoEvents
Next
End Sub

Sec	 	Pos
2	- 	1000
4,5	-	2000
7,5	-	3000
...
без разницы, как обращаюсь к Cells...

похоже на косяк в Excel
-------------
Лень - двигатель прогресса!
Ответить