Excel макрос защита ячеек от

Правильная защита макросом

В большинстве случаев защита макросом, которую я встречаю во множестве проектов, выглядит следующим образом:

Worksheets("Лист1").Unprotect Password:="123"
'тут макрос делает действия
Worksheets("Лист1").Protect Password:="123"

То есть автор файла вынужден ставить защиту от шаловливых ручек пользователей, но чтобы его макрос мог выполнить необходимые действия, ему приходится временно снимать ее и затем включать снова. Такая техника работает, но далека от совершенства. Во-первых, это неудобно и требует введения подобных конструкций в каждый ваш макрос. Во-вторых, если выполнение макроса прервется с ошибкой, то лист останется незащищенным.

Есть гораздо более легкий и красивый способ решить задачу.

Нажмите Alt+F11, чтобы попасть в редактор Visual Basic. Затем найдите в левом верхнем углу в окне Project Explorer (если его не видно, то нажмите Ctrl+R) модуль ЭтаКнига (ThisWorkbook) и откройте двойным щелчком:

smart_protection1.gif

Скопируйте туда этот код:

Private Sub Workbook_Open()
    'включаем защиту первого листа для пользователя, но не макроса
    Worksheets("Лист1").Protect Password:="123", UserInterfaceOnly:=True
    
    'второй лист защищаем аналогично, но с возможностью пользоваться группировкой
    Worksheets("Лист2").EnableOutlining = True
    Worksheets("Лист2").Protect Password:="555", UserInterfaceOnly:=True
End Sub

Эта процедура будет автоматически запускаться при открытии файла и ставить защиту на заданные листы книги. Причем параметр UserInterfaceOnly, который мы дополнительно ввели, указывает Excel, что защита не должна распространяться на действия выполняемые макросом, а только на операции пользователя. Для второго листа все еще веселее — строка с параметром EnableOutlining разрешает пользоваться группировкой (символы плюс-минус для сворачивания-разворачивания строк и столбцов) на защищенном листе.

Всего три строчки кода, зато как удобно!

Ссылки по теме

  • Что такое макросы и куда копировать их код
  • Как поставить защиту листа, книги или всего файла

This macro allows you to have a cell automatically locked after a user enters something into it or into another specific cell, range, column, or row.

This is different than just locking an entire spreadsheet because you still want to be able to edit and work with the other cells in the worksheet without having to select and unlock them individually.

Sections:

Unlock the Cells

Macro to Auto-Lock Cells

Lock a Specific Cell

Lock Cell Other Than the One that was Edited

Lock Last Edited Cell

Lock Cell in a Specific Column or Row

Notes

Unlock the Cells

The first thing you have to do is to unlock all of the cells in the worksheet.

  1. Select all of the cells by hitting Ctrl + A or clicking the square next to row 1 and column A.
    968a451bf4d079c06ac431ee01733aa8.png
  2. Right click in the worksheet and choose Format Cells
    d1c63c00618f078970fe3f0387354bc4.png
  3. Go to the Protection tab and uncheck the Locked option at the top.
    216c4387e60b7cab5825e41c909de4ef.png
  4. Hit OK and you’re done with this part.

Now, none of the cells in the worksheet are protected, which means that all of the cells in the worksheet will be editable when you go to protect the worksheet.

This needs to be done so that only specific cells that we choose will be locked from editing.

Macro to Auto-Lock Cells

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$A$1" And Target.Value <> "" Then

    ActiveSheet.Protect Contents:=False
    Range(Target.Address).Locked = True
    ActiveSheet.Protect Contents:=True

End If

End Sub

The important code is this part:

ActiveSheet.Protect Contents:=False
Range(Target.Address).Locked = True
ActiveSheet.Protect Contents:=True

It unprotects the worksheet, locks the cell, and then re-protects the sheet.

This macro needs to be installed into the worksheet where it will run. To do this, right-click the tab of the desired worksheet and click View Code and paste the macro into the window that opens.

This example is a generic example that is easy to modify. It checks which cell was edited and, if a certain cell was edited, it is then locked.

I will show you how to edit this macro in the examples below.

Lock a Specific Cell

Looking at the macro above, this is the line that limits the macro to run only on specific cells:

If Target.Address = "$A$1" And Target.Value <> "" Then

This says that a cell should be locked only if cell A1 was edited and it is not empty.

