Добрый вечер, уважаемые. Подскажите, пожалуйста, каким образом можно избежать "зависания" экселя при обработке длительных и ресурсовемких операций? Как избавиться от "не отвечает"? Макрос выполняется успешно и эксель "развисает" по окончании обработки. Но вот в эту минуту, пока он "не отвечает", лучше его не трогать, иначе есть возможность "повесить" до выбивания из процессов. Вариант оптимизации кода - не вариант (как оптимизировать заполнение циклом пары миллионов значений в массив?). Апгрейдить железо - тоже не вариант
Добрый вечер, уважаемые. Подскажите, пожалуйста, каким образом можно избежать "зависания" экселя при обработке длительных и ресурсовемких операций? Как избавиться от "не отвечает"? Макрос выполняется успешно и эксель "развисает" по окончании обработки. Но вот в эту минуту, пока он "не отвечает", лучше его не трогать, иначе есть возможность "повесить" до выбивания из процессов. Вариант оптимизации кода - не вариант (как оптимизировать заполнение циклом пары миллионов значений в массив?). Апгрейдить железо - тоже не вариант SkyPro
skypro1111@gmail.com
Сообщение отредактировал SkyPro - Вторник, 12.11.2013, 18:57
Sub Tmp() Dim i& Dim x(1 To 30000000) As Byte For i = 1 To 30000000 x(i) = Round(Rnd) Next For i = 1 To 30000000 If x(i) = 0 Then x(i) = 1 + x(i) + 1 Else x(i) = 0 + x(i) + 1 End If Next End Sub
[/vba] Мне просто понять принцип "запихивания".
А как их "втыкать" ? К примеру вот сюда: [vba]
Код
Sub Tmp() Dim i& Dim x(1 To 30000000) As Byte For i = 1 To 30000000 x(i) = Round(Rnd) Next For i = 1 To 30000000 If x(i) = 0 Then x(i) = 1 + x(i) + 1 Else x(i) = 0 + x(i) + 1 End If Next End Sub
[/vba] Мне просто понять принцип "запихивания".SkyPro
skypro1111@gmail.com
Сообщение отредактировал SkyPro - Вторник, 12.11.2013, 19:12
Sub Tmp() Dim i& Dim x(1 To 30000000) As Byte For i = 1 To 30000000 doevents x(i) = Round(Rnd) Next For i = 1 To 30000000 doevents If x(i) = 0 Then x(i) = 1 + x(i) + 1 Else x(i) = 0 + x(i) + 1 End If Next End Sub
[/vba]
[vba]
Код
Sub Tmp() Dim i& Dim x(1 To 30000000) As Byte For i = 1 To 30000000 doevents x(i) = Round(Rnd) Next For i = 1 To 30000000 doevents If x(i) = 0 Then x(i) = 1 + x(i) + 1 Else x(i) = 0 + x(i) + 1 End If Next End Sub
Да не обязательно перед. Главное периодически давать шевелиться системе. Можно не на каждом шаге, а например на каждом сотом - если вычисление этого сотого не займёт больше времени, чем выгода от редкого doevents
Да не обязательно перед. Главное периодически давать шевелиться системе. Можно не на каждом шаге, а например на каждом сотом - если вычисление этого сотого не займёт больше времени, чем выгода от редкого doevents Hugo
[/vba] С статусбаром точно ускоряет работу - если выводить каждый i то медленно и глазом трудно уследить. Если ли смысл с DoEvents - точно не знаю, но можешь померить.
[vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba] С статусбаром точно ускоряет работу - если выводить каждый i то медленно и глазом трудно уследить. Если ли смысл с DoEvents - точно не знаю, но можешь померить.Hugo
Есть смысл. Делал файл, где создавался прогрессбар и читалось два текстовых файла (10 000 и 360 000 строк), а потом все это безобразие загонялось в словарь. На 2007 и ХР все вроде работало, а на W7 и 2010 прогрессбар прятался за окно Excel, и носа не высовывал до окончания загрузки. Вылезал только при начале обработки загруженных данных. Оказалось - DoEvents не в ту строчку воткнул. А без DoEvents было совсем грустно. Особенно если учесть, что время обработки при максимальном поиске составляло ~ 5 часов, а на минимуме - от 5 до 25 минут. В итоге в кажду загрузку и формирование словаря воткнул по DoEvents, а в цикл обработки [vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba]
Есть смысл. Делал файл, где создавался прогрессбар и читалось два текстовых файла (10 000 и 360 000 строк), а потом все это безобразие загонялось в словарь. На 2007 и ХР все вроде работало, а на W7 и 2010 прогрессбар прятался за окно Excel, и носа не высовывал до окончания загрузки. Вылезал только при начале обработки загруженных данных. Оказалось - DoEvents не в ту строчку воткнул. А без DoEvents было совсем грустно. Особенно если учесть, что время обработки при максимальном поиске составляло ~ 5 часов, а на минимуме - от 5 до 25 минут. В итоге в кажду загрузку и формирование словаря воткнул по DoEvents, а в цикл обработки [vba]