Как запретить изменение ячеек vba excel

 

Владимир С

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

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

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

 

Пытливый

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

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

Добрый.
Эмм… а защитить ячейки с невозможностью выделения — тоже не подходит?

Кому решение нужно — тот пример и рисует.

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#3

17.12.2015 13:39:11

Цитата
Владимир С написал: Данный запрет должен быть реализован только макросом

вот с этого момента поподробнее. А если я отключу работу макросов — что делать будете? Просто странное желание: не защитить нормально, а именно макросом. Поэтому хочется услышать цель, а не хотелку.
По сути запретить изменять ячейки можно таким кодом в модуле книги:

Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    With Application
    .EnableEvents = 0: .Undo: .EnableEvents = 1
    End With
End Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Владимир С

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

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

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

 

Владимир С

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

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

#5

17.12.2015 13:53:15

Цитата
The_Prist написал:
А если я отключу работу макросов — что делать будете?

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

Изменено: Владимир С17.12.2015 14:19:19

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#6

17.12.2015 14:06:53

Цитата
Владимир С написал:
но тогда остается возможность пользователю копировать все данные с листа

так цель запретить копировать данные?
Или

Цитата
Владимир С написал:
в реализации запрета на изменения данных в в ячейке или диапазоне ячеек

?
Реализацию запрета изменения кодом я показал.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Владимир С

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

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

#7

17.12.2015 14:07:00

Цитата
The_Prist написал:
По сути запретить изменять ячейки можно таким кодом в модуле книги:

Код супер но он запрещает изменение все ячеек, а как указать диапазон который нужно запретить?

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#8

17.12.2015 14:09:20

Код
If intersect(target,sh.range("A1:C10")) is nothing then exit sub

вставить перед With Application
A1:C10 — диапазон ячеек, в которых необходимо запретить ввод данных.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Владимир С

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

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

 

Владимир С

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

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

#10

17.12.2015 14:18:39

Цитата
The_Prist написал:
так цель запретить копировать данные?

Да, этот способ проще для реализации защиты от копирования, а также защита от изменений.

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

0 / 0 / 0

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

Сообщений: 72

1

Запретить изменение данных в ячейке.

18.12.2010, 16:40. Показов 11368. Ответов 8


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

Можно ли запретить изменение данных в определенном диапазоне листа (программно) не используя функции защиты т.е. как-то иначе отслеживать попытку изменения и прерывать её или спрашивать ‘а нужно ли…’
Вся проблема в том что фаил должен работать в локальной сети, а в открытом доступе постоянно ставить и снимать защиту не получается.



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

18.12.2010, 16:40

Ответы с готовыми решениями:

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

Будьте добры подскажите, есть ли событие, которое отслеживает, если в ячейке…

Изменение данных в ячейке на основании значения в соседней ячейке
Вот такая ситуация — на листе есть два столбца, в одном из них формула "ИНДЕКС…ПОИСКПОЗ", которая…

Изменение цвета данных в ячейке
Всем привет. Подскажите, пожалуйста, существует ли возможность менять моно цвет данных ФОРМУЛЫ (или…

Изменение данных в ячейке DBGrid с использованием DataSource
Добрый день всем:)
Ребятки,такая проблема: мне надо изменить данные в ячейке DBGrida зная название…

8

Димит

90 / 37 / 14

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

Сообщений: 429

19.12.2010, 21:42

2

Можно разместить например такую процедуру в блоке листа:

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
'Проверяем входит ли изменённая ячейка в заданный диапазон(для примера'A1:C3')
    If Union(Лист1.Range('A1:C3'), Target).Address = Лист1.Range('A1:C3').Address Then
        If MsgBox('Эта ячейка защищена, изменить её?', vbYesNo) = vbNo Then
'отменяем изменение с помощью кнопки 'Отменить'(для русской версии)
            CommandBars('Standard').Controls('Отменить').Execute
        End If
    End If
End Sub

Дмит



0



4131 / 2235 / 940

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

Сообщений: 4,624

19.12.2010, 21:48

3

А кто-нибудь отключит макросы при открытии файла и тогда … все мучения напрасны, так что необходимо защитить лист паролем, а пароль снимать при открытии файла программно Private Sub Workbook_Open(),
тогда при отключении макросов уже никто не сможет изменить в этом файле.



0



0 / 0 / 0

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

Сообщений: 72

19.12.2010, 22:03

 [ТС]

4

Если я не ошибаюсь при работе макроса т.е. после его работы (любого макроса) кнопка отменить не срабатывает, по крайней мере она не доступна, разве можно вызвать её программно?
Именно не разрешать ни удалять ни изменять…т.е. предупреждать действие а не исправлять его…
Странно, что пункт меню ‘правка прямо в ячейке’ срабатывает только на мышинные клики а не на кнопку del например или вообще на на любую кнопу на клаве…т.е. если галку убрать то нельзя править в ячейке только с помощью мышки, а с помощью клавы можно…
Вот думаю…и не как придумать не могу….



0



4131 / 2235 / 940

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

Сообщений: 4,624

20.12.2010, 04:05

5

Макрос Дмита отменяет действия выполненные стандартными средствами (т.е. то ,что собственно и вызвало этот макрос к жизни, например, ввод в ячейку данных)



