Как да защитим лист от потребител, но не и макрос, Excel за всички
Понякога е полезно да защитите данните на листа от промени от други потребители, но в същото време ще трябва да работите и с данните на листа от VBA (т.е. да направите промени с помощта на код). Обичайната защита на листа, разбира се, е подходяща, въпреки че има малък недостатък: преди всеки достъп до листа, трябва да премахнете защитата от него, да извършите необходимите действия и да го защитите отново:
Sub Write_in_ProtectSheet () 'премахване на защитата от работни листове ("Sheet1"). Премахнете защитата ", ако листът е защитен с парола 1234: Работни листове (" Sheet1 "). Отстранете защитата от действия" 1234 " върху листа. Например, промяна на стойността на клетка A1 Cells ("A1"). Value = "www.excel-vba.ru" 'Защита на листа с работни листове ("Sheet1"). Protect', ако листът е бил защитен с парола 1234: Работни листове ("Sheet1"). Защита "1234" Край Sub
Но има по-лесен метод.
Ако изпълните следния ред код, потребителят няма да може да променя данните на листа (с изключение на тези, които вие сами разрешавате), но кодът на VBA (макрос) ще може безопасно да прави промени, без да премахва защита.
Sub Protect_for_User_Non_for_VBA () ActiveSheet.Protect Password: = "1111", UserInterfaceOnly: = True End Sub
Основната роля тук играе параметърът UserInterfaceOnly . Ако е зададено на True, то казва на Excel, че VBA кодовете могат да извършват действия за промяна на клетките, без да премахват защитата, използвайки метода Unprotect В този случай обаче защитата на самия лист не се премахва и е невъзможно ръчно да се променят данните на клетката, без да се премахне защитата от листа.
Горният код задава такава защита само на активния лист на книгата. Но можете да посочите изрично лист (например, задайте защита на лист с име Sheet1 в активната работна книга и листа, който е на второ място по ред в работната книга (Sheets (2))):
Sub Protect_for_User_Non_for_VBA () Sheets (2) .Protect Password: = "1111", UserInterfaceOnly: = True Sheets ("Sheet1"). Protect Password: = "1111", UserInterfaceOnly: = True End Sub
Също така, дадения код може да бъде леко модернизиран и да позволи на потребителя, в допълнение към промяната на клетките, да използва автофилтъра:
Sub Protect_for_User_Non_for_VBA () Sheets (2) .Protect Password: = "1111", UserInterfaceOnly: = True 'поставете защита на листа "Sheet1" и разрешете използването на филтър Sheets ("Sheet1"). Protect Password: = "1111", AllowFiltering: = True, UserInterfaceOnly: = True End Sub
Можете също така да разрешите други действия (маркиране на незащитени клетки, подчертаване на защитени клетки, форматиране на клетки, вмъкване на редове, вмъкване на колони и др. Можете да научите повече за наличните опции в статията Защита на листове и клетки в MS Excel). И как ще изглежда редът на кода с разрешените параметри, можете да разберете, като напишете настройката за защита на листа с необходимите параметри с макрорекордера:
