Vba excel защитить ячейку от изменений в excel

I want to stop others from editing the cell contents in my excel sheet using VBA. Is it possible to do this?

armstrhb's user avatar

armstrhb

4,0243 gold badges20 silver badges28 bronze badges

asked Jun 14, 2010 at 13:05

raam's user avatar

1

You can first choose which cells you don’t want to be protected (to be user-editable) by setting the Locked status of them to False:

Worksheets("Sheet1").Range("B2:C3").Locked = False

Then, you can protect the sheet, and all the other cells will be protected.
The code to do this, and still allow your VBA code to modify the cells is:

Worksheets("Sheet1").Protect UserInterfaceOnly:=True

or

Call Worksheets("Sheet1").Protect(UserInterfaceOnly:=True)

answered Jun 14, 2010 at 17:31

Lance Roberts's user avatar

Lance RobertsLance Roberts

22.2k32 gold badges112 silver badges129 bronze badges

5

Try using the Worksheet.Protect method, like so:

Sub ProtectActiveSheet()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    ws.Protect DrawingObjects:=True, Contents:=True, _
        Scenarios:=True, Password="SamplePassword"
End Sub

You should, however, be concerned about including the password in your VBA code. You don’t necessarily need a password if you’re only trying to put up a simple barrier that keeps a user from making small mistakes like deleting formulas, etc.

Also, if you want to see how to do certain things in VBA in Excel, try recording a Macro and looking at the code it generates. That’s a good way to get started in VBA.

answered Jun 14, 2010 at 13:54

Ben McCormack's user avatar

Ben McCormackBen McCormack

31.8k46 gold badges145 silver badges221 bronze badges

Let’s say for example in one case, if you want to locked cells from range A1 to I50 then below is the code:

Worksheets("Enter your sheet name").Range("A1:I50").Locked = True
ActiveSheet.Protect Password:="Enter your Password"

In another case if you already have a protected sheet then follow below code:

ActiveSheet.Unprotect Password:="Enter your Password"
Worksheets("Enter your sheet name").Range("A1:I50").Locked = True
ActiveSheet.Protect Password:="Enter your Password"

answered Sep 18, 2013 at 9:40

Milan Sheth's user avatar

Milan ShethMilan Sheth

84412 silver badges10 bronze badges

You can also do it on the worksheet level captured in the worksheet’s change event. If that suites your needs better. Allows for dynamic locking based on values, criteria, ect…

Private Sub Worksheet_Change(ByVal Target As Range)

    'set your criteria here
    If Target.Column = 1 Then

        'must disable events if you change the sheet as it will
        'continually trigger the change event
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True

        MsgBox "You cannot do that!"
    End If
End Sub

answered Jun 15, 2010 at 15:28

Fink's user avatar

FinkFink

3,31619 silver badges26 bronze badges

Sub LockCells()

Range("A1:A1").Select

Selection.Locked = True

Selection.FormulaHidden = False

ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= False, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True

End Sub

answered Jun 14, 2010 at 21:41

krusaint's user avatar

 

Marshal

Пользователь

Сообщений: 83
Регистрация: 27.12.2012

#1

18.10.2016 02:18:33

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

Но данная защита снимается нажатием правой кнопкой на листе «Снять защиту листа».
Что можно сделать дабы исключить такую возможность вообще или снятие через пароль, но на VBA.

Всем спасибо

Код
Private Sub Workbook_Open()
   Cells.Locked = False '
    Range("F5:AH5").Locked = True
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#2

18.10.2016 02:22:31

Код
Protect("abracadabra")
Unprotect("abracadabra")
 

Marshal

Пользователь

Сообщений: 83
Регистрация: 27.12.2012

Спасибо за ответ. с этим я и воююю
Не могу прикрутить

 

k61

Пользователь

Сообщений: 2441
Регистрация: 21.12.2012

#4

18.10.2016 02:51:08

Прикрутка:

Код
....
ActiveSheet.Protect Password:="abracadabra", DrawingObjects:.......
....
 

Marshal

Пользователь

Сообщений: 83
Регистрация: 27.12.2012

#5

18.10.2016 04:25:06

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

Код
Private Sub Workbook_Open()
 Sheets("Лист1").Select
ActiveSheet.Unprotect Password:="321"
    Range("B8:AH8").Locked = True
    ActiveSheet.Protect Password:="321"
End Sub

You can modify a sheet via code by taking these actions

  • Unprotect
  • Modify
  • Protect

In code this would be:

Sub UnProtect_Modify_Protect()

  ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
'Unprotect

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

  ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
'Protect

End Sub

The weakness of this method is that if the code is interrupted and error handling does not capture it, the worksheet could be left in an unprotected state.

The code could be improved by taking these actions

  • Re-protect
  • Modify

The code to do this would be:

Sub Re-Protect_Modify()

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
 UserInterfaceOnly:=True
'Protect, even if already protected

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

End Sub

This code renews the protection on the worksheet, but with the ‘UserInterfaceOnly’ set to true. This allows VBA code to modify the worksheet, while keeping the worksheet protected from user input via the UI, even if execution is interrupted.

This setting is lost when the workbook is closed and re-opened. The worksheet protection is still maintained.

So the ‘Re-protection’ code needs to be included at the start of any procedure that attempts to modify the worksheet or can just be run once when the workbook is opened.

Предположим, у вас есть рабочий лист, и только определенный диапазон пустых ячеек требует ввода данных, и после завершения ввода данных вам нужно, чтобы ячейки были автоматически заблокированы, чтобы предотвратить повторные изменения. Как вы можете этого добиться? Эта статья может вам помочь.

Блокировать или защищать ячейки после ввода данных или ввода с помощью кода VBA


Блокировать или защищать ячейки после ввода данных или ввода с помощью кода VBA

Например, определенный диапазон пустых ячеек — A1: F8. Чтобы заблокировать эти ячейки после ввода данных в Excel, сделайте следующее.

1. Сначала разблокируйте этот диапазон, выберите ячейки и щелкните правой кнопкой мыши, затем выберите Формат ячеек в контекстном меню и в Формат ячеек диалоговое окно, сняв флажок Заблокированный поле под защиту вкладка и, наконец, щелкнув OK кнопка. Смотрите скриншот:

2. Нажмите Обзор > Защитить лист. И укажите пароль для защиты этого рабочего листа.

3. Щелкните правой кнопкой мыши вкладку листа и выберите Просмотреть код из контекстного меню. Затем скопируйте и вставьте приведенный ниже код VBA в окно кода. Смотрите скриншот:

Код VBA: блокировка или защита ячеек после ввода или ввода данных

Dim mRg As Range
Dim mStr As String

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Range("A1:F8"), Target) Is Nothing Then
    Set mRg = Target.Item(1)
    mStr = mRg.Value
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xRg As Range
    On Error Resume Next
    Set xRg = Intersect(Range("A1:F8"), Target)
    If xRg Is Nothing Then Exit Sub
    Target.Worksheet.Unprotect Password:="123"
    If xRg.Value <> mStr Then xRg.Locked = True
    Target.Worksheet.Protect Password:="123" 
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Range("A1:F8"), Target) Is Nothing Then
    Set mRg = Target.Item(1)
     mStr = mRg.Value
End If
End Sub

Внимание: В коде «A1: F8» — это диапазон, который вам нужен для ввода данных; и «123» — пароль этого защищенного рабочего листа. Пожалуйста, измените их по своему усмотрению.

4. Нажмите другой + Q клавиши одновременно, чтобы закрыть Microsoft Visual Basic для приложений окно.

После завершения ввода данных в ячейки диапазона A1: F8 они будут заблокированы автоматически. И вы получите диалоговое окно с запросом, если попытаетесь изменить содержимое любой ячейки этого диапазона. Смотрите скриншот:


Статьи по теме:

  • Как заблокировать сразу все ссылки на ячейки в формулах в Excel?
  • Как заблокировать или разблокировать ячейки на основе значений в другой ячейке в Excel?
  • Как заблокировать изображение / изображение в ячейке или внутри нее в Excel?

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (74)


Номинальный 5 из 5


·


рейтинги 1

защитить ячейки чтобы макрос работал

ttv

