Страница 1 из 1
Excel, обработка нескольких тысяч строк тормозит
Добавлено: 03 ноя 2005, 22:56
alexx
При провеке считываю информацию с 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"
Есть ли у кого советы?
Добавлено: 04 ноя 2005, 04:01
pashulka
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
Добавлено: 04 ноя 2005, 08:06
pashulka
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
Добавлено: 04 ноя 2005, 08:21
treider
На сколько я понимаю Excel тормозит когда вы обращаетесь к ячейкам удаленным друг от друга.
Я решел эту проблему загрузкой необходимого диапазона ячеек в масив
Например
Код: Выделить всё
Sub f()
Dim h(64000) As String
For n = 1 To 64000
h(1) = Cells(n, 1).Value
Next
MsgBox ("dd")
End Sub
Выполняется около секунды
Добавлено: 04 ноя 2005, 10:57
alexx
пардон, 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
попробую!
Добавлено: 04 ноя 2005, 11:27
pashulka
пардон, 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
Добавлено: 04 ноя 2005, 15:46
alexx
дa, но Select поднял скорость, c 90 сeк. до 15 сeк!
я кaжется понял в чем дело! я привязывaю Cells:
Код: Выделить всё
Dim Recv_Name as Range
Set Recv_Name = My_Range.Cells(1,1)
a потом проверяю
нaдо
и веселей бежит!
Добавлено: 04 ноя 2005, 16:30
pashulka
Никаких но … нельзя сравнивать два извращения между собой, если передо мной поставят на выбор - отпиливание моей головы тупой ножовкой и применение гильотины, то я конечно выберу последнее, но ни один из вариантов мне не понравится, особенно после применения :P
Добавлено: 15 ноя 2005, 12:08
alexx
это опять я!
долго искал и локализовал тормоз...
время обработки растет при использовании 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