Страницы: 1
RSS
программный запрет на изменения фона в ячейке
 
Доброго времени суток!  
 
Задача - Запретить юзверям обесцвечивать любой выделенный диапазон.  
 
Вот моя попытка:  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
   If Selection.Interior.ColorIndex = 0 Then  
   With Application  
           .EnableEvents = False  
           .Undo  
           .EnableEvents = True  
      End With  
   End If  
End Sub  
 
Этот код не работает.    
 
Спасибо.
 
Попробуйте так:  
 
В стандартный модуль:  
Public r As Range  
Public c As Long  
 
В модуль книги:  
Private Sub Workbook_Open()  
   Set r = Selection  
End Sub  
 
В модуль листа:  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
   If Selection.Cells.Count > 1 Then  
       With Application  
           .EnableEvents = False  
           Target(1).Select  
           .EnableEvents = True  
       End With  
   End If  
 
   r.Interior.ColorIndex = c  
   Set r = Selection  
   c = r.Interior.ColorIndex  
     
End Sub  
 
 
Правда Вам как разработчику следует придумать для себя BackDoor, чтоб иметь возможность красить :)  
Ну или просто отключите макросы :)
 
Спасибо)  
Полагаю запрет на события поможет в коде каждого макроса?
 
Не понял вопроса.
 
Интересно, а есть ли ограничение на количество обрабатываемых событий на листе? Конечно предполагается, что каждый код обработчик будет прописан отдельно (ptivate sub.... end sub).  
 
Кстати в приведенном коде стоит запрет на любое изменение цвета?  
С наскока не смог его осилить в понимании)
 
{quote}{login=Hugo}{date=27.03.2012 10:04}{thema=}{post}Не понял вопроса.{/post}{/quote}  
 
Application.EnableEvents = False  
........Код любого другого макроса  
Application.EnableEvents = True  
 
Речь шла об этом.
 
Тогда сформулирую вопрос несколько иначе:  
- при изменении цвета ячейки срабатывает событие Worksheet_SelectionChange  
- нужно определить новый цвет заливки ячейки, и если его индекс будет равен 0, тогда :  
With Application  
.EnableEvents = False  
.Undo  
.EnableEvents = True  
End With  
- если заливка имеет любой другой индекс, тогда игнорим событие.  
 
Вот такое возможно?
 
Поясню - я не отслеживаю изменение цвета. Я просто запоминаю предыдущую выделенную ячейку и ее цвет. При изменении выделения - возвращаю запомненному запомненный цвет и запоминаю новую пару.  
Но обнаружил недостаток - при переходе на другой лист цвет на первом листе не возвращается.  
Т.е. сейчас можно поменять цвет, уйти на другой лист и сохраниться (или даже не уходя - сохранить и закрыть файл) - и новый цвет запомнится и при открытии книги будет уже новый.  
Нужно дополнить - при сохранении возвращать диапазону цвет.  
 
Про отслеживание событий -    
- при изменении цвета ячейки НЕ срабатывает событие Worksheet_SelectionChange  
при изменении цвета ячейки вообще ни одно событие не срабатывает :(
 
Спасибо за обстоятельный ответ.  
Ладно, пока ограничусь запретом на изменение самих ячеек.  
 
Кстати, а как насчет варианта с таймером вместо события?  
Т.е. чтобы через кадый энный промежуток времени запускалась проверка на изменение цвета общего диапазона листа. Только скорее всего тормоза будут...
 
А почему не подходит стандартная защита листа?
 
Дело в том, что пользователю файла предстоит выделять определенным цветом строки (на цвет натасканы несколько макросов) и в то же время другие макросы также оперируют фоном в ячейках.  
А некоторые хитрые юзвери норовят обойти статистику , в которую заносятся итоги работы макросов по обработке выделенных цветом строк. Т.Е. убивают цвет и что-то делают с файлом, только потом хвостов не найти. Некоторые по незнанию, некоторые из вредности, некоторые терпеть не могут читать всякие инструкции и считают, что они знают лучше...  
Вот пытаюсь это победить. Создать русло, трамвайные рельсы.
 
Ну тогда мой вариант не годится  -он вообще не даёт менять цвет, да и строку выделить тоже не получится.  
Но как принцип использовать вероятно можно, только нужно дорабатывать.
 
Может быть подойти с другой стороны?  
Макрос, который подсчитывает цвета, заносит значения цветов в массив. Массив можно хранить например в стороннем текстовом файле.  
У Вас ведь вероятно ограниченное количество подконтрольных ячеек?  
например, 1000.  
При первом подсчёте макрос заносит нужные цвета в нужные ячейки массива.  
При следующем - только дополняет, а изменившимся возвращает назад из массива.  
Т.е. например отслеживаем 6 - если в массиве уже 6, а на листе снова не 6, то меняем на 6.  
Если допустимых цветов десяток - тоже можно организовать как-то... :)
 
Динамическая система учета разного барахла с чертовой уймой наименований и пр.. Хотя теоретически рамки обозримы)  
 
Т.к. я больше практиковался на простеньких макросах по работе с циклами, массивами и пр., то по всем этим обработчикам событий я дуб. Это конечно поправимо) Просто я даже не знаю с какого конца браться за реализацию проверки того-же массива по таймеру. А массив может быть public?  
 
Нужен крохотный пример модуля для листа с таймером.  
 
Спасибо.
 
Мне кажется, что с таймером не стОит заниматься.  
Вам ведь вероятно важно, чтоб посчитанное не расходилось с фактом.  
И если юзер заменил цвет, потом вернул назад, но это ещё не посчиталось - то и фиг с ним?  
Я предлагаю запоминать в стороннем массиве (вне файла, чтоб сохранение файла xls не играло роли, хотя можно и в файле, если его принудительно сохранять при операции подсчёта) подсчитываемые цвета.  
Т.е. если подсчитали, что в B10 жёлтое, то при следующем подсчёте (или отдельным кодом) восстанавливаем в B10 жёлтое, независимо от текущего цвета.  
Иными словами - если юзер покрасил и подписался, выполнив подсчёт - то уже назад дороги нет.  
Но если юзерам позволено добавлять/убирать строки/столбцы - тогда реализовать будет трудно. Это думаю нужно запретить.  
Или дать диапазонам имена и проверять количество ячеек в имени - если изменилось, то бить по пальцам.  
Если нет - то просто перебираем все ячейки подконтрольного диапазона и сверяемся с массивом.  
 
Хотя я не настаиваю - я всей задачи не знаю.
 
Пока запретил изменение в ячейках нужного листа.    
Private Sub Worksheet_Change(ByVal Target As Excel.Range)  
   If Target.Count > 1 Then  
      With Application  
           .EnableEvents = False  
           .Undo  
           .EnableEvents = True  
      End With  
   End If  
End Sub  
 
<EM><STRONG>Файл удален</STRONG> -1,3 Мб: велик размер, однако.    
[<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
Ну и что это даёт? По одной изменять не запрещает...
 
Главное, что строки не дает удалять)  
Все это конечно полумеры и все такое...  
Может потом с помощью юзерформ и различных тексбоксов создам оболочкую Но это довольно приличный объем работы. Лень, однако...
Страницы: 1
Читают тему
Наверх