Страницы: 1
RSS
Ошибка в Private Sub Worksheet_Change
 
День добрый.  
Прикрепил пример.  
В файле (для примера) на "листе1" слева создается список документов (добавляются к последнему в столбце), с пометкой "v" (не обработанный). Справа создается список "не обработанных".  
При снятии "v" у документа в списке слева он убирается в списке "не обработанных". Система вполне удобна до тех пор пока список документов не большой и не приходится его проматывать для снятия "v".  
Попытался переделать все с помощью макраса на листе "Выбор"    
Сделал два поиска V1 и V2  
По V1 идет поиск в списке по "v", если есть - формирует список "не обработанных".  
По V2 идет сравнение двух списков по номерам, при нахождении совпадений синхронизируется "v".    
Если макрас запускать вручную (кнопкой) - все работает.  
Если я его засовываю в  Private Sub Worksheet_Change - вылазит   ошибки "400" и др.  
Своих знаний не хватает чтоб это исправить - нужна помощь.  
Заранее благодарю.
 
В код не вникал, при этом могу предположить что ошибка кроется в следующем:  
Дело в том что продцедура Worksheet_Change, как вы знаете, запускается при изменении данных на листе, и вы в этой продцедуре еще раз меняете данные! Что происходит? Правильно, продцедура запускает сама себя еще и еще и так происходит зацикливание. Для того что бы этого избежать используем оператор:  
Application.EnableEvents = False    
который отключает обработку событий, после выполнения изменений данных, не забываем включить обработку событий, оператором:  
Application.EnableEvents = True  
 
Попробуйте в своем файле.
Редко но метко ...
 
Вроде и не понедельник, а не заметил в вашей продцедуре вышеописанные операторы )).  
Сорри, счас посмотрю код внимательней.
Редко но метко ...
 
Для начала проверьте вот эту часть:  
Select Case Target.Address  
Case ri.Address: Application.EnableEvents = False: GoTo V2  
Case rii.Address: Application.EnableEvents = False: GoTo V2  
End Select  
 
Здесь ri и rii - это диапазоны ячеек, а вы его сравниваете с Target.  
Допустим что Target.Address не удовлетворяет ни одному из условий Case, что тогда?  
Application.EnableEvents = False  -  не выполняется, а продцедура продолжает работу, соответственно возникает ошибка, описанная мной выше.
Редко но метко ...
 
Спасибо    
Application.EnableEvents = False    
Потерялась во время переделок.  
Заработало.  
По поводу Select Case Target.Address  
Там вроде жестко задается диапазон слежения изменений, если изменений в деапазоне не происходит то Private Sub Worksheet_Change не срабатывает.  
Или я чего то не понимаю. Добавил Case Else: GoTo endd - не работает.  
Еще не подскажешь Private Sub Worksheet_Change срабатывает только при активном листе. как быть при не активном?
 
Если хотите отслеживать изменения не только на активном листе, используйте продцедуру Workbook_SheetChange, где в зависимости от листа выполняйте необходимые действия.
Редко но метко ...
 
{quote}{login=Grey_S}{date=31.01.2012 12:50}{thema=}{post}По поводу Select Case Target.Address{/post}{/quote}Target ведь нужно задавать. У Вас ведь там даже комментарий есть соответствующий: "'задаем диапозон отслеживания изменений"
 
{quote}{login=GIG_ant}{date=31.01.2012 12:59}{thema=}{post}Если хотите отслеживать изменения не только на активном листе, используйте продцедуру Workbook_SheetChange, где в зависимости от листа выполняйте необходимые действия.{/post}{/quote}  
 
 
Workbook_SheetChange  
Как я понимаю нужно вставлять уже не в лист, а в книгу. И в макрасе  явно указать путь для Range на лист - примерно так  
Worksheets("Выбор").Renge()  
Я прав?
 
{quote}{login=Юрий М}{date=31.01.2012 01:35}{thema=Re: }{post}{quote}{login=Grey_S}{date=31.01.2012 12:50}{thema=}{post}По поводу Select Case Target.Address{/post}{/quote}Target ведь нужно задавать. У Вас ведь там даже комментарий есть соответствующий: "'задаем диапозон отслеживания изменений"{/post}{/quote}  
Извините в vda нуб, можно по подробней  
что то вро этого  
if target.row=i and target.column=j then ... ?
 
Посмотрите, как на событие, например, SelectionChange задаётся контролируемый диапазон:  
If Not Intersect(Target, Range("A2:A100")) Is Nothing Then  
А где у Вас аналогичное для Change?
 
{quote}{login=Юрий М}{date=31.01.2012 02:14}{thema=}{post}Посмотрите, как на событие, например, SelectionChange задаётся контролируемый диапазон:  
If Not Intersect(Target, Range("A2:A100")) Is Nothing Then  
А где у Вас аналогичное для Change?{/post}{/quote}  
 
Согласен - нет такого.  
Но и в примере который я использовал нет  
Ссылка    
http://www.programmersforum.ru/showthread.php?t=49237
 
Есть. Только написано по другому. Target.Address
 
{quote}{login=RAN}{date=31.01.2012 03:26}{thema=}{post}Есть. Только написано по другому. Target.Address{/post}{/quote}  
 
Поправьте меня,если я ошибаюсь  
If Target.Address = [d8].Address Then
Грубый перевод: если цель(значение адрес) =[d8](значение адрес) тогда
Во втором примере  
Select Case Target.Address    
Case [d8].Address:
Грубый перевод: выбор в случае цель(значение адрес)  
В случае [d8](значение адрес):
Получается тоже указывается значения Target.Address
 
Заменил Private Sub Worksheet_Change на Private Sub Worksheet_Calculate()  
Вставил формулы для подсчета "v" в каждом из списков для его активации, теперь макрас работает и при не активном листе.  
 
 
Всем еще раз огромное спасибо за помощь
Страницы: 1
Читают тему
Наверх