0



0 / 0 / 0

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

Сообщений: 72

20.12.2010, 11:39

 [ТС]

6

ну не знаю…у меня тут ещё несколько действий происходит во время проверки изменений на листе…и возврат не доступен, стоит изменит букевку или удалить наименование кнопой дел или бекспейс и всё…возврата назад нет..
но попробую именно проверить этот код в чистом виде так как дали…



0



90 / 37 / 14

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

Сообщений: 429

20.12.2010, 21:23

7

ronick
Если код не будет работать, уточни задачу.
Попробуем справится вместе.
Дмит



0



0 / 0 / 0

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

Сообщений: 72

20.12.2010, 21:25

 [ТС]

8

Хорошо попробую …поставлю и скажу результат…но пока не работает..проверю код в читом виде.



0



0 / 0 / 0

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

Сообщений: 104

22.07.2015, 00:03

9

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



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

22.07.2015, 00:03

9

Запрет изменения ячейки по условию

pechkin

Дата: Воскресенье, 26.01.2014, 18:04 |
Сообщение № 1

Группа: Проверенные

Ранг: Обитатель

Сообщений: 323


Репутация:

48

±

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


2003

Здравствуйте! Подскажите пожалуйста. Есть Макрос , который по изменению значения в ячейке В1 запускает другой Макрос. Как его дописать, чтобы он запрещал изменение старого значения (не давал выделить ячейку или как-то еще) , если при этом значение в другой ячейке (например G3) больше нуля,и как следствие, не запускал Макрос
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
       Dim rng As Range: Set rng = [B1]    
      If Not Intersect(rng, Target) Is Nothing Then Макрос1
    End Sub

[/vba]
Спасибо!

Сообщение отредактировал pechkinВоскресенье, 26.01.2014, 18:05

 

Ответить

Serge_007

Дата: Воскресенье, 26.01.2014, 22:28 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

В модуль «Эта книга«:[vba]

Код

Private Sub Workbook_Open()
    Worksheets(«Лист1»).Unprotect
       If Worksheets(«Лист1»).Range(«g3») > 0 Then
          With Worksheets(«Лист1»)
              .Range(«A1:Z1000»).Locked = False
              .Range(«B1»).Locked = True
              .Protect
              .EnableSelection = xlUnlockedCells
          End With
       End If
End Sub

[/vba]

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

pechkin_.rar
(11.7 Kb)


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Необходимо, чтобы при попытке изменения пользователем одной из ячеек листа, проверялось некоторое условие, и, если результат — FALSE, выводился соответствующий MesageBox, и изменения не происходило.

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

Здравствуйте, ILY, Вы писали:

Worksheet_Change(ByVal Target As Range) 'где Target и есть изменённая ячейка
if Target.Value = 0 then
msgbox "и шо ты тут творишь ?" :)
end if

а может просто format cells->protection->locked=true потом tools->protection->protect sheet ?

Здравствуйте, ma3ai, Вы писали:

M>[vb]

M>Worksheet_Change(ByVal Target As Range) ‘где Target и есть изменённая ячейка
M>if Target.Value = 0 then
M>msgbox «и шо ты тут творишь ?»
M>end if

Не понял
В этом коде ты проверяешь, если пользователь ввел в ячейку 0, то выводится MesasgeBox, «типа Нельзя 0 вводить». Так?
Ну это понятно, а как вернуть старое значение измененной пользователем ячейки?

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

Здравствуйте, ILY, Вы писали:

ILY>Здравствуйте, ma3ai, Вы писали:

ILY>Не понял


ILY>В этом коде ты проверяешь, если пользователь ввел в ячейку 0, то выводится MesasgeBox, «типа Нельзя 0 вводить». Так?
ILY>Ну это понятно, а как вернуть старое значение измененной пользователем ячейки?

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

Может тогда так:

Application.Undo

Здравствуйте, SiNick, Вы писали:

SN>Может тогда так:


SN>

SN>Application.Undo
SN>

Уже лучше, спасибо. Наверное так и сделаю
Но все-равно как-то коряво. Неужели это не настолько распространенная проблема, чтбы в Visual Basic были средства для ее решения. Скажем, OnChange мог бы передавать также и старое значение измененной ячейки.

Здравствуйте, ILY, Вы писали:

ILY>В этом коде ты проверяешь, если пользователь ввел в ячейку 0, то выводится MesasgeBox, «типа Нельзя 0 вводить». Так?

да
ILY>Ну это понятно, а как вернуть старое значение измененной пользователем ячейки?
тут сложнее
в excel нет нормального(встроенного) способа получитть прежнее значение поэтому придётся изголятся:
навскидку
1. если проверяемых ячеек мало — запомнить все значения, потом восстанавливать
2. следить/проверять предыдущее значение при Worksheet_SelectionChange (гемор ещё тот)
3. заранее установить Validation для нужных ячеек. excel сам будет следить за всем
4. способ application.undo очень даже неплох, но придётся добавить ограничитель чтобы при .undo повторно не срабатывало Worksheet_Change

Public Sub Undo()
    Static IsBusy As Boolean
    If Not IsBusy Then
        IsBusy = True
        Application.Undo
        IsBusy = False
    End If
End Sub

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