Дата: Среда, 13.12.2017, 11:59 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Здравствуйте, форумчане!
Подскажите — как защитить ячейки от изменения или удаления так, чтобы макрос работал?
Один макрос — вставляет строку в нужном диапазоне и копирует туда формулы со строки выше. Пользователь может заполнять ячейки залитые серым (B14:D37, N14:N37 и еще немножко в шапке листа).
Второй макрос — удаляет последнюю заполненную строку.
Если делать через стандартную защиту ячеек листа — макросы перестают работать. Если делать через проверку данных — пользователь не может изменить формулы, но может их удалить.
Как защитить формулы от юзеров чтобы и макросы остались рабочими?
Или как разрешить макросу копировать защищенные ячейки?

К сообщению приложен файл:

2752666.xlsm
(27.3 Kb)

 

Ответить

китин

Дата: Среда, 13.12.2017, 12:30 |
Сообщение № 2

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

почитайте ТУТ


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

ttv

Дата: Среда, 10.01.2018, 11:59 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Почитала и сделала так:
[vba]

Код

Sub Protect_for_User_Non_for_VBA()
    ActiveSheet.Protect Password:=»1111″, UserInterfaceOnly:=True
End Sub

[/vba]

Теперь вылезла такая проблема:
пользователю разрешено вставлять данные в определенные ячейки, все остальные заблокированы, пользователь даже не может их выделить. Но если пользователь вставляет свои данные способом «копировать-вставить» — то те ячейки, которые он только что заполнил сразу же становятся заблокированными. А если пользователь ошибся — он не сможет изменить то, что вставил только что. Заблокированы листы с применением пароля и пароль пользователь знать не будет.
Как сделать так чтобы при любых способах вставки данных пользователя:
1) разрешенные к редактированию пользователем ячейки не блокировались;
2) сохранялось форматирование (в т.ч. УФ) в моем файле, а не то что пользователь откуда-то скопировал.

 

Ответить

Mikael

Дата: Среда, 10.01.2018, 15:13 |
Сообщение № 4

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010

ttv, попробуйте так:
Это обработчик события изменения ячейки, код выполняется только когда включен режим копирования или вырезания.
Код нужно добавить в модуль листа.
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)

        With Application
        If .CutCopyMode = 0 Then Exit Sub
        .EnableEvents = 0
        .Undo
        Target.PasteSpecial Paste:=xlPasteValues
        .EnableEvents = 1
    End With    ‘Application

    End Sub

[/vba]

 

Ответить

ttv

Дата: Четверг, 11.01.2018, 08:13 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Получается, но только если защита на лист стоит без пароля. А когда защита с паролем — не работает. Что нужно добавить в макрос чтобы заработал и на запароленой защите листа?
На другие макросы я пишу самой первой строчкой кода вот такое
[vba]

Код

ActiveSheet.Protect Password:=»1111″, UserInterfaceOnly:=True

[/vba]
С этим макросом так пробовала — не работает все равно.

 

Ответить

Mikael

Дата: Четверг, 11.01.2018, 12:04 |
Сообщение № 6

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010

ttv, сложно так сказать, где проблема. Пришлите текущий файл.
У меня все работает и под защитой с паролем, Вы сделали серые ячейки не защищаемыми? ПКМ -> формат ячеек -> защита -> снять галку «защищаемая ячейка»

На другие макросы я пишу самой первой строчкой кода вот такое

Этот код нужно поместить в событие Workbook_Open в модуль книги:
[vba]

Код

Private Sub Workbook_Open()
    Sheets(«Данные»).Protect Password:=»1111″, UserInterfaceOnly:=True
End Sub

[/vba]
Из остальных макросов удалить.

 

Ответить

ttv

Дата: Пятница, 12.01.2018, 10:07 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Вы сделали серые ячейки не защищаемыми?

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

Этот код нужно поместить в событие Workbook_Open в модуль книги:

,

Из остальных макросов удалить

— — исправила, спасибо!

сложно так сказать, где проблема. Пришлите текущий файл

файл прикладываю.

К сообщению приложен файл:

5326071.xlsm
(28.2 Kb)

 

Ответить

Mikael

Дата: Пятница, 12.01.2018, 10:35 |
Сообщение № 8

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010