To make the macro work on cell B1 or D15 or any cell, just replace $A$1 with the desired cell reference. You must put dollar signs in front of the column and row reference for this to work.

You can also lock the cell only if a certain value was input by changing <> «» in the line above to = «desired value» and that allows you to do something like lock the cell only if OK was entered or something similar.

Lock Cell Other Than the One that was Edited

Change this line:

Range(Target.Address).Locked = True

Target.Address is the cell that will be locked and this says to lock the cell that was just edited.

To lock another cell, just use the Range method of referencing cells.

To lock cell B5, it would be Range(B5).Locked = True

Continue that pattern for whichever cell or range you want to lock.

Lock Last Edited Cell

You can lock the last edited cell regardless of which one it was by removing the IF statement in the macro and leaving it like this:

Private Sub Worksheet_Change(ByVal Target As Range)

ActiveSheet.Protect Contents:=False
Range(Target.Address).Locked = True
ActiveSheet.Protect Contents:=True

End Sub

Lock Cell in a Specific Column or Row

To limit the locking to a certain column or row, change the IF statement.

Limit to a row:

If Target.Row = 1 And Target.Value <> "" Then

Change the 1 to whichever row you want and the code will only run on that row.

Limit to a Column:

If Target.Column = 1 And Target.Value <> "" Then

Change the 1 to whichever column you want the code to run on.

Notes

This is a handy macro that allows you to have a lot of control over a worksheet and protecting the data within it.

I didn’t show you how to password protect the worksheet here because I wanted to focus on the method needed to protect only specific cells. Once you get this form of the macro running well, then, add-in the other pieces that you want, like password protection.

Make sure to download the sample file attached to this tutorial so you can work with these examples in Excel.

Similar Content on TeachExcel

Email List of People from Excel Using a Macro

: Send Emails from Excel Course
Send emails to everyone in a list in Excel using a macro. Th…

Loop through a Range of Cells in Excel VBA/Macros

Tutorial: How to use VBA/Macros to iterate through each cell in a range, either a row, a column, or …

Select Cells in Excel using Macros and VBA

Tutorial: This is actually a very easy thing to do and only requires a couple lines of code. Below I…

Select Ranges of Cells in Excel using Macros and VBA

Tutorial: This Excel VBA tutorial focuses specifically on selecting ranges of cells in Excel.  This…

Allow Only Certain People to Edit Specific Cells in Excel

Tutorial:
How to allow only certain people to edit certain cells or ranges in Excel.

This is a sec…

Add a Drop Down Menu to a Cell in Excel — Data Validation Macro

Macro: Add a drop down menu or list to a cell in Excel with this free Excel macro. This is a grea…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Здравствуйте. Помогите, пожалуйста, решить проблему.

Создаю шаблон для ведения отчетности по одному проекту. Ситуация такая: имеется строка, в ячейки которой заносится та или иная информация. В некоторой части строки есть ячейка, которой по формуле после определенных условий заполнения остальных ячеек присваивается значение «Обработано». Появилась необходимость защищать от случайного изменения все ячейки строк, содержащих «обработанную» ячейку. Я так понял, что иного способа, кроме как сделать это защитой листа с определенной настройкой параметров защиты ячеек — нет.

Иными словами, идея какая: изначально со всех ячеек снята защита, но защита всего листа (без пароля) включена. Когда на одной из строк ключевая ячейка получает значение «Обработано», должен сработать макрос, который:

1. Снимает защиту листа
2. Ставит галочку «защищаемая ячейка» на всех ячейках этой строки
3. Включает защиту листа

Причем, очевидно, на втором пункте также необходимо сохранять статус защищаемой ячейки на всех ранее защищенных ячейках.

Мои познания в макросах почти нулевые, поэтому прошу вас о помощи: напишите, пожалуйста, соответствующий макрос. Я прочитал, что можно делать так, чтобы макрос срабатывал при заполнении определенной ячейки — в идеале хотелось бы сделать именно так. Ячейка получает значение «Обработано», а затем вся эта строка становится защищенной.

Заранее огромное спасибо.

Содержание

  1. Защита ячеек в Excel от изменения и редактирования значений или форматов
  2. Сдвигаем границу строки
  3. Одновременное скрытие нескольких строк
  4. Используем контекстное меню
  5. Применяем кнопки на ленте
  6. Группировка
  7. Панель инструментов
  8. Фильтр
  9. С помощью возможностей «Условное форматирование»
  10. Настройка правильных параметров в «Настройках» программы
  11. При помощи настроек цвета и параметров печати
  12. Скрытие помеченных строк/столбцов макросом
  13. Скрытие строк/столбцов с заданным цветом
  14. Выборочная защита диапазонов для разных пользователей
  15. Защита листов книги
  16. Блокировка через рецензирование
  17. Заморозка ячейки
  18. Закрепление области
  19. Фиксация формулы в Excel по вертикали
  20. Полезные советы
  21. Как скрыть формулу заблокированной ячейки
  22. Снимаем защиту
  23. Заключение

Защита ячеек в Excel от изменения и редактирования значений или форматов

Сдвигаем границу строки

  1. На вертикальной координатной панели наводим указатель мыши на нижнюю границу строки, которую планируем скрыть. Когда появится знак в виде плюсика со стрелками вверх и вниз, зажав левую кнопку мыши тянем его вверх, соединив с верхней границей строки.
  2. Таким нехитрым способом нам удалось скрыть выбранную строку.

Одновременное скрытие нескольких строк

Этот способ базируется на том, который мы рассмотрели выше, и также предполагает сдвиг границы, но не отдельной строки, а выделенного диапазона.

  1. На вертикальной координатной панели любым удобным способом (например, с помощью зажатой левой кнопки мыши) выделяем строки, которые планируем спрятать. Если требуется выделить разрозненные строки, выполняем выделение левой кнопкой мыши (щелчком или зажав для идущих подряд строк), удерживая клавишу Ctrl на клавиатуре.
  2. Аналогично скрытию одной строки (действия описали в методе выше), сдвигаем границу любой строки из выделенного диапазона. При этом неважно, тянем ли мы указатель к верхней границе именно этой строки или к границе самой верхней строки отмеченной области.
  3. В итоге мы скрыли сразу весь выделенный диапазон.

Используем контекстное меню

Наверное, это самый популярный способ среди пользователей, который предполагает использование контекстного меню.

  1. На вертикальной панели координат выделяем нужные строки (как это сделать, описано выше).
  2. Щелкаем правой кнопкой мыши по любому месту в выделенном диапазоне на координатной панели, в открывшемся списке выбираем команду “Скрыть”.
  3. Весь выделенный диапазон строк будет спрятан.

Применяем кнопки на ленте

На ленте программы также, предусмотрены кнопки для скрытия строк.

  1. Для начала нужно выделить строки, которые мы планируем спрятать. Сделать это можно по-разному:
  2. Находясь во вкладке “Главная” в группе инструментов “Ячейки” щелкаем по кнопке “Формат”. В открывшемся перечне выбираем команду “Скрыть или отобразить”, затем – “Скрыть строки”.
  3. Получаем скрытый диапазон строк.

Группировка

Чтобы скрыть ячейки с плюсом, необходимо воспользоваться специальным инструментом Excel – группировка. Он расположен во вкладке Данные на Панели инструментов в блоке Структура.

Порядок действий следующий:

  1. Выделяете необходимую область

  1. Переходите во вкладку Данные и нажимаете кнопку Группировать.

  1. Сбоку от выделенного участка появилась специальная скобочка и знак минус. Нажав по нему, строки скроются, а сигналом сгруппированных ячеек будет небольшой плюсик.

  1. Чтобы посмотреть скрытую область, нажимаете на плюс и таблица примет первоначальный вид.

На заметку! С помощью этой функции можно делать сложную группировку с несколькими вложениями, каждое из которых будет зависеть от вышестоящей группы.

Для того, чтобы убрать группировку, необходимо в той же вкладке нажать кнопку Разгруппировать, предварительно выделив сгруппированный участок.

Панель инструментов

Аналогичную операцию можно сделать через главную вкладку. Для этого ищете кнопку Формат и из выпадающего списка выбираете строку Скрыть или отобразить. Далее выбираете нужное действие.

Чтобы отобразить ячейки обратно, выбираете в том же меню функцию Отобразить строки или столбцы, в зависимости от того, что скрывалось.

Фильтр

Фильтрация данных еще один способ сокрытия информации. Ставите курсор в нужную ячейку, переходите к блоку Редактирование на Главной вкладке, нажимаете кнопку Сортировка и фильтр, потом из выпадающего списка выбираете Фильтр. Если все сделано правильно, в ячейке появится стрелочка вниз.

