Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как избежать "(не отвечает)" ? - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как избежать "(не отвечает)" ? (Макросы Sub)
Как избежать "(не отвечает)" ?
SkyPro Дата: Вторник, 12.11.2013, 18:57 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Добрый вечер, уважаемые.
Подскажите, пожалуйста, каким образом можно избежать "зависания" экселя при обработке длительных и ресурсовемких операций?
Как избавиться от "не отвечает"?
Макрос выполняется успешно и эксель "развисает" по окончании обработки. Но вот в эту минуту, пока он "не отвечает", лучше его не трогать, иначе есть возможность "повесить" до выбивания из процессов.
Вариант оптимизации кода - не вариант (как оптимизировать заполнение циклом пары миллионов значений в массив?).
Апгрейдить железо - тоже не вариант :)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Вторник, 12.11.2013, 18:57
 
Ответить
СообщениеДобрый вечер, уважаемые.
Подскажите, пожалуйста, каким образом можно избежать "зависания" экселя при обработке длительных и ресурсовемких операций?
Как избавиться от "не отвечает"?
Макрос выполняется успешно и эксель "развисает" по окончании обработки. Но вот в эту минуту, пока он "не отвечает", лучше его не трогать, иначе есть возможность "повесить" до выбивания из процессов.
Вариант оптимизации кода - не вариант (как оптимизировать заполнение циклом пары миллионов значений в массив?).
Апгрейдить железо - тоже не вариант :)

Автор - SkyPro
Дата добавления - 12.11.2013 в 18:57
Hugo Дата: Вторник, 12.11.2013, 19:02 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Попробуйте DoEvents воткнуть в длинные циклы.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеПопробуйте DoEvents воткнуть в длинные циклы.

Автор - Hugo
Дата добавления - 12.11.2013 в 19:02
SkyPro Дата: Вторник, 12.11.2013, 19:11 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
А как их "втыкать" ?
К примеру вот сюда:
[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]
Мне просто понять принцип "запихивания".


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Вторник, 12.11.2013, 19:12
 
Ответить
СообщениеА как их "втыкать" ?
К примеру вот сюда:
[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
Дата добавления - 12.11.2013 в 19:11
KuklP Дата: Вторник, 12.11.2013, 19:14 | Сообщение № 4
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
[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
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение[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
[/vba]

Автор - KuklP
Дата добавления - 12.11.2013 в 19:14
Hugo Дата: Вторник, 12.11.2013, 19:21 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Я бы во втором цикле засунул в

[vba]
Код
    If x(i) = 0 Then
doevents
'и почему не
         x(i) = x(i) + 2
'?
[/vba]

Будет чуть побыстрее.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЯ бы во втором цикле засунул в

[vba]
Код
    If x(i) = 0 Then
doevents
'и почему не
         x(i) = x(i) + 2
'?
[/vba]

Будет чуть побыстрее.

Автор - Hugo
Дата добавления - 12.11.2013 в 19:21
SkyPro Дата: Вторник, 12.11.2013, 19:24 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
т.е. в каком-либо цикле перед операцией присваивания?

PS: Я просто для примера пару циклов сделал. Это не реальный код для работы :)
Сначала написал 1 + x(i) , а потом решил еще добавить нагрузки :)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Вторник, 12.11.2013, 19:25
 
Ответить
Сообщениет.е. в каком-либо цикле перед операцией присваивания?

PS: Я просто для примера пару циклов сделал. Это не реальный код для работы :)
Сначала написал 1 + x(i) , а потом решил еще добавить нагрузки :)

Автор - SkyPro
Дата добавления - 12.11.2013 в 19:24
Hugo Дата: Вторник, 12.11.2013, 19:27 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Да не обязательно перед.
Главное периодически давать шевелиться системе.
Можно не на каждом шаге, а например на каждом сотом - если вычисление этого сотого не займёт больше времени, чем выгода от редкого doevents :)


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеДа не обязательно перед.
Главное периодически давать шевелиться системе.
Можно не на каждом шаге, а например на каждом сотом - если вычисление этого сотого не займёт больше времени, чем выгода от редкого doevents :)