ttv, попробуйте сейчас. Я перенес обработчик события в модуль листа1 (Данные)
см. 4 пост

Код нужно добавить в модуль листа.

К сообщению приложен файл:

9028992.xlsm
(29.9 Kb)

 

Ответить

ttv

Дата: Понедельник, 15.01.2018, 08:41 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

попробовала, у меня также — если вставлять тыкая мышью в окно буфера обмена — то вставляется заблокированным и с сохранением исходного форматирования (желтая заливка и т.д.). %)

А если вставлять просто ПКМ в таблицу — то все нормально.

 

Ответить

Mikael

Дата: Понедельник, 15.01.2018, 16:06 |
Сообщение № 10

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010

Сорри, про буфер обмена проглядел. У меня нет опыта общения с ним, поэтому тут помочь не смогу. Судя по информации в гугле, буфер обмена это уже другая история, стандартными методами к нему не подобраться.

Как вариант, предлагаю такой подход:
Если открыт буфер обмена, то на

любые изменения ячеек запоминать их значения во временной переменной, отменять изменения, и вставлять туда же значения из переменной, если нет — отслеживать режим копирования/вырезания.
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)

        With Application
        Call Module9.AppSettings(0)
        If .DisplayClipboardWindow Then
            Dim aTmp() As Variant
            aTmp = IIf(Target.Count > 1, Target.Value, Array(Target.Value))
            .Undo: Target.Value = aTmp
        Else
            If .CutCopyMode > 0 Then
                .Undo: Target.PasteSpecial Paste:=xlPasteValues
            End If  ‘.CutCopyMode
        End If  ‘.DisplayClipboardWindow
        Call Module9.AppSettings(1)
    End With    ‘Application

    End Sub

[/vba]
При этом нужно обязательно добавить следующий код в модуль9:
[vba]

Код

Public Sub AppSettings(ByVal bValue As Boolean)
    With Application: .ScreenUpdating = bValue: .EnableEvents = bValue: End With
End Sub

[/vba]
А в Ваши макросы добавить вызовы в начале и в конце:
[vba]

Код

Call AppSettings(0)
    …
    …
    …
Call AppSettings(1)

[/vba]
Это делается чтобы обработчик Worksheet_Change не срабатывал когда не надо.
Добавил файл:

К сообщению приложен файл:

2157253.xlsm
(29.3 Kb)

Сообщение отредактировал MikaelПонедельник, 15.01.2018, 16:07

 

Ответить

ttv

Дата: Понедельник, 22.01.2018, 10:12 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Mikael, получилось, все отлично работает! СПАСИБО вам огромнейшее!!!

 

Ответить

ttv

Дата: Среда, 24.01.2018, 15:50 |
Сообщение № 12

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

еще вопросик — а можно это все применить только к определенному диапазону ячеек? А не ко всем ячейкам на листе?

 

Ответить

Mikael

Дата: Четверг, 25.01.2018, 10:49 |
Сообщение № 13

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010

ttv, можно, к какому?
Делается примерно так:
в начало обработчика события Worksheet_Change добавить условие
[vba]

Код

If Intersect(Target, Range(«A1:D12»)) Is Nothing Then Exit Sub

[/vba]

Upd: чтобы работал только для столбцов Дата Х1 Х2 подставьте вот такой диапазон [vba]

Код

Range(«B14:D» & [a14].End(xlDown).Row)

[/vba]

Сообщение отредактировал MikaelЧетверг, 25.01.2018, 11:16

 

Ответить

ttv

Дата: Четверг, 01.02.2018, 11:27 |
Сообщение № 14

Группа: Пользователи

Ранг: Новичок

Сообщений: 29


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Upd: чтобы работал только для столбцов Дата Х1 Х2 подставьте вот такой диапазон

Mikael, спасибо огромнейшее, получилось как мне надо, теперь просто космос, а не файл! hands Пользователи рыдают от счастья :D

Сообщение отредактировал ttvЧетверг, 01.02.2018, 11:28

 

Ответить

Like this post? Please share to your friends:
  • Vba excel защитить все листы
  • Vba excel именованный диапазон в массив
  • Vba excel изменить таблицу
  • Vba excel защита ячейки
  • Vba excel имена открытых книг