Нажав на этот флажок, убираете галочки с нужных позиций, затем подтверждаете действие кнопкой ОК.

Таблица приняла другой вид, а о применении фильтрации свидетельствует синий цвет номеров строк и небольшая воронка вместо стрелочки.

Отличительной особенностью этого метода является то, что полученную информацию можно скопировать без скрытых ячеек.

С помощью возможностей «Условное форматирование»

Для того чтобы узнать, как скрыть значение ячеек также можно использовать возможности «Условного форматирования» . Для этого нам нужно выделить диапазон ячеек, где мы будем скрывать значения с нулевым результатом. Выбираем вкладку «Главная», блок «Стили», нажимаем иконку «Условное форматирование», в списке который раскрылся, выбираете «Правила выделение ячеек – Равно…». Следующим этапом станет указать какой именно формат вам будет надо, в поле «Форматировать ячейки, которые РАВНЫ:» устанавливаете значение 0. В открывшемся списке выбираете «Пользовательский формат…»,

в диалоговом окне «Формат ячеек» переходим на вкладку «Шрифт», потом в списке меню «Цвет» вы изменяете «Цвет темы: Авто» на «Цвет темы: Белый, Фон 1» и нажимаете «ОК» и снова «ОК».

После ваших манипуляций, если значение в указанном диапазоне будет равно 0, программа закрасит его белый цвет, и оно сольется с фоном листа, проще говоря станет невидимым.

В случае, когда вам будет нужно первоначальное форматирование, вы просто удаляете это правило. А именно: переходите на вкладку «Главная», выбираете «Стили», кликаете на иконку «Условное форматирование», нажимаете «Удалить правило» и «Удалить правила из выделенных ячеек».

Настройка правильных параметров в «Настройках» программы

Скрыть в Excel значение ячеек можно даже проще, всего на всего установить нужный вам параметр в настройках листа Excel.

Для этого вы заходите в меню «Файл» — пункт «Параметры» — пункт «Дополнительно» — раздел показать параметры для следующего листа. Здесь в параметре «Показывать нули в ячейках, которые содержат нулевые значения» вы убираете галочку. Вуаля! Числа со значением 0 не показываются на том листе, для которого был установлен параметр.

При помощи настроек цвета и параметров печати

Самый простой и банальный способ, в котором вы просто берете диапазон и закрашиваете его белым цветом и текст делаете также белым. Типа в темной комнате не видно чёрной кошки, так и в нашем случае, белое на белом незаметно, я бы даже сказал невидимое, а оно есть.

Минус способа в том при печати ваш текст станет видным, поскольку в настройках принтера стоит «Черно-белая печать», и никакие манёвры и извращения с аналогичными цветами ячейки и шрифта не проходят.

Скрытие помеченных строк/столбцов макросом

Этот способ, пожалуй, можно назвать самым универсальным. Добавим пустую строку и пустой столбец в начало нашего листа и отметим любым значком те строки и столбцы, которые мы хотим скрывать:

Теперь откроем редактор Visual Basic (ALT+F11), вставим в нашу книгу новый пустой модуль (меню Insert – Module) и скопируем туда текст двух простых макросов:

Как легко догадаться, макрос Hide скрывает, а макрос Show – отображает обратно помеченные строки и столбцы. При желании, макросам можно назначить горячие клавиши (Alt+F8 и кнопка Параметры), либо создать прямо на листе кнопки для их запуска с вкладки Разработчик – Вставить – Кнопка (Developer – Insert – Button) .

Скрытие строк/столбцов с заданным цветом

Допустим, что в приведенном выше примере мы, наоборот, хотим скрыть итоги, т.е. фиолетовые и черные строки и желтые и зеленые столбцы. Тогда наш предыдущий макрос придется немного видоизменить, добавив вместо проверки на наличие “х” проверку на совпадение цвета заливки с произвольно выбранными ячейками-образцами:

Однако надо не забывать про один нюанс: этот макрос работает только в том случае, если ячейки исходной таблицы заливались цветом вручную, а не с помощью условного форматирования (это ограничение свойства Interior.Color). Так, например, если вы с помощью условного форматирования автоматически подсветили в своей таблице все сделки, где количество меньше 10:

