Страницы: 1 2 След.
RSS
Обновление экрана
 
Приветствую!  
Помогите разобраться с непонятным  
Private Sub Worksheet_Change(ByVal Target As Range)  
   Application.ScreenUpdating = False  
   If Target.Count > 1 Then Exit Sub  
   If Not Intersect(Target, Range("A1")) Is Nothing Then Exit Sub  
End Sub  
Если изменить А1, то все продолжает работать, а если скопировать и вставить 2 ячейки, то требуется принудительное включение обновления экрана.
 
А всё потому, что строка Application.ScreenUpdating = False срабатывает до принудительного выхода из процедуры (Then Exit Sub). А где включение?
 
А что непонятного? Вы обновление отключаете, а обратно не включаете. Я не раз писал уже, что лучше возвращать занчения изменных параметров и свойств.  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Target.Count > 1 Then Exit Sub  
If Not Intersect(Target, Range("A1")) Is Nothing Then Exit Sub  
Application.ScreenUpdating = False  
'здесь код  
Application.ScreenUpdating = 1  
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А нигде!  
В том и вопрос - почему в одном случае продолжает работать, а во втором - нет!?
 
А мне ещё вот это непонятно:  
If Not Intersect(Target, Range("A1")) Is Nothing Then Exit Sub  
При изменении в ячейке А1 НИЧЕГО не произойдёт. Кроме выхода из процедуры, конечно.
 
{quote}{login=RAN}{date=03.12.2011 04:01}{thema=}{post}почему в одном случае продолжает работать, а во втором - нет!?{/post}{/quote}Смотрите:    
Вы отключили обновление:  
Application.ScreenUpdating = False  
принудительно вышли, если более одной ячейки:  
If Target.Count > 1 Then Exit Sub  
а обновление не включили.
 
{quote}{login=RAN}{date=03.12.2011 03:44}{thema=Обновление экрана}{post}а если скопировать и вставить 2 ячейки, то требуется принудительное включение обновления экрана.{/post}{/quote}Вопрос на засыпку: что делает эта строка?  
If Target.Count > 1 Then Exit Sub  
 
Для общего понимания: если Вы вышли из процедуры, завершая её логически, т.е. дойдя до End Sub, то VBA сам возвращает значение Application.ScreenUpdating в True. Если же Вы принудительно завершили процедуру - то...короче ничего никуда не возвращается.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Но ведь здесь в обоих случаях принудительное завершение процедуры!  
Я специально удалил весь код, оставив только строки принудительного выхода.  
Если выходить по строке  
If Not Intersect(Target, Range("A1")) Is Nothing Then Exit Sub  
то Application.ScreenUpdating возвращается в True, а если по строке  
If Target.Count > 1 Then Exit Sub  
то нет.  
Вопрос возник в процессе разбирательства с кодом, превая строка которого  
Application.ScreenUpdating = False  
последняя  
Application.ScreenUpdating = True  
а внутри кода - прерывания.
 
Всем добрый день)  
Объясните мне, пожалуйста, зачем включать обновление экрана : )  
Запустите два раза.  
 
Sub io()  
With Application  
   MsgBox .ScreenUpdating ' читаем  
   .ScreenUpdating = False ' изменяем  
   MsgBox .ScreenUpdating ' читаем  
End With  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Запустил - и что? Переключается.
 
{quote}{login=RAN}{date=03.12.2011 04:34}{thema=}{post}  
Вопрос возник в процессе разбирательства с кодом, превая строка которого  
Application.ScreenUpdating = False  
последняя  
Application.ScreenUpdating = True  
а внутри кода - прерывания.{/post}{/quote}А где в Вашем примере Application.ScreenUpdating = True?
 
>Запустите два раза.  
 
Первый запуск (макроса):  
True ' проверяем  
' отключаем <--  
False ' да, отключено  
 
Второй  
True ' проверяем. Включено. А ведь мы его отключали)  
False
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=03.12.2011 04:45}{thema=}{post}А ведь мы его отключали)  
False{/post}{/quote}А теперь читаем Димин пост от 03.12.2011, 16:14
 
Да нет его!  
Я знаю, что надо вставлять включение.  
Но меня интересует не это, а именно тот вопрос, который я задал!  
 
Может конечно это мой локальный глюк, но у меня после выхода по строке  
If Target.Count > 1 Then Exit Sub  
возможность попасть на любой лист Excel появляется только после выполнения  
Application.ScreenUpdating = True
 
