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





Я не думаю, что вы можете сделать любую часть листа доступной для редактирования только с помощью VBA., но вы можете сделать что-то, что имеет в основном тот же эффект - вы можете снять защиту рабочего листа в VBA, прежде чем вам нужно будет вносить изменения:
wksht.Unprotect()
и повторно защитите его после того, как закончите:
wksht.Protect()
Обновлено: похоже, что этот обходной путь, возможно, решил непосредственную проблему Дхира, но для всех, кто столкнется с этим вопросом / ответом позже, я ошибся в первой части своего ответа, как указывает Джо ниже. Вы может защищаете лист, чтобы его можно было редактировать только с помощью VBA, но похоже, что параметр «UserInterfaceOnly» может быть установлен только при вызове «Worksheet.Protect» в коде.
Это верно только для Excel 95 и 97. Для Excel 2000+ см. Ответ Джо.
Попробуйте использовать
Worksheet.Protect "Password", UserInterfaceOnly := True
Если для параметра UserInterfaceOnly задано значение true, код VBA может изменять защищенные ячейки.
Конечно, это лучшее решение. Если вы вернетесь и увидите этот комментарий, пожалуйста, исправьте опечатку в вашем коде - там буква «f» вместо «t»: UserInferfaceOnly Понадобилась пара минут, чтобы выяснить, что было не так, после того, как я вставил ваш код .
К сожалению, это не удается, см. здесь
Что, если я хочу редактировать только определенный диапазон ячеек?
@Solver - если вы хотите разрешить пользователю редактировать ячейки на защищенном листе, вам необходимо разблокировать эти ячейки (Range.Locked = False в VBA).
если я попытаюсь использовать Activesheet.AutoFilter.ApplyFilter после защиты этим методом, я получу ошибку 1004. Но без нее ошибки нет. Кто-нибудь знает, почему это так? Cells.AutoFilter как ни странно работает нормально
UserInterfaceOnly был бы прекрасен, если бы MS поддерживала его для новых функций. Если я попытаюсь обновить таблицу запросов через VBA на защищенном листе с UserInterfaceOnly = true, это не удастся, мне придется снять защиту листа, обновить, а затем снова защитить. Ахххх ....
Вы можете изменить лист с помощью кода, выполнив следующие действия.
В коде это будет:
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
См. Этот вопрос для более подробной информации: stackoverflow.com/questions/445519/…