powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Блокировка ячеек в функции
22 сообщений из 22, страница 1 из 1
Блокировка ячеек в функции
    #33543833
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть функция (не имеющая смысла, главное механизм):

Код: plaintext
1.
2.
3.
4.
5.
Public Function MakeLocked()
  ActiveWorksheet.UnProtect(gl_Password)
  ActveCell.Locked = True ' Было False
  ActiveWorksheet.Protect(gl_Password)
End Function

Проблема в том что свойство Locked при вызове функции в ячейке не устанавливается в True (остается без изменений). В чем может быть дело?
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33543938
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(gl_Password) - что это?
если название листа то

Код: plaintext
Worksheets(gl_Password).UnProtect

если пароль то

Код: plaintext
ActiveSheet.UnProtect gl_Password

вобщем у тебя лист не распароливается и как следствие не меняется свойство
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33543996
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gl_Password - глобальная переменная, в которой зашит пароль
Код: plaintext
ActiveWorksheet.UnProtect(gl_Password)
возвращает True = снятие защиты проходит нормально.
Видимо в другом дело...
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33544091
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tokmЕсть функция (не имеющая смысла, главное механизм):

Код: plaintext
1.
2.
3.
4.
5.
Public Function MakeLocked()
  ActiveWorksheet.UnProtect(gl_Password)
  ActveCell.Locked = True ' Было False
  ActiveWorksheet.Protect(gl_Password)
End Function

Проблема в том что свойство Locked при вызове функции в ячейке не устанавливается в True (остается без изменений). В чем может быть дело?

80 % ошибок это синтаксис
Код: plaintext
ActveCell = ActiveCell
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33544132
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С синтаксисом тоже все в порядке - пример несуществующий...
Копировать получилось бы дольше. :)
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33544163
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tokmgl_Password - глобальная переменная, в которой зашит пароль
Код: plaintext
ActiveWorksheet.UnProtect(gl_Password)
возвращает True = снятие защиты проходит нормально.
Видимо в другом дело...
Вообще-то, насколько я изучил справку:
1. ActiveWorksheet.UnProtect(gl_Password) возвращает объект рабочий лист, а не True
2. а переменная gl_Password должна содержать пароль, а не True
Скорее всего ты наводишь курсор на gl_Password и тебе показывается его значение, а не результат операции ActiveWorksheet.UnProtect.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33544868
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
k-nikeВообще-то, насколько я изучил справку:
1. ActiveWorksheet.UnProtect(gl_Password) возвращает объект рабочий лист, а не True
2. а переменная gl_Password должна содержать пароль, а не True
Скорее всего ты наводишь курсор на gl_Password и тебе показывается его значение, а не результат операции ActiveWorksheet.UnProtect.

1. Нет. Unprotect возвращает:
• True - разблокировать лист удалось
• False - разблокировать лист не удалось
• Null - лист не защищен

2. Курсор никуда не навожу - все делаю через Stop и окно Immediate или Watch.

Сделал функцию MakeLocked() и процедуру MakeLockedMacro():
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Function MakeLocked()
  gl_Password = "drowssap"
  ActiveSheet.Unprotect (gl_Password)
  ActiveCell.Locked = True ' Áûëî False
  ActiveSheet.Protect (gl_Password)
End Function
'-----------------------------------------
Public Sub MakeLockedMacro()
  gl_Password = "drowssap"
  ActiveSheet.Unprotect (gl_Password)
  ActiveCell.Locked = True ' Áûëî False
  ActiveSheet.Protect (gl_Password)
End Sub

В результате при вызове функции в ячейке не происходит даже разблокирования (Unprotect возвращает False). Макрос работает прекрасно.
В чем может быть дело?
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33544948
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tokmВ результате при вызове функции в ячейке не происходит даже разблокирования (Unprotect возвращает False). Макрос работает прекрасно.
В чем может быть дело?
Вот чего я не могу понять никак, почему ты говоришь о разблокировании, а делаешь блокирование?
И вообще, все прекрасно работает. Скорее всего у тебя ошибка в имени переменной gl_Password. Поставь первой строкой в каждом модуле Option Explicit - VBA сам покажет где есть использование необъявленной переменной.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545164
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Вот чего я не могу понять никак, почему ты говоришь о разблокировании, а делаешь блокирование?


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

White Owl
И вообще, все прекрасно работает.


Все - это сильно сказано :) Меня интересует почему не работает пример - см. последний код в случае с функцией. С процедурой MakeLockedMacro() - да, работает, а с функцией - нет.

