Страницы: 1
RSS
Вопрос по Worksheet_SelectionChange
 
Добрый день, Уважаемые.    
Вопрос касательно написания кода надстройки. Например нам надо чтобы вызывалась продцедура test() при изменении ячейки А1 на текущем листе. Для этого вставляю в модуль листа:  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
   If Target.Address = "$A$1" Then Call test  
End Sub  
Вроде работает!    
Внимание вопрос. Что нужно дописать что бы при использовании этого файла как надстройки продцедура test запускалась при изменении ячейки А1 на любом листе текущей ВоркКниги ?
Редко но метко ...
 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Спасибо
 
{quote}{login=R Dmitry}{date=23.12.2010 09:39}{thema=}{post}Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range){/post}{/quote}  
 
Эту продцедуру вставить в надстройку вместо Worksheet_SelectionChange ?  
Я правильно понял?
Редко но метко ...
 
Дык продцедура Workbook_SheetChange будет отлавливать изменение листа в самой надстройке а не в любой другой книге, или я что то не допонимаю ?
Редко но метко ...
 
{quote}{login=GIG_ant}{date=23.12.2010 09:48}{thema=}{post}Дык продцедура Workbook_SheetChange будет отлавливать изменение листа в самой надстройке а не в любой другой книге, или я что то не допонимаю ?{/post}{/quote}  
так попробуйте :)  
в модуле книга, событие которое отвечает за все листы Workbook_SheetChange
Спасибо
 
а надстройка что загружается не во все книги?
Спасибо
 
Тогда подскажите что я не правильно делаю.  
Беру пустой файл.  
Вставляю в модуль книги продцедуру:  
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  
   MsgBox Sh.Parent.Name  
End Sub  
Сохраняю как надстройку.  
Подключаю.  
Открываю новую книгу, изменяю значения, и ниче не происходит ((. Похоже где то я чего то не доделал. В чем загвоздка ?
Редко но метко ...
 
Знатоки VBA. Подскажите как же все таки из надстройки отловить изменение которое происходит на листе другой книги. Застрял я на этом вопросе.
Редко но метко ...
 
так
Живи и дай жить..
 
{quote}{login=слэн}{date=23.12.2010 10:39}{thema=}{post}так{/post}{/quote}  
Спасибо Слэн. Похоже на то. Буду разбираться.
Редко но метко ...
 
Я для подобной ситуации создавал пользовательский класс.  
 
Объявял так  
Public wshEvent As clsSheetEventValues  
 
В обычных модулях  
Set wshEvent = New clsSheetEventValues  
 
 
В Class Modules  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
   If frmControlValue.Visible Then Call FormulaToolGo  
   If frmContVal.Visible Then Call ControlValuesGo  
End Sub  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
   If frmControlValue.Visible Then Call FormulaToolGo  
   If frmContVal.Visible Then Call ControlValuesGo  
End Sub  
 
 
 
 
Private Sub Class_Terminate()  
   Set Worksheet = Nothing  
End Sub  
 
Вообщем смотрите в мторону пользовательских классов
 
{quote}{login=слэн}{date=23.12.2010 10:39}{thema=}{post}так{/post}{/quote}  
Слэн, если не трудно, как заменить продцедуру что бы отлавливала не изменение ячейки, а клик по ячейке?
Редко но метко ...
 
просто клик - нет.  
есть двойной клик.  
 
или selectionchange - тоже сопровождается кликом
Живи и дай жить..
 
{quote}{login=слэн}{date=23.12.2010 11:16}{thema=}{post}просто клик - нет.  
есть двойной клик.  
 
или selectionchange - тоже сопровождается кликом{/post}{/quote}  
 
именно selectionchange
Редко но метко ...
 
Konstantin_ с наскоку разобраться не удалось, не пойму что в вашем примере обозначает rmControlValue, frmContVal.Visible и что за продцедуры FormulaToolGo  
и ControlValuesGo, наверное это что то из серии встроенных, но в справке не показывает.
Редко но метко ...
 
{quote}{login=GIG_ant}{date=23.12.2010 11:21}{thema=}{post}Konstantin_ с наскоку разобраться не удалось, не пойму что в вашем примере обозначает rmControlValue, frmContVal.Visible и что за продцедуры FormulaToolGo  
и ControlValuesGo, наверное это что то из серии встроенных, но в справке не показывает.{/post}{/quote}  
Private Sub Worksheet_Change(ByVal Target As Range)  
If frmControlValue.Visible Then Call FormulaToolGo  
If frmContVal.Visible Then Call ControlValuesGo  
End Sub  
- это просто процедуры, которые вызываются на эти события  
 
Поидее вам нужно:  
 
 
1) Создать новый Class Module  
 
Option Explicit  
 
Public WithEvents Worksheet As Worksheet  
Public wshEvent As clsSheetEventValues  
 
Private Sub Worksheet_Calculate()  
'Событие на пересчет  
End Sub  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
'Событие на лист чанге  
End Sub  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
'Событие на селектион Change  
End Sub  
 
2)Объявить переменную (у меня это делается в отельном моудуле, по другому вроде не работало)  
 
Public wshEvent As clsSheetEventValues  
 
3) В ваших модулях исаользовать следующее (возможно в вашем случае это нужно прописать на событие на    
Private Sub Workbook_SheetActivate(ByVal Sh As Object)  
Set wshEvent = New clsSheetEventValues  
   Set wshEvent1.Worksheet = ActiveSheet  
End Sub  
 
т.е. класс модуля присваивается активному листу  
 
4) Наверное аолезно добавить и это на событие деактивации листа  
 
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)  
Set wshEvent = Nothing  
End Sub  
 
P.s к сожалению принцип работы модулей класса мне не настолько понятин, что бы достойно объяснить как это работает. Но думаю немного погуглив и ориентируясь на мое описание вы справитесь
 
Вот собрал пример - ксласс модуля на событие worksheet_change  
 
1) В модуле эта книга подсовываем class module активный лист  
Private Sub Workbook_SheetActivate(ByVal Sh As Object)  
Set wshEvent = New clsWrkEvents  
Set wshEvent.userWrksh = ActiveSheet  
End Sub  
 
2) В classmodule (clsWrkEvents)  
Обрабатываем событие изменения листа и в случае если адресс Target = A1 то делаем некое действие
 
Konstantin_  
Спасибо большое. Буду разбираться.
Редко но метко ...
Страницы: 1
Читают тему
Наверх