Страницы: 1
RSS
Программное изменение события
 
Возможно ли программно изменить (создать) событие листа. Например событие при активации???
 
Что Вы вкладываете в понятие "изменить событие листа? Ключевое слово в вопросе: ИЗМЕНИТЬ.
 
{quote}{login=ratboy}{date=25.11.2009 08:26}{thema=Программное изменение события}{post}Возможно ли программно изменить (создать) событие листа. Например событие при активации???{/post}{/quote}  
 
Полагаю автор ошибся - очевидно имел в виду ОПИСАТЬ событие активации.    
Лист имеет ряд зарезервированных имен процедур обработки событий активного листа книги - один из них, полагаю будет Вам интересен:    
 
Private Sub Worksheet_Activate()  
 (здесь пишете свой код)  
End Sub    
 
Все просто ...
 
{quote}{login=VovaK}{date=25.11.2009 08:57}{thema=Re: Программное изменение события}{post}{quote}{login=ratboy}{date=25.11.2009 08:26}{thema=Программное изменение события}{post}Возможно ли программно изменить (создать) событие листа. Например событие при активации???{/post}{/quote}  
 
Полагаю автор ошибся - очевидно имел в виду ОПИСАТЬ событие активации.    
Лист имеет ряд зарезервированных имен процедур обработки событий активного листа книги - один из них, полагаю будет Вам интересен:    
 
Private Sub Worksheet_Activate()  
 (здесь пишете свой код)  
End Sub    
 
Все просто ...{/post}{/quote}  
 
Вот конкретно: Как программно (другой процедурой) описать событие активации листа???
 
Например, в какой-либо процедуре вызываем активацию нужного листа. Это приведёт к событию  Worksheet_Activate, как и написал VovaK. Но подозреваю, что Вам нужно нечто другое :-)
 
так и писать  
Worksheet("имя").Activate
 
> Как программно (другой процедурой) описать событие активации листа???  
 
Лично мне эта фраза абсолютно непонятна.  
Опишите своими словами, чего Вы пытаетесь добиться в результате.  
 
Представьте, что нужный вам код уже готов. Как он работает?
 
Лично я первый вопрос, т е "Возможно ли программно изменить (создать) событие листа. Например событие при активации???" понимаю как:  
можно ли добавить спецэффектов при открытии? А в качестве примера, если бы не был интеллектуально ограниченным типом, написал бы макрос с какими-нибудь красочными изменениями заливки секунд на 5 при смене листа. А что? Не всё время же работу работать в экселе.
 
Может быть Вы ищете аналог кода, который программно нажимает на некую кнопку? Т.е. пытаетесь имитировать событие, которого фактически не было.
 
Попробуем пооперационно:  
 
1. Открываем редактор VBA.  
2. Заходим в меню View и выбираем Project Explorer. Ура - видим структуру активной книги.  
3. Выбираем лист (к примеру лист1), в этом случае наш макрос заработает всегда, когда мы откроем этот лист. Если выберем "Эта книга", то макрос будет работать при активации книги (отвлечение).    
4. Выбрав лист, справа появится пустое поле - Это и есть то самре сокровенное - поле записей кода. В верху этого поля списки -  слева объекты, справа процедуры.  
Выберите слева WorkSheet, затем справа из списка Activate. Ура - полулилось!  
5. Если последняя фраза к Вам относится, то на поле записей появится долгожданная заготовка процедура обработки события активации листа:  
 
Private Sub Worksheet_Activate()  
   
End Sub  
 
Теперь просто?....
 
{quote}{login=EducatedFool}{date=25.11.2009 09:13}{thema=}{post}> Как программно (другой процедурой) описать событие активации листа???  
 
Лично мне эта фраза абсолютно непонятна.  
Опишите своими словами, чего Вы пытаетесь добиться в результате.  
 
Представьте, что нужный вам код уже готов. Как он работает?{/post}{/quote}  
 
Работает он так:  
При нажатии кнопки на листе книги, на всех остальных листах книги на событии Worksheet_SelectionChange появляется код MsgBox "Код вставлен"
 
VBA: Как добавить одну или несколько строк в нужное место программы ?    
http://msoffice.nm.ru/faq/macros/module.htm#faq326  
 
 
Оно?
Bite my shiny metal ass!      
 
{quote}{login=}{date=25.11.2009 09:35}{thema=Re: }{post}{quote}{login=EducatedFool}{date=25.11.2009 09:13}{thema=}{post}> Как программно (другой процедурой) описать событие активации листа???  
 
Лично мне эта фраза абсолютно непонятна.  
Опишите своими словами, чего Вы пытаетесь добиться в результате.  
 
Представьте, что нужный вам код уже готов. Как он работает?{/post}{/quote}  
 
Работает он так:  
При нажатии кнопки на листе книги, на всех остальных листах книги на событии Worksheet_SelectionChange появляется код MsgBox "Код вставлен"{/post}{/quote}  
 
 
 
