Страницы: 1
RSS
Загвоздка с макросом "активности пользователя"
 
Доброе время суток УВ форумчане!  
Есть сложность с макросом. Для листа содержание есть макрос  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Active_Row = Target.Row  
Cells(Active_Row, 14) = Cells(Active_Row, 1)  
Dim S As Integer  
S = 1  
End Sub  
 
 
Private Sub Worksheet_Deactivate()  
If S = 1 Then If MsgBox("Сохранить", 52, "Внимание!") <> vbYes Then Sheets("Содержание").Visible = False  
End Sub  
 
При изменениях на листе, содержимое первой ячейки копируется в N:N столбик, но на листе содержится список, при выборе значения значения списком "это" условие не срабатывает, работает только если занести данные в ручную. Как можно поправить? или есть    
возможность заставить список вызвать функцию, или изменить значение еще в одном месте при активации.  
 
И эта часть макроса  
Dim S As Integer  
S = 1  
совсем не работает.  
так как Sub Worksheet_Deactivate() никогда не отрабатывает...  
 
Подскажите пожалуйста как можно починить.  
Заранее благодарен!
 
Процедура Worksheet_Deactivate() ничего не знает про переменную S, объявленную в другой процедуре. Возможно, надо так:  
 
Dim S As Integer  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Active_Row = Target.Row  
Cells(Active_Row, 14) = Cells(Active_Row, 1)  
S = 1  
End Sub  
 
Private Sub Worksheet_Deactivate()  
 
'если были изменения, смотрим P1'  
If S = 1 Then If MsgBox("Сохранить?", 52, "Внимание!") <> vbYes Then Sheets("Содержание").Visible = False: S = 0  
End Sub
 
.
Я сам - дурнее всякого примера! ...
 
Большое спасибо, "Сохранение заработало", а по поводу не срабатывания Worksheet_Change(ByVal Target As Range)  
при выборе значений из списка, а не занесением их в ручную, есть идеи?
 
Вы мой файл смотрели? Заносит в N1. Кто знает куда Вам надо...
Я сам - дурнее всякого примера! ...
 
Простите, проглядел, мне нужно, чтоб значение было в столбце N, в той строке где находится список. Список всегда находится во втором столбце. Может можно передать координатами как-то так  
iCount  - строка в которой находится текущий список  
   ft = Cells(iCount, 3).Top  
   fl = Cells(iCount, 3).Left  
   fw = Cells(iCount, 3).Width  
   fh = Cells(iCount, 3).Height
 
Вы что, список по столбцу тягать собираетесь?
Я сам - дурнее всякого примера! ...
 
См. как позиционировать шейп.
Я сам - дурнее всякого примера! ...
 
У меня их много, макрос читает из базы значения, каждая строчка товар, с ценой, скидкой и т.д. в зависимости от того что выбрано в списке, меняется формула расчета, а если не меняется, то меняется сумма сделки. На основе активности пользователя, я при сохранении решаю какие изменения заносить в базу данных, а какие не изменились. На мой взгляд это быстрее чем пересматривать и сравнивать все.
 
Солоноват для меня пример... но придумал обходной спосою.  
Получается так... у меня всегда номер элемента ComboBox будет соответствовать строке, то есть ComboBox56, это строчка 56. Можно ли как-то узнать имя, активированного бокса? если да, то тогда будет работать для всех, что-то типа этого  
Private Sub ComboBoxN_Change()  
Application.EnableEvents = 0  
Form = ActiveSheet.Shapes.Range(Array(Form)).Name  
'Правда нужно будет узнать цифры из имени формы'  
Cells(Form, 14).Value = 1  
Application.EnableEvents = -1  
End Sub
 
Я просто, только начал с макросами знакомится...)
 
Очередной мильёнщик!  
ComboBox56, это строчка 56 - уже страшно.  
Здесь кошки. Тренируйтесь.  
http://www.excelworld.ru/forum/2-2065-1
 
razmus, плодить комбобоксы на листе по к-ву строк, это изначально ошибочный путь. Даже если Может Вам сделать списки проверки данных, что гораздо проще и не так утяжелит файл?
Я сам - дурнее всякого примера! ...
 
KukLP  
Согласен, вы правы, в остальных местах я использовал боксы из-за возможностей поиска, но здесь без них можно обойтись. Сделал проверки, решило проблему отслеживания изменений, но породило новую, теперь при выборе значения из "проверки" макрос отслеживания срабатывает, но потом вылетает в дебаг "на нем".... может для проверок в нем нужно что-то поправить?  
Dim S As Integer  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Active_Row = Target.Row  
Cells(Active_Row, 14) = Cells(Active_Row, 1)  
S = 1  
End Sub  
 
З.Ы.  
Бокси создаются только по запросу, а по окончании работы с ними удаляются, так что размер файла от их количества совершенно не зависит.  
 
RAN  
Спасибо, обязательно посмотрю
 
Дебаг говорит, MetHod '_Default' of object 'Range' Failed
 
ВБА не понимает такой записи "Cells(Active_Row, 14) = Cells(Active_Row, 1)". Укажите, какое именно свойство должна получить целевая ячейка.
 
Если написать Cells(Active_Row, 14).Value = Cells(Active_Row, 1).Value  
Дебаг говорит, MetHod 'Value' of object 'Range' Failed  
Так что видимо не в этом дело
 
После удаления с листа, ComboBox все заработало так как нужно.  
Большое спасибо всем кто откликнулся!
Страницы: 1
Читают тему
Наверх