Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Блокировка ячеек в функции / 22 сообщений из 22, страница 1 из 1
14.02.2006, 15:11:17
    #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
14.02.2006, 15:36:18
    #33543938
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
(gl_Password) - что это?
если название листа то

Код: plaintext
Worksheets(gl_Password).UnProtect

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

Код: plaintext
ActiveSheet.UnProtect gl_Password

вобщем у тебя лист не распароливается и как следствие не меняется свойство
...
Рейтинг: 0 / 0
14.02.2006, 15:46:44
    #33543996
tokm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
gl_Password - глобальная переменная, в которой зашит пароль
Код: plaintext
ActiveWorksheet.UnProtect(gl_Password)
возвращает True = снятие защиты проходит нормально.
Видимо в другом дело...
...
Рейтинг: 0 / 0
14.02.2006, 16:07:35
    #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
14.02.2006, 16:15:55
    #33544132
tokm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
С синтаксисом тоже все в порядке - пример несуществующий...
Копировать получилось бы дольше. :)
...
Рейтинг: 0 / 0
14.02.2006, 16:24:43
    #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
14.02.2006, 21:39:50
    #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
14.02.2006, 23:15:13
    #33544948
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
tokmВ результате при вызове функции в ячейке не происходит даже разблокирования (Unprotect возвращает False). Макрос работает прекрасно.
В чем может быть дело?
Вот чего я не могу понять никак, почему ты говоришь о разблокировании, а делаешь блокирование?
И вообще, все прекрасно работает. Скорее всего у тебя ошибка в имени переменной gl_Password. Поставь первой строкой в каждом модуле Option Explicit - VBA сам покажет где есть использование необъявленной переменной.
...
Рейтинг: 0 / 0
15.02.2006, 07:33:40
    #33545164
tokm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
White Owl
Вот чего я не могу понять никак, почему ты говоришь о разблокировании, а делаешь блокирование?


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

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


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

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

Опять же см. последний пример: gl_Password устанавливаю прямо в тексте функции/процедуры, текст которых не отличается ничем. При этом (повторюсь) при вызове функции сниятие защиты не происходит: ActiveSheet.Unprotect (gl_Password) - возвращает False, в процедура тот же метод возвращает True... Поэтому до сих пор не ясно как быть в такой ситуации - критично снимать защиту листа и менять свойства ячейки именно при вызове в ней функции.
...
Рейтинг: 0 / 0
15.02.2006, 08:49:44
    #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
15.02.2006, 10:05:16
    #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
15.02.2006, 10:50:33
    #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
15.02.2006, 11:00:38
    #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
15.02.2006, 11:01:52
    #33545563
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
tokmНа самом деле все вроде как по уму: не очень корректная ситуация, если вписали формулу в ячейку а в результате выполнения этой функции мы не сможем формулу поменять. Но нужно именно это... Как можно обойти?
Непонятно каким образом вызывается эта функция MakeLocked() из ячейки!? Если редактированием самой ячейки, тогда смысл в ней? Может тогда лучше использовать событие Worksheets_Change?
Опишите поподробнее смысл всего этого.
...
Рейтинг: 0 / 0
15.02.2006, 11:11:10
    #33545593
tokm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
k-nike tokmНа самом деле все вроде как по уму: не очень корректная ситуация, если вписали формулу в ячейку а в результате выполнения этой функции мы не сможем формулу поменять. Но нужно именно это... Как можно обойти?
Непонятно каким образом вызывается эта функция MakeLocked() из ячейки!? Если редактированием самой ячейки, тогда смысл в ней? Может тогда лучше использовать событие Worksheets_Change?
Опишите поподробнее смысл всего этого.
Да редактированием ячейки. Есть функция которая рассчитывает определенные значения статьи (берется из таблицы SQL Server). При этом значение из таблицы может быть рассчитано руками или берется из справочника. Если берется из справочника, то нужно закрывать данную ячейку от редактирования (откуда берется значение определяется при вычисления значения внутри функции).
При полном пересчете листа защиту реализовал, теперь хочется сделать совсем красиво - при редактировании отдельных ячеек.
...
Рейтинг: 0 / 0
15.02.2006, 11:50:46
    #33545772
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
Одним смыслом не обошелся))
Не понятно какая функция, откуда она вызывается, какие значения она берет из таблицы, какие из SQL и т.п... Еще подробнее можно? Может вашу проблему можно решить более простым путем?
...
Рейтинг: 0 / 0
15.02.2006, 12:02:48
    #33545816
tokm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка ячеек в функции
k-nikeОдним смыслом не обошелся))
Не понятно какая функция, откуда она вызывается, какие значения она берет из таблицы, какие из SQL и т.п... Еще подробнее можно? Может вашу проблему можно решить более простым путем?

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

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

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

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

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


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