Фраза из анекдота:  
 
 
А В ЧЕМ СУТЬ????  
 
Если серьезно, то что вы написали осуществить очень просто, вопрос зачем? Где логика в этих сообщениях?
 
> При нажатии кнопки на листе книги, на всех остальных листах книги на событии Worksheet_SelectionChange появляется код MsgBox "Код вставлен"  
 
Это, между прочим, один из самых сложных и неэффективных способов решения задачи.  
 
Намного проще написать в обработчике события Workbook_SheetSelectionChange УНИВЕРСАЛЬНЫЙ макрос, а кнопкой изменять лишь значение какой-нибудь переменной, от которой быдет зависеть, что сделает макрос.  
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  
' универсальный макрос  
End Sub  
 
Это намного проще, чем вставлять код в модули всех листов по-отдельности...
 
Суть:  
В приложенном файле на у листа есть одно хорошее свойство - при вводе циферь в ячейки они суммируются.  
Делаю надстройку для себя, так как постоянно создаю новые книги и листы и это свойство мне нужно на новых листах.  
Суммирование при вводе циферь достигается кодом на событиях листа Worksheet_Change и Worksheet_SelectionChange. Вот мне и надо, чтобы ручками постоянно не добавлять, кд добавлять программно.
 
OFFTOP:    
Увидел в коде:  
 
> Двойной щелчек недопустим!!!  
> Нельзя таким образом выделять ячейки. Это опасно!!!    
 
Можно узнать, почему???  
А то я до сих пор так выделяю ячейки, и даже не подозревал, что это опасно...
 
> Делаю надстройку для себя, так как постоянно создаю НОВЫЕ КНИГИ и листы  
 
В этом случае ПРОЩЕ поступить иначе.  
Не надо записывать в каждую книгу этот код.  
 
Надстройка, будучи загруженной вместе с Excel, способна перехватывать события активации листов и ячеек всех открытых книг.  
Достаточно правильно прописать этот код в надстройке.  
 
Потребуется создать модуль класса с подобным кодом:  
 
Public WithEvents AppEv As Application  
 
Private Sub AppEv_NewWorkbook(ByVal WB As Workbook)  
   msgbox "Создана новая книга excel"  
End Sub  
 
Private Sub AppEv_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  
   MsgBox "Изменилось выделение на листе " & Sh.Name & " в книге " & Sh.Parent.Name  
End Sub  
 
 
Пример кода можно найти здесь:  
http://yandex.ru/yandsearch?clid=14585&text=Public+WithEvents+AppEv+As+Application&lr=11162
 
Надстройка спасет автора...
 
Игорь, какая накладка вышла - мой вопрос (а это был все таки вопрос) лег после Вашего описания - утверждением... МДа ... Конфуз вышел... Виноват...
 
Влад, а так лучше?
 
{quote}{login=EducatedFool}{date=25.11.2009 09:56}{thema=}{post}> Делаю надстройку для себя, так как постоянно создаю НОВЫЕ КНИГИ и листы  
 
В этом случае ПРОЩЕ поступить иначе.  
Не надо записывать в каждую книгу этот код.  
 
Надстройка, будучи загруженной вместе с Excel, способна перехватывать события активации листов и ячеек всех открытых книг.  
Достаточно правильно прописать этот код в надстройке.  
 
Потребуется создать модуль класса с подобным кодом:  
 
Public WithEvents AppEv As Application  
 
Private Sub AppEv_NewWorkbook(ByVal WB As Workbook)  
   msgbox "Создана новая книга excel"  
End Sub  
 
Private Sub AppEv_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  
   MsgBox "Изменилось выделение на листе " & Sh.Name & " в книге " & Sh.Parent.Name  
End Sub  
 
 
Пример кода можно найти здесь:  
http://yandex.ru/yandsearch?clid=14585&text=Public+WithEvents+AppEv+As+Application&lr=11162{/post}{/quote}  
А если не на всех листах нужна такая функциональность???  
А двойной щелчок недопустим тому что формулы покоцать можно однако нечаянно.
 
{quote}{login=}{date=25.11.2009 10:15}{thema=Re: }{post}  
А если не на всех листах нужна такая функциональность???  
{/post}{/quote}Можно по имени листа, например, отслеживать функциональность  
Private Sub AppEv_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  
if Sh.Name Like "бла-бла*" then exit sub  
MsgBox "Изменилось выделение на листе " & Sh.Name & " в книге " & Sh.Parent.Name  
End Sub  
 
Если Вы все-таки желаете вставлять код, обратите внимание на мой предыдущий пост.  
Еще, насколько я понимаю, лист можно создать из шаблона уже с готовым кодом.
Bite my shiny metal ass!      
Страницы: 1
Читают тему
Наверх
Loading...