{quote}{login=RAN}{date=03.12.2011 04:51}{thema=}{post}возможность попасть на любой лист Excel появляется только после выполнения Application.ScreenUpdating = True{/post}{/quote}Покажите файл ТОЛЬКО с этим фрагментом.
 
Ну так The_Prist так и написал:  
Если процедура завершается "естественным путем" через End Sub, то обновление включается автоматом.  
Если "неестественным" - через Exit Sub автоматического включения обновления не происходит.
Кому решение нужно - тот пример и рисует.
 
{quote}{login=Юрий М}{date=03.12.2011 04:50}{thema=Re: }{post}{quote}{login=nerv}{date=03.12.2011 04:45}{thema=}{post}А ведь мы его отключали)  
False{/post}{/quote}А теперь читаем Димин пост от 03.12.2011, 16:14{/post}{/quote}Как плохо, что я не умею читать!))) Спасибо, понял : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=Пытливый}{date=03.12.2011 04:54}{thema=}{post}Ну так The_Prist так и написал{/post}{/quote}Мало ли что написал, Главное - прочитать :-) А у Саши утро.
 
.
 
Что нужно выполнить, чтобы "сломалось"?
 
Пытливый, Юрий, а теперь скажите мне почему здесь результат тот же самый)  
Не утро, просто с одного языка на другой пока еще туго переключаюсь) Параллельно на js сижу мастерю : )  
 
Sub io()  
With Application  
   Debug.Print .ScreenUpdating  
   .ScreenUpdating = False  
   Exit Sub  
End With  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Скопировать и вставить [b5:b6]
 
{quote}{login=RAN}{date=03.12.2011 05:03}{thema=}{post}Скопировать и вставить [b5:b6]{/post}{/quote}Скопировал, вставил - что дальше?
 
Юрий М  
А что произошло?  
Просто выход? Есть возможность попасть на лист? У меня - нет.
 
{quote}{login=RAN}{date=03.12.2011 05:03}{thema=}{post}Скопировать и вставить [b5:b6]{/post}{/quote}Здесь ДВЕ ячейки. А у Вас принудительный выход, если изменение более одной ячейки.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
{quote}{login=RAN}{date=03.12.2011 05:10}{thema=Re: }{post} Есть возможность попасть на лист? У меня - нет.{/post}{/quote}Не очень понимаю вопрос - я ведь и так на листе это делаю. Куда ещё попасть? :-)
 
{quote}{login=nerv}{date=03.12.2011 05:00}{thema=Re: }{post}Пытливый, Юрий, а теперь скажите мне почему здесь результат тот же самый){/post}{/quote}  
Потому что это не событийная процедура.  
Sub io()  
   With Application  
       MsgBox .ScreenUpdating  
       .ScreenUpdating = False  
       MsgBox .ScreenUpdating  
       Exit Sub  
   End With  
End Sub  
 
Выполняя напрямую из редактора VBA вы не отключаете обновление - иначе не смогли бы видеть ход выполнения. А вот с листа - да, отключается.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Давайте попробую еще раз объяснить.  
Добавляю в код первой строкой  
MsgBox Application.ScreenUpdating  
Сколько я бы ни менял значение в [A1], получаю MsgBox True, не смотря на принудительный выход.
Но стоит мне скопировать 2 ячейки - можно мышем по листу щелкать до посинения, ничего не происходит (в ячейку попасть не могу, курсор - стрелка) до того, как в VBA выполню  
Application.ScreenUpdating = True
 
Дмитрий, спасибо за участие) Но если честно, то я не понял : )  
Правильно ли я понимаю, что в коде ниже оно должно отключаться и не включаться?  
Если нет, то, пожалуйста, приведите пример когда, когда оно не включается)  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
With Application  
   Debug.Print .ScreenUpdating ' всегда True  
   .ScreenUpdating = False  
   Exit Sub  
End With  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=RAN}{date=03.12.2011 05:25}{thema=}{post}стоит мне скопировать 2 ячейки - можно мышем по листу щелкать до посинения, ничего не происходит (в ячейку попасть не могу, курсор - стрелка) до того, как в VBA выполню  
Application.ScreenUpdating = True{/post}{/quote}У меня такого не происходит - могу сразу после копирования/вставки активировать любую ячейку.
Страницы: 1 2 След.
Читают тему
Наверх