…и хотите их скрывать одним движением, то предыдущий макрос придется “допилить”. Если у вас Excel 2010-2013, то можно выкрутиться, используя вместо свойства Interior свойство DisplayFormat.Interior, которое выдает цвет ячейки вне зависимости от способа, которым он был задан. Макрос для скрытия синих строк тогда может выглядеть так:

Ячейка G2 берется в качестве образца для сравнения цвета. К сожалению, свойство DisplayFormat появилось в Excel только начиная с 2010 версии, поэтому если у вас Excel 2007 или старше, то придется придумывать другие способы.

Выборочная защита диапазонов для разных пользователей

Если предполагается, что с файлом будут работать несколько пользователей, причем каждый из них должен иметь доступ в свою область листа, то можно установить защиту листа с разными паролями на разные диапазоны ячеек.

Чтобы сделать это выберите на вкладке Рецензирование (Review) кнопку Разрешить изменение диапазонов (Allow users edit ranges) . В версии Excel 2003 и старше для этого есть команда в меню Сервис – Защита – Разрешить изменение диапазонов (Tools – Protection – Allow users to change ranges) :

В появившемся окне необходимо нажать кнопку Создать (New) и ввести имя диапазона, адреса ячеек, входящих в этот диапазон и пароль для доступа к этому диапазону:

Повторите эти действия для каждого из диапазонов разных пользователей, пока все они не окажутся в списке. Теперь можно нажать кнопку Защитить лист (см. предыдущий пункт) и включить защиту всего листа.

Теперь при попытке доступа к любому из защищенных диапазонов из списка, Excel будет требовать пароль именно для этого диапазона, т.е. каждый пользователь будет работать “в своем огороде”.

Защита листов книги

Если необходимо защититься от:

  • удаления, переименования, перемещения листов в книге
  • изменения закрепленных областей (“шапки” и т.п.)
  • нежелательных изменений структуры (сворачивание строк/столбцов при помощи кнопок группировки “плюс/минус”)
  • возможности сворачивать/перемещать/изменять размеры окна книги внутри окна Excel

то вам необходима защита всех листов книги, с помощью кнопки Защитить книгу (Protect Workbook) на вкладке Рецензирование (Reveiw) или – в старых версиях Excel – через меню Сервис – Защита – Защитить книгу (Tools – Protection – Protect workbook) :

Блокировка через рецензирование

Есть ещё метод поставить блок на нужные ячейки программы Excel. Оба метода очень похожи, различия только в разных меню, где мы будем блокировать документ.

  • Проделываем то же, что мы делали в пунктах 1 – 3, то есть убираем и ставим галочку над «Защищаемой ячейкой».
  • Теперь, перейдем в верхнее меню «Рецензирование». Примерно в середине этого меню мы видим команду «Защитить лист». Нажмём на эту кнопку.
  • Затем, мы видим вновь окошко «Защита листа», как в верхнем методе. Далее, поступаем также, как до этого по аналогии.

Заморозка ячейки

Предыдущий способ того, как заморозить ячейку в Excel, чаще всего полезен в случае работы с формулами. Сейчас же мы рассмотрим ситуацию, когда необходимо закрепить строки или столбцы таблицы, чтобы их было видно даже при смещении листа. Всего можно выделить три опции:

  1. Закрепление верхней строки.
  2. Заморозка левого крайнего столбца.
  3. Закрепление области, находящейся сверху и слева от выделенной ячейки.

Закрепление области

Если вы хотите оставить в поле зрения ряд строк и столбцов, тогда делайте следующее:

  1. Выделите ячейку, строки выше и столбцы левее которой необходимо заморозить.
  2. Перейдите во вкладку «Вид».
  3. На ленте инструментов кликните по «Закрепить области».
  4. В списке выберите опцию «Закрепить области».

Фиксация формулы в Excel по вертикали

Частичная фиксация по вертикали (пример $A1), это закрепления возможно только для столбцов , вероятность сдвига формулы частично сохраняется, но только по горизонтали (в строке). Как видно со скриншота или скачанного вами файла с примером.

Полезные советы

  • Ячейки, которые необходимо заблокировать, находятся на удалении друг от друга? Excel 2016 и версии до 2007 включительно позволяют выделять их не вручную, а автоматически.
    Для этого во вкладке «Главная» в одном из самых последних полей под названием «Редактирование» нажмите кнопку «Найти и выделить». Выберите пункт «Выделение группы ячеек…»

И установите нужные настройки:

Как скрыть формулу заблокированной ячейки

Если ячейки, которые вы защитили от редактирования содержат формулы, вы также можете их скрыть.

Для этого проделайте следующие шаги:

  • Выделите ячейки, которые вы хотите защитить и скрыть формулы;
  • Перейдем на вкладку “ Главная ” на панели инструментов и в подразделе “ Выравнивание ” кликнем по иконке в правом нижнем углу, как мы делали это раннее;
  • Во всплывающем окне, на вкладке “ Защита ” поставим галочки в пунктах “ Защищаемая ячейка ” и “ Скрыть формулы “:

Снимаем защиту

Если мы попытаемся внести изменения в любую из защищенных ячеек, программа выдаст соответствующе информационное сообщение.

Для снятие блокировки необходимо ввести пароль:

  1. Во вкладке “Рецензирование” в группе инструментов “Защита” жмем кнопку “Снять защиту с листа”.
  2. Откроется небольшое окошко с одним полем, в котором следует ввести пароль, указанный при блокировке ячеек. Нажав кнопку OK мы снимем защиту.

Заключение

Несмотря на то, что в Excel нет специальной функции, предназначенной для защиты определенных ячеек от редактирования, сделать это можно через включение защиты всего листа, предварительно установив требуемые параметры для выбранных ячеек.

Источник

0 / 0 / 0

Регистрация: 11.08.2009

Сообщений: 3

1

06.07.2010, 14:46. Показов 10741. Ответов 19


Студворк — интернет-сервис помощи студентам

Есть документ Excel с разного рода информацией.
Пусть есть первый столбец это наименование фирм.
остальные это цифры и текст.
Требуется сделать защиту на столбец с наименованием, чтобы пользователь мог только заносить новые наименования и не мог исправлять или удалять старые.
И еще требуется выводить в отдельный столбец значения которые изменялись в документе.



0



Kimmy

06.07.2010, 15:13

2

В свойствах ячеек выставляешь защищяемая и делаешь защиту на лист.

0 / 0 / 0

Регистрация: 11.08.2009

Сообщений: 3

06.07.2010, 15:29

 [ТС]

3

при таком варианте я не могу совсем вставлять новые строки или всегда должен буду при вводе нового имени ставить в свойствах защищ ячейка.так что это не ответ.
Смысл в том чтоб определенный пользователь не смог удалять записи в первом столбце и не мог их изменять а мог добавлять ТОЛЬКО новые.
и как быть с отображением измененных строк(т.е. я так понимаю у меня должна строится допустим на втором листе аналогичная таблица только со старыми значениями)



0



Kimmy

06.07.2010, 16:37

4

Так вроде номальній вариант. Если хочешь извратиться повесь обработчики на нажатие соотв кнопок

0 / 0 / 0

Регистрация: 11.08.2009

Сообщений: 3

06.07.2010, 16:46

 [ТС]

5

да как же он нормальный если мне придется самому постоянно при вводе нового значения в первый столбец снимать и ставить заново защиту???

Юзер сам должен вносить новые значения только удалять старые не мог чтобы…



0



maga2

0 / 0 / 0

Регистрация: 12.07.2010

Сообщений: 128

15.07.2010, 04:53

6

1) Ставишь защиту листа, скажем пароль — 111 и прописываешь макрос в нужный лист проекта (не модуль):

Visual Basic
1
2
3
4
5
6
7
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Cells(ActiveCell.Row, ActiveCell.Column).Value = '' Then
        ActiveSheet.Unprotect Password:='111'
    Else
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End If
End Sub

при этом макрос реагирует на юбые перемещения по заданному лису, в том числе и мышкой и снимает защиту, если активная ячейка пуста. Далее можно включить в макрос, при необходимости проверку принадлежности активной ячейки какому-либо столбцу, чтобы не снимать защиту в ненужных столбцах. Еще можно поэспериментировать и с защищаемой областью. Ну т.д. Надеюсь дальше проблем не будет.

2) Со второй часть вопроса может помочь следующий макрос:

Visual Basic
1
2
3
Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub

в том же месте. Сам не пробовал.

Интересно узнать продолжение…

М. Таумурзаев



0



Chert

09.08.2010, 09:52

7

Как нужно изменить этот макрос чтобы он снимал защиту для всех ячеек, кроме ячеек принадлежащих к конкретному столбцу (например С)?

Chert

