Страницы: 1
RSS
Application.ScreenUpdating и панель задач
 
Господа, прошу прощения если вопрос где-то был раскрыт, но прочитав все темы в поиске по запросу (как в заголовке) ответа я не нашел.  
 
Вступление:  
Имеется наипростейшая процедурка смысл которой таков: есть открытая активная книга "расчет картона (разработка), необходимо открыть в фоне книгу "productionplanR14" и снова активировать книгу "расчет картона (разработка)".  
 
Код таков:  
 
Sub ProductionPlan()  
   Application.ScreenUpdating = False  
   'Application.ShowWindowsInTaskbar = False  
   Application.Workbooks.Open ("F:\ProductionPlanR14.xls") 'открываем необходимую книгу  
   Application.Workbooks("расчет картона (разработка).xls").Activate 'активируем изначальную книгу  
   'Application.ShowWindowsInTaskbar = True  
   Application.ScreenUpdating = True  
End Sub  
 
Изначально в процедуре естественно не было строчек Application.ShowWindowsInTaskbar, которые в коде выше помечены как комментарии.  
 
Результат вышеописанного кода в экселе выполняется правильно, то есть запустив макрос в текущей открытой книге, в фоне открывается 2я книга и активной остается 1я книга. Однако в панели задач почему то активной отображается 2я книга, а не первая.  
 
При убирании ковычек со строчек Application.ShowWindowsInTaskbar, после выполнения макроса, в панели задач активным показывается правильная книга (изначальная из которой и запускался макрос)  
 
Вопрос:  
почему Application.ScreenUpdating так работает странно, как избежать этого "бага" без прописывания дополнительных строчек с Application.ShowWindowsInTaskbar.  
 
Надеюсь описал непонятный момент доступно...
 
Пытаюсь прикрепить скриншот проблемы - страница с ответом виснет и скриншот вместе с постом не загружается...
 
Объясню как сам понимаю это :)  
 
Метод "Application.ScreenUpdating" отвечает за обновление экрана самого "Excel", но не других приложений. Например, удаление значений в ячейках, строк и т.д.    
 
А метод "Application.ShowWindowsInTaskbar" отвечает именно за панель задач.
<FONT COLOR="CadetBlue">
 
Sub ProductionPlan()  
Dim x As Workbook  
Set x = GetObject("F:\ProductionPlanR14.xls") 'открываем необходимую книгу  
'........ Ваш код  
x.Close 0  
Set x = Nothing  
End Sub
Я сам - дурнее всякого примера! ...
 
Спасибо за ответы.  
 
KukLP, вы все правильно написали с точки зрения нормального кода по открытию книги.  
 
Но мне как раз интересен был ответ именно по функции ScreenUpdating.  
 
Я только начинаю длинный путь изучения VBA, поэтому и вопросы мои тривилальные.  
 
Дъмитръ, я полагал что ScreenUpdating отвечает за обновление экрана в целом, а не только в выполняющемся VBA приложении...
 
{quote}{login=}{date=16.03.2011 03:15}{thema=}{post}С  
1)KukLP, вы все правильно написали с точки зрения нормального кода по открытию книги.  
2)Но мне как раз интересен был ответ именно по функции ScreenUpdating.  
3)Дъмитръ, я полагал что ScreenUpdating отвечает за обновление экрана в целом, а не только в выполняющемся VBA приложении...{/post}{/quote}  
2. Это не функция, это свойство;  
3. как только процедура закончилась, свойство автоматом возвращается в true(и это правильно, иначе пришлось бы перезапускать Экс в случае любого сбоя, или забывчивости программиста);  
1. я предложил вариант, при котором использование ScreenUpdating не нужно.
Я сам - дурнее всякого примера! ...
 
KukLP, спасибо, разобрался, буду использовать предложенную вами схему.
 
А вот GetObject, как раз функция:-) Ну, считайте занудой.. Все это я беру из справки - F1.
Я сам - дурнее всякого примера! ...
 
KukLP, я правильно понимаю что эта функция применима к любому кол-ву открываемых книг/листов, из которых нужно в кучу собрать информацию на итоговом листе активной книги?  
 
Всмысле без принудительного свойства ScreenUpdating = False у меня ничего мелькать не будет при выполнении макроса на фоне?
 
Не правильно. Если Ваш итоговый лист неактивен и в это время вы меняете на нем данные(берете из других книг), то открытие-закрытие этих книг не повлияет на обновление экрана, Вы никак не сможете отследить это. Однако, изменение данных на активном листе НЕИЗБЕЖНО вызовет ScreenUpdating, если он не установлен в False. Такого не произойдет, если не делать Ваш итоговый лист активным, либо все же прямо указав ScreenUpdating = False. Как я упоминал, "как только процедура закончилась, свойство автоматом возвращается в true", но хорошим тоном будет вернуть его директивно - Application.ScreenUpdating = True.
Я сам - дурнее всякого примера! ...
 
Хорошо, вариант с активной книгой, но неактивным листом подойдет?)  
 
То есть консолидация и обработка информации будет в текущей книге но в новом генерируемом листе.
 
Нарколог: Вы пьете?  
Пациент: Это вопрос или предложение?  
Я к тому - что это было: "подойдет?)"  
Вариант с активной книгой, но неактивным листом подойдет.  
Но боюсь, меня поняли неправильно. На самом деле применение свойства ScreenUpdating в нужном месте очень даже кстати. Т.е. не стоит менять активный лист во избежание применения этого свойства. По скорости ничего не выигрывается(если не сказать наоборот). Если Вы хотите заполнять данными из других книг активный лист, используйте ScreenUpdating. Если неактивный - незачем, не нужно.  
The_Prist в двух словах бы объяснил. У меня такого дара нет.
Я сам - дурнее всякого примера! ...
 
Я все понял что вы хотели донести по поводу ScreenUpdating. Спасибо вам за это.  
 
Неясным для меня осталась лишь одна вещь - это панель задач, в которой "нажатой" (активной) показывается временная книга, которую я открывал, а не та книга, которая в действительности является активной на момент окончания макроса (по процедуре приведенной в 1м посте). Если например временную книгу просто открыть и закрыть, то в панели задач активной (нажатой) книги после выполнения макроса вообще не будет..., хотя на экране активной становится та книга, которую я в конце процедуры собственно и указал сделать активной.  
Эта ситуация исправляется только принудительным обновлением панели задач после выполнения макроса (свойством ShowWindowsInTaskbar). Когда процедура написана с принудительным обновлением панели задач, то активное книга экселя совпадает с "нажатой" книгой на панели задач.
 
Я всетаки с дома скину скриншот проблемы с панелью задач.
 
Далась Вам эта панель задач :-) Представьте, что она вообще не отображается.
 
Мне эта панель задач действительно не сдалась, просто я пишу не только для себя код но и для других людей, которые вообще далеки от VBA. И ради их спокойствия я пытаюсь сделать так, чтобы все для них было как можно проще и привычнее, если они после выполнения макроса увидят открытой книгу экселя №1, а в панели задач "нажатой" книгу №2, или вообще никакой не "нажатой". То это будут лишние звонки мне, и лишняя трата моего времени на объяснения)  
 
Посему, я думаю оптимальным решением будет добавлять свойство ShowWindowsInTaskbar в начало и конец процедур.
Страницы: 1
Читают тему
Наверх