Защита ячеек в Excel, но позволяющая изменять их с помощью сценария VBA

Я использую Excel, где определенные поля разрешены для ввода пользователем, а другие ячейки должны быть защищены. Я использовал лист Tools Protect, однако после этого я не могу изменить значения в скрипте VBA. Мне нужно ограничить лист, чтобы остановить ввод пользователя, в то же время разрешить коду VBA изменять значения ячеек на основе определенных вычислений.

См. Этот вопрос для более подробной информации: stackoverflow.com/questions/445519/…

Lance Roberts 02.04.2009 01:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
63
1
220 278
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я не думаю, что вы можете сделать любую часть листа доступной для редактирования только с помощью VBA., но вы можете сделать что-то, что имеет в основном тот же эффект - вы можете снять защиту рабочего листа в VBA, прежде чем вам нужно будет вносить изменения:

wksht.Unprotect()

и повторно защитите его после того, как закончите:

wksht.Protect()

Обновлено: похоже, что этот обходной путь, возможно, решил непосредственную проблему Дхира, но для всех, кто столкнется с этим вопросом / ответом позже, я ошибся в первой части своего ответа, как указывает Джо ниже. Вы может защищаете лист, чтобы его можно было редактировать только с помощью VBA, но похоже, что параметр «UserInterfaceOnly» может быть установлен только при вызове «Worksheet.Protect» в коде.

Это верно только для Excel 95 и 97. Для Excel 2000+ см. Ответ Джо.

GSerg 24.09.2008 14:32
Ответ принят как подходящий

Попробуйте использовать

Worksheet.Protect "Password", UserInterfaceOnly := True

Если для параметра UserInterfaceOnly задано значение true, код VBA может изменять защищенные ячейки.

Конечно, это лучшее решение. Если вы вернетесь и увидите этот комментарий, пожалуйста, исправьте опечатку в вашем коде - там буква «f» вместо «t»: UserInferfaceOnly Понадобилась пара минут, чтобы выяснить, что было не так, после того, как я вставил ваш код .

Kevin Crumley 24.09.2008 20:40

К сожалению, это не удается, см. здесь

Tobias Kienzler 09.02.2015 14:52

Что, если я хочу редактировать только определенный диапазон ячеек?

user2933315 01.08.2015 22:52

@Solver - если вы хотите разрешить пользователю редактировать ячейки на защищенном листе, вам необходимо разблокировать эти ячейки (Range.Locked = False в VBA).

Joe 02.08.2015 13:52

если я попытаюсь использовать Activesheet.AutoFilter.ApplyFilter после защиты этим методом, я получу ошибку 1004. Но без нее ошибки нет. Кто-нибудь знает, почему это так? Cells.AutoFilter как ни странно работает нормально

Some_Guy 07.07.2017 17:45

UserInterfaceOnly был бы прекрасен, если бы MS поддерживала его для новых функций. Если я попытаюсь обновить таблицу запросов через VBA на защищенном листе с UserInterfaceOnly = true, это не удастся, мне придется снять защиту листа, обновить, а затем снова защитить. Ахххх ....

Travis 13.07.2018 01:32

Вы можете изменить лист с помощью кода, выполнив следующие действия.

  • Снять защиту
  • Изменить
  • Защищать

В коде это будет:

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

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

Код может быть улучшен, выполнив эти действия

  • Повторно защитить
  • Изменить

Код для этого будет:

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

Этот код обновляет защиту рабочего листа, но с параметром UserInterfaceOnly, установленным в значение true. Это позволяет коду VBA изменять рабочий лист, сохраняя рабочий лист защищенным от ввода данных пользователем через пользовательский интерфейс, даже если выполнение прерывается.

Этот параметр равен потерял, когда книга закрывается и открывается повторно. Защита рабочего листа по-прежнему сохраняется.

Таким образом, код «Повторной защиты» должен быть включен в начало любой процедуры, которая пытается изменить рабочий лист, или может быть запущен только один раз при открытии книги.

Базовый, но простой для понимания ответ:

Sub Example()
    ActiveSheet.Unprotect
    Program logic...
    ActiveSheet.Protect
End Sub

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

Вы сможете изменить изменить отображаемое значение через скрытый рабочий лист, а ваши пользователи не смогут его редактировать.

Я выбрал ячейки, которые хотел заблокировать на листе Sheet1, поместил предложенный код в функцию open_workbook () и работал как шарм.

ThisWorkbook.Worksheets("Sheet1").Protect Password: = "Password", _
UserInterfaceOnly:=True

Другие вопросы по теме