White OwlСкорее всего у тебя ошибка в имени переменной gl_Password. Поставь первой строкой в каждом модуле Option Explicit - VBA сам покажет где есть использование необъявленной переменной.

Опять же см. последний пример: gl_Password устанавливаю прямо в тексте функции/процедуры, текст которых не отличается ничем. При этом (повторюсь) при вызове функции сниятие защиты не происходит: ActiveSheet.Unprotect (gl_Password) - возвращает False, в процедура тот же метод возвращает True... Поэтому до сих пор не ясно как быть в такой ситуации - критично снимать защиту листа и менять свойства ячейки именно при вызове в ней функции.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545235
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function MakeLocked()
    'Dim gl_Password As String
  gl_Password = "111"
  ActiveSheet.Unprotect (gl_Password)
  ActiveCell.Locked = False ' Auei False
  ActiveSheet.Protect (gl_Password)
End Function

Sub d()
MakeLocked
End Sub

прописал в модуле, потом в модуле листа, всё работает.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545414
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function MakeLocked()
    'Dim gl_Password As String
  gl_Password = "111"
  ActiveSheet.Unprotect (gl_Password)
  ActiveCell.Locked = False
  ActiveSheet.Protect (gl_Password)
End Function

Sub d()
MakeLocked
End Sub

прописал в модуле, потом в модуле листа, всё работает.
Работает функция MakeLocked() или процедура d()? Мне нужно чтобы функция меняла свойства ячейки, из которой она была вызвана, на защищенном листе (конкретно - "Защищаемая ячейка"). В вашем примере ничего происходить не будет: функцией значение "Защищаемая ячейка" с True на False поменять нельзя... Так как без снятия защиты листа в защищаемую ячейку функцию не записать. Критично чтобы снятие защиты происходило без участия пользователя.

Непонятно наверно обясняю, пардон.
Итак сценарий такой:
1. Есть лист, в одной из ячеек галочка "Защищаемая ячейка" снята.
2. Защищаю лист, пароль "drowssap".
3. См. выше пример MakeLocked().
4. В незащищаемой ячейке пишу "=MakeLocked()". Ожидаемый эффект: галочка "Защищаемая ячейка" для данной ячейки должна быть установлена. Но этого не происходит.

На самом деле все вроде как по уму: не очень корректная ситуация, если вписали формулу в ячейку а в результате выполнения этой функции мы не сможем формулу поменять. Но нужно именно это... Как можно обойти?
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545532
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Function MakeLocked()
    Dim rng As Range
    Set rng = ActiveCell
    gl_Password = "111"
    ActiveSheet.Unprotect (gl_Password)
    rng.Locked = True
    ActiveSheet.Protect (gl_Password)
End Function

работает
Код: plaintext
1.
Public Function MakeLocked()
End Function
Код: plaintext
1.
2.
3.
4.
5.
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    gl_Password = "111"
    ActiveSheet.Unprotect (gl_Password)
    If ActiveCell.Offset(- 1 ,  0 ).FormulaLocal = "=MakeLocked()" Then ActiveCell.Locked = True
    ActiveSheet.Protect (gl_Password)
End Sub

работает
Код: plaintext
1.
2.
3.
4.
5.
Private Sub Worksheet_Change(ByVal Target As Range)
  gl_Password = "111"
  ActiveSheet.Unprotect (gl_Password)
  Target.Locked = True ' Auei False
  ActiveSheet.Protect (gl_Password)
End Sub
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545556
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodorработает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Function MakeLocked()
    Dim rng As Range
    Set rng = ActiveCell
    gl_Password = "111"
    ActiveSheet.Unprotect (gl_Password)
    rng.Locked = True
    ActiveSheet.Protect (gl_Password)
End Function


