Владимир С Пользователь Сообщений: 50 |
Добрый день. Прошу помощи в реализации запрета на изменения данных в в ячейке или диапазоне ячеек. Данный запрет должен быть реализован только макросом. Стандартные методы не подходят. |
Пытливый Пользователь Сообщений: 4587 |
Добрый. Кому решение нужно — тот пример и рисует. |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#3 17.12.2015 13:39:11
вот с этого момента поподробнее. А если я отключу работу макросов — что делать будете? Просто странное желание: не защитить нормально, а именно макросом. Поэтому хочется услышать цель, а не хотелку.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||||
Владимир С Пользователь Сообщений: 50 |
Есть определенный функционал(надстройка) который выполняет определенный действия ссылаясь на выделенную ячейку, запрещать стандартным способом изменения можно, но тогда остается возможность пользователю копировать все данные с листа, а это должно быть запрещено. Когда стоит запрет на выделение заблокированы ячеек тогда функционал не может работать так как не видит выделенные для него ячейки. |
Владимир С Пользователь Сообщений: 50 |
#5 17.12.2015 13:53:15
Стоит двойная защита листа для пользователя, как макросом, макросы работаю но лист остается защищен и ручная защита стандартным способом. Если отключить работу макросов тогда пользователь ничего не сделает что от него требуется. Изменено: Владимир С — 17.12.2015 14:19:19 |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#6 17.12.2015 14:06:53
так цель запретить копировать данные?
? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||||
Владимир С Пользователь Сообщений: 50 |
#7 17.12.2015 14:07:00
Код супер но он запрещает изменение все ячеек, а как указать диапазон который нужно запретить? |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#8 17.12.2015 14:09:20
вставить перед With Application Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Владимир С Пользователь Сообщений: 50 |
|
Владимир С Пользователь Сообщений: 50 |
#10 17.12.2015 14:18:39
Да, этот способ проще для реализации защиты от копирования, а также защита от изменений. |
||
I want to stop others from editing the cell contents in my excel sheet using VBA. Is it possible to do this?
armstrhb
4,0243 gold badges20 silver badges28 bronze badges
asked Jun 14, 2010 at 13:05
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 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 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 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
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
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 8 |
Димит 90 / 37 / 14 Регистрация: 03.11.2010 Сообщений: 429 |
||||
19.12.2010, 21:42 |
2 |
|||
Можно разместить например такую процедуру в блоке листа:
Дмит
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 |
Если я не ошибаюсь при работе макроса т.е. после его работы (любого макроса) кнопка отменить не срабатывает, по крайней мере она не доступна, разве можно вызвать её программно?
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 |
Запрет изменения ячейки по условию |
||||||||
Ответить |
||||||||
Ответить |
Необходимо, чтобы при попытке изменения пользователем одной из ячеек листа, проверялось некоторое условие, и, если результат — 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
…