Автор - Hugo
Дата добавления - 12.11.2013 в 19:27
SkyPro Дата: Вторник, 12.11.2013, 19:30 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Можно не на каждом шаге, а например на каждом сотом

Т.е. еще один if и счетчик?

Спасибо вам за помощь. А то я смотрел в эти дуэвентс, но нифига не понимал куда их запихивать.


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Вторник, 12.11.2013, 19:31
 
Ответить
Сообщение
Можно не на каждом шаге, а например на каждом сотом

Т.е. еще один if и счетчик?

Спасибо вам за помощь. А то я смотрел в эти дуэвентс, но нифига не понимал куда их запихивать.

Автор - SkyPro
Дата добавления - 12.11.2013 в 19:30
Hugo Дата: Вторник, 12.11.2013, 19:34 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Можно счётчик, можно mod - я обычно mod использовал, правда для statusbar'а.
Но нужно померить, что выгоднее по скорости.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеМожно счётчик, можно mod - я обычно mod использовал, правда для statusbar'а.
Но нужно померить, что выгоднее по скорости.

Автор - Hugo
Дата добавления - 12.11.2013 в 19:34
SkyPro Дата: Вторник, 12.11.2013, 19:50 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Спасибо, посмотрю как этот мод можно припахать :)


skypro1111@gmail.com
 
Ответить
СообщениеСпасибо, посмотрю как этот мод можно припахать :)

Автор - SkyPro
Дата добавления - 12.11.2013 в 19:50
Hugo Дата: Вторник, 12.11.2013, 21:23 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
[vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba]
С статусбаром точно ускоряет работу - если выводить каждый i то медленно и глазом трудно уследить.
Если ли смысл с DoEvents - точно не знаю, но можешь померить.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
Сообщение[vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba]
С статусбаром точно ускоряет работу - если выводить каждый i то медленно и глазом трудно уследить.
Если ли смысл с DoEvents - точно не знаю, но можешь померить.

Автор - Hugo
Дата добавления - 12.11.2013 в 21:23
RAN Дата: Вторник, 12.11.2013, 21:47 | Сообщение № 12
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Есть смысл.
Делал файл, где создавался прогрессбар и читалось два текстовых файла (10 000 и 360 000 строк), а потом все это безобразие загонялось в словарь. На 2007 и ХР все вроде работало, а на W7 и 2010 прогрессбар прятался за окно Excel, и носа не высовывал до окончания загрузки. Вылезал только при начале обработки загруженных данных. Оказалось - DoEvents не в ту строчку воткнул. А без DoEvents было совсем грустно. Особенно если учесть, что время обработки при максимальном поиске составляло ~ 5 часов, а на минимуме - от 5 до 25 минут.
В итоге в кажду загрузку и формирование словаря воткнул по DoEvents, а в цикл обработки
[vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Вторник, 12.11.2013, 21:48
 
Ответить
СообщениеЕсть смысл.
Делал файл, где создавался прогрессбар и читалось два текстовых файла (10 000 и 360 000 строк), а потом все это безобразие загонялось в словарь. На 2007 и ХР все вроде работало, а на W7 и 2010 прогрессбар прятался за окно Excel, и носа не высовывал до окончания загрузки. Вылезал только при начале обработки загруженных данных. Оказалось - DoEvents не в ту строчку воткнул. А без DoEvents было совсем грустно. Особенно если учесть, что время обработки при максимальном поиске составляло ~ 5 часов, а на минимуме - от 5 до 25 минут.
В итоге в кажду загрузку и формирование словаря воткнул по DoEvents, а в цикл обработки
[vba]
Код
If i Mod 100 = 0 Then DoEvents
[/vba]

Автор - RAN
Дата добавления - 12.11.2013 в 21:47
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как избежать "(не отвечает)" ? (Макросы Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!