12.08.2010, 14:24

8

Сам вопрос задал сам и отвечаю:

Visual Basic
1
2
3
4
5
6
7
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveCell.Column = 11 Then
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
Else
ActiveSheet.Unprotect Password:='111'
End If
End Sub

False для того чтобы автофильтр работал.

0 / 0 / 0

Регистрация: 23.05.2010

Сообщений: 57

24.08.2010, 10:16

9

А как тогда установить защиту на несколько ячеек, скажем на А1, В2, С7?



0



0 / 0 / 0

Регистрация: 23.05.2010

Сообщений: 57

24.08.2010, 10:19

10

т.е. на определённые ячейки с активного листа



0



Chert

24.08.2010, 14:31

11

К примеру следующая модификация защищает ячейку А1

Visual Basic
1
2
3
4
5
6
7
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveCell.Column = 1 And ActiveCell.Row = 1 Then
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
Else
ActiveSheet.Unprotect Password:='111'
End If
End Sub

Hitry

0 / 0 / 0

Регистрация: 23.05.2010

Сообщений: 57

25.08.2010, 07:15

12

Это тоже понятно, т.е. как защитить одну ячейку — трудности не вызывает. Можно и вот так:

Visual Basic
1
2
3
4
5
6
7
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Cells(ActiveCell.Row, ActiveCell.Column) <> Range('C9') Then
 ActiveSheet.Unprotect Password:='111'
  Else
   ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
 End If
End Sub

А как несколько ячеек. Скажем С9, С12, С15 и т.д. Весь день колупался. Ничего путного не вышло…



0



0 / 0 / 0

Регистрация: 08.08.2010

Сообщений: 7

26.08.2010, 13:36

13

Вам нужно именно защитить строго определенную последовательность ячеек? как вы описали? С9, С12, С15…?



0



Roman901

0 / 0 / 0

Регистрация: 08.08.2010

Сообщений: 7

26.08.2010, 13:43

14

Если такой диапазон, то такой код вполне работоспособен…

Visual Basic
1
2
3
4
5
6
7
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveCell.Column = 3 And ActiveCell.Row >= 9 And ActiveCell.Row Mod 3 = 0 Then
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
Else
ActiveSheet.Unprotect Password:='111'
End If
End Sub



0



0 / 0 / 0

Регистрация: 23.05.2010

Сообщений: 57

29.08.2010, 07:13

15

Нет, не обязательно такой диапазон. Защищаемые ячейки на листе могут быть различны — A1, D8, AC5. Что то типа этого…



0



SlavaRus

1121 / 229 / 36

Регистрация: 15.03.2010

Сообщений: 698

29.08.2010, 09:14

16

Попробуй нацарапать так:

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ProtectRange As Range
Set ProtectRange = [a1:b3,c9]' Твои ячейки
If Not Intersect(Target, ProtectRange) Is Nothing Then
 ...
else
...
end if
End Sub



0



0 / 0 / 0

Регистрация: 23.05.2010

Сообщений: 57

29.08.2010, 12:21

17

Всем спасибо. Всё работает )



0



santtic

0 / 0 / 0

Регистрация: 24.01.2020

Сообщений: 195

02.02.2022, 15:29

18

Доброго времени, подскажите в чем может быть проблема.
Хочу заблокировать определенные столбцы
Использую даный макрос, все хорошо работает если я работаю например со значениями.

Visual Basic
1
2
3
4
5
If ActiveCell.Column = 11 Then
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
Else
ActiveSheet.Unprotect Password:='111'
End If