Работает = после вызове функции "=MakeLocked()" в незащищенной ячейке на защищенном листе она становится защищенной? У меня не работает (MS Office 2003).
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545563
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tokmНа самом деле все вроде как по уму: не очень корректная ситуация, если вписали формулу в ячейку а в результате выполнения этой функции мы не сможем формулу поменять. Но нужно именно это... Как можно обойти?
Непонятно каким образом вызывается эта функция MakeLocked() из ячейки!? Если редактированием самой ячейки, тогда смысл в ней? Может тогда лучше использовать событие Worksheets_Change?
Опишите поподробнее смысл всего этого.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545593
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
k-nike tokmНа самом деле все вроде как по уму: не очень корректная ситуация, если вписали формулу в ячейку а в результате выполнения этой функции мы не сможем формулу поменять. Но нужно именно это... Как можно обойти?
Непонятно каким образом вызывается эта функция MakeLocked() из ячейки!? Если редактированием самой ячейки, тогда смысл в ней? Может тогда лучше использовать событие Worksheets_Change?
Опишите поподробнее смысл всего этого.
Да редактированием ячейки. Есть функция которая рассчитывает определенные значения статьи (берется из таблицы SQL Server). При этом значение из таблицы может быть рассчитано руками или берется из справочника. Если берется из справочника, то нужно закрывать данную ячейку от редактирования (откуда берется значение определяется при вычисления значения внутри функции).
При полном пересчете листа защиту реализовал, теперь хочется сделать совсем красиво - при редактировании отдельных ячеек.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545772
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одним смыслом не обошелся))
Не понятно какая функция, откуда она вызывается, какие значения она берет из таблицы, какие из SQL и т.п... Еще подробнее можно? Может вашу проблему можно решить более простым путем?
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33545816
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
k-nikeОдним смыслом не обошелся))
Не понятно какая функция, откуда она вызывается, какие значения она берет из таблицы, какие из SQL и т.п... Еще подробнее можно? Может вашу проблему можно решить более простым путем?

Думаю что более простого пути нет - так как именно это и есть требование заказчика: защищать ячейки в которых значение функции getSValue() рассчитывается на основании справочника (то есть добавить "побочный эффект" в функцию - помимо возвращения значения, защищать ячейки по условию). Текст функции приводить не имеет смысла - она достаточно объемная и работает корректно кроме как раз момента который вынесен в примере в MakeLocked().
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33546199
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы меня не так поняли. Просто я так и не понял логики работы. Ну и ладно.
Иными словами, некая функция при пересчете в зависимости от данных (справочные или нет) должна сама себя защитить или не защитить?
Если я все правильно понял, почему бы не воспользоваться событием Worksheet_Calculate() или Worksheet_Change() и не защищать ячейки этим событием? И не надо городить огород с этой функцией.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33546438
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
k-nikeВы меня не так поняли. Просто я так и не понял логики работы. Ну и ладно.
Иными словами, некая функция при пересчете в зависимости от данных (справочные или нет) должна сама себя защитить или не защитить? Если я все правильно понял, почему бы не воспользоваться событием Worksheet_Calculate() или Worksheet_Change() и не защищать ячейки этим событием? И не надо городить огород с этой функцией.

Логику работы вы поняли правильно.
Спасибо!
Буде делать через события.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33547431
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иными словами, некая функция при пересчете в зависимости от данных (справочные или нет) должна сама себя защитить или не защитить?
Хорошая постановка задачи, "сама себя защитить". А если "сама себя разрешить", то первая же клавиша нажатая юзером сотрет эту формулу к чертовой матери. Об этом вы не задумывались?

Кстати, раз пошла такая пьянка, пусть крыша едет дальше :) Вы в своей супер-пупер формуле действительно используете ActiveCell или это только для примера было? ActiveCell он знаете ли меняется, поэтому в функции его использовать нельзя совершенного.
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33547544
tokm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlХорошая постановка задачи, "сама себя защитить". А если "сама себя разрешить", то первая же клавиша нажатая юзером сотрет эту формулу к чертовой матери. Об этом вы не задумывались?

По-моему если ячейка на защищенном листе защищена, то стереть формулу без снятия защиты листа не удастся. Если я не прав - поправьте.
White Owl]
Кстати, раз пошла такая пьянка, пусть крыша едет дальше :) Вы в своей супер-пупер формуле действительно используете ActiveCell или это только для примера было? ActiveCell он знаете ли меняется, поэтому в функции его использовать нельзя совершенного.
С этим согласен...
...
Рейтинг: 0 / 0
Блокировка ячеек в функции
    #33547697
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tokm White OwlХорошая постановка задачи, "сама себя защитить". А если "сама себя разрешить", то первая же клавиша нажатая юзером сотрет эту формулу к чертовой матери. Об этом вы не задумывались?

По-моему если ячейка на защищенном листе защищена, то стереть формулу без снятия защиты листа не удастся. Если я не прав - поправьте.
Прав. Но тебе же нужно не только защищать ячейки, не так ли? Некоторые ячейки тебе надо разрешать для редактирования. А если ячейка разрешена - формула в ней может (и обязательно будет) стерта.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Блокировка ячеек в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]