【问题标题】:VBA unprotect buttonVBA取消保护按钮
【发布时间】:2019-08-10 05:25:19
【问题描述】:

我有一个带有多个按钮的 Excel 表。工作表需要解锁才能运行宏。虽然我发现了在独立运行时保护/取消保护工作表的短 VBA 代码,但当这些代码集成到按钮的代码中时,取消保护工作表不起作用。特定按钮的代码是:

Sub OptionButton56_Click()
     ActiveSheet.Unprotect Password:="Password"
            If Range("D33").Value = 2 Then
               Sheets("Input").Rows("34:35").Hidden = msoTrue
            ElseIf Range("D33").Value = 1 Then
               Sheets("Input").Rows("34:35").Hidden = msoFalse
            End If
    ActiveSheet.Protect Password:="Password"
End Sub

【问题讨论】:

  • 输入工作表是否与上面有此按钮的工作表相同?
  • @costas 请注意,“取消保护工作表不起作用” 不是有用的错误描述。而是告诉更多细节。你得到哪个错误?或者发生了什么而不是你预期的? • 请注意,您取消了ActiveSheet 的保护,但您隐藏了Sheets("Input") 中的一些行。请澄清。

标签: excel vba radio-button password-protection


【解决方案1】:

该代码应该可以工作。当您说它不起作用时,您是遇到某种错误还是一切都在执行,但您只是没有看到预期的变化?此外,更简单的方法是在保护工作表时使用userinterfaceonly:=True。如果您使用它,那么工作表只为用户锁定,而不是为 vba 代码锁定。因此,您无需在每次需要执行代码时都解锁工作表。我总是将这个宏用于我的所有模型:

'UserInterfaceOnly locks edits from user but allows VBA to edit (no need to unlock/lock before/after macros)
'This setting is kept in memory, so it must be applied on Open Workbook Event
Sub Lock_Model(wb As Workbook, Optional strFunction As String = "Lock")
    Dim varSheets As Variant

    varSheets = Array("sheet1", "sheet2") ' list all the sheets you want to lock

    'Lock/Unlock specified sheets in model
    If strFunction = "Lock" Then
        For i = LBound(varSheets) To UBound(varSheets)
            wb.Sheets(varSheets(i)).Protect Password:="Password", AllowFormattingColumns:=True, AllowFormattingRows:=True, UserInterfaceOnly:=True
        Next i
    Else
        For i = LBound(varSheets) To UBound(varSheets)
            wb.Sheets(varSheets(i)).Unprotect Password:="Password"
        Next i
    End If
End Sub

如果您不喜欢这种方法,请指定运行代码时究竟发生了什么。

【讨论】:

  • 请注意,每次重新打开工作簿后都必须使用UserInterfaceOnly:=True。它不会保存,因此在关闭工作簿后不会持续存在。另见VBA Excel: Sheet protection: UserInterFaceOnly gone
  • 这正是我说在工作簿打开事件上调用此宏的原因。每次打开工作簿时,代码都会应用
  • 哈哈,这是每个伟大的开发人员都很难学到的一课。我不得不学习它很多很多次......
  • 好吧,我又进了一步,我已经上过课了。我几乎从不使用 cmets。这可能是我没有阅读它们的原因。好的代码不需要 cmets。举个例子:如果您将varSheets 重命名为SheetsToLock,则后面的注释会变得多余并且可以删除。
  • @Hasib_Ibradzic:Peh 的观点是,命名良好的变量会使许多 cmets 变得多余。太多的 cmets 会使代码难以阅读,尤其是当代码更改时 cmets 并不总是更新时!
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 2018-04-18
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多