Но только я начинаю работать с формулами, то макрос срабатывает и защищает, но тогда макрос с моими формулами не до конца отрабатывает что ли, а именно вместо значение Value, записывает саму формулу.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
For Each Cell In Target
If Not Intersect(Cell, Range("E9:E200")) Is Nothing Then
            With Cell.Offset(0, -1)
             .FormulaR1C1 = _
        "=IF(RC[1]>0,VLOOKUP(RC[1],'Лист1'!R4C1:R23C6,3,FALSE),"""")"
        .Copy
       Cell.Offset(0, -1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
            End With
       End If

Где я не верно прописал?

Добавлено через 23 минуты
вопрос снят.
Нашел причину. Это се Select, он себя так ведет. Макросу указал селект и тут же макрос блокировки сработал. Вот и остается формула а не значение.



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

02.02.2022, 15:38

19

Если в событийной процедуре Worksheet_Change листа менять значение или формулу на листе, копировать и вставлять — то происходит выход из этой процедуры на новое событие изменения и вход в следующую процедуру рекурсивного дерева.
Чтобы этого не происходило перед изменением

Visual Basic
1
Application.EnableEvents = False

после всех изменений

Visual Basic
1
 Application.EnableEvents = True

Если процедура Worksheet_SelectionChange и нужно значение, а не формула, то лучше убрать блок:

Visual Basic
1
2
3
       Cell.Offset(0, -1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

будет короче:

Visual Basic
1
2
3
4
5
       
           With Cell.Offset(0, -1)
             .FormulaR1C1 =   "=IF(RC[1]>0,VLOOKUP(RC[1],'Лист1'!R4C1:R23C6,3,FALSE),"""")"
             .Value=.Value
            End With

— так как нет Select , нет события, можно не использовать Application.EnableEvents



1



santtic

0 / 0 / 0

Регистрация: 24.01.2020

Сообщений: 195

02.02.2022, 16:00

20

Цитата
Сообщение от KoGG
Посмотреть сообщение

будет короче:

Оу, круто, спасибо! Не знал что можно так

F#
1
.Value=.Value

Цитата
Сообщение от KoGG
Посмотреть сообщение

Если процедура Worksheet_SelectionChange и нужно значение, а не формула, то лучше убрать блок:

Это еле дошло….начал пошагово проводить и дошло.
Вам спасибо за совет и пояснение!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

02.02.2022, 16:00

Помогаю со студенческими работами здесь

Защита таблицы Excel
Здравствуйте.

Появилась у меня такая задачка: есть таблица на одном из компьютеров, и я должен…

Защита листа Excel
Помогите кто знает: необходимо из Delphi запретить форматирование ячеек Excel. В самом Excel-е это…

Excel защита ячеек
День добрый уважаемые!!!

ПОМОГИТЕ ПОЖАЛУЙСТА с проблемкой.

написал прогу БД на Visual…

Защита ячеек в excel
Здравствуйте, ув.Форумчане

У меня возник вопрос с защитой ячеек в excel.
Возможно ли защитить…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20

Sub макрос()

        ‘1. Если макросу надо снять защиту, чтобы сделать действия.
    If ActiveSheet.ProtectionMode = False Then
        ‘1) Снятие защиты листа.
        ActiveSheet.Unprotect
        ‘2) Установка галочки: диалог «Формат ячеек» — вкладка «Защита» — галочка «Защищаемая ячейка».
        Selection.Locked = True
        ‘3) Установка защиты листа.
        protect ActiveSheet, «», True
    ‘ Если макросу не надо снимать защиту, чтобы сделать действия.
    Else
        ‘ Установка галочки: диалог «Формат ячеек» — вкладка «Защита» — галочка «Защищаемая ячейка».
        Selection.Locked = True
    End If

End Sub

Private Sub protect(sh As Worksheet, pass As String, uif As Boolean)
    sh.protect Password:=pass, UserInterfaceOnly:=uif, _
        DrawingObjects:=sh.ProtectDrawingObjects, _
        Scenarios:=sh.ProtectScenarios, _
        AllowFormattingCells:=sh.Protection.AllowFormattingCells, _
        AllowFormattingColumns:=sh.Protection.AllowFormattingColumns, _
        AllowFormattingRows:=sh.Protection.AllowFormattingRows, _
        AllowInsertingColumns:=sh.Protection.AllowInsertingColumns, _
        AllowInsertingRows:=sh.Protection.AllowInsertingRows, _
        AllowInsertingHyperlinks:=sh.Protection.AllowInsertingHyperlinks, _
        AllowDeletingColumns:=sh.Protection.AllowDeletingColumns, _
        AllowDeletingRows:=sh.Protection.AllowDeletingRows, _
        AllowSorting:=sh.Protection.AllowSorting, _
        AllowFiltering:=sh.Protection.AllowFiltering, _
        AllowUsingPivotTables:=sh.Protection.AllowUsingPivotTables
End Sub

[свернуть]

Понравилась статья? Поделить с друзьями:
  • Excel макрос заполнить ячейку
  • Excel макрос заполнить строку
  • Excel макрос заполнить столбец
  • Excel макрос заполнение ячеек с условием
  • Excel макрос заполнение данных