我在Excel中隐藏了许多列,并希望阻止用户使用格式控制选项以及取消隐藏这些列的上下文菜单。我怎么能用VBA这样做?
答案 0 :(得分:3)
实际上阻止用户通过菜单选项取消隐藏列,最终VBA中的选项受到限制,因为VBA没有任何特殊的魔力。它将使用与您在Excel应用程序中使用的完全相同的功能,因此在使用Sheet保护功能时发现的相同限制在VBA解决方案中将是相同的。
可能是一些类似VBA的解决方案,可以让你接近你需要的东西,但它们不会是完美的,只是简单地禁用宏,很容易被击败,渲染你的安全措施完全无效。
一个选项是在选择更改时随时重新隐藏列,但是这不会阻止用户选择整个列并取消隐藏行,但只要他们选择一个单元格,它就会再次隐藏。您可以通过锁定仅此列中的单元格并保护工作表以防止选择锁定的单元格来阻止某人选择单元格。你不会阻止任何人取消隐藏和查看数据,但是你会阻止他们修改数据,并且很难看到具体的公式。
执行此操作的代码就在此处,并在工作表代码部分(您捕获工作表事件的位置)中进行操作
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Columns("F").EntireColumn.Hidden = True
End Sub
另一种选择是禁用工作簿中的相应菜单选项,但这并不会删除功能,只会使访问更加困难。
执行此操作的代码就在此处,并在工作簿代码部分(您捕获工作簿级事件)中
Private Sub Workbook_BeforeClose(Cancel As Boolean)
//Re-enable in Column Context Menu
Application.CommandBars("Column").Controls("Unhide").Enabled = True
//Re-enable in Ribbon Format menu
Application.CommandBars("Format").Controls("???").Enabled = True
End Sub
Private Sub Workbook_Open()
//Disable in Column Context Menu
Application.CommandBars("Column").Controls("Unhide").Enabled = False
//Disable in Ribbon Format menu
Application.CommandBars("Format").Controls("???").Enabled = True
End Sub
我还没有找到正确的菜单/子菜单项组合来禁用菜单项来自"格式"菜单(因此" ???"),但你也需要在那里做。作为一个宏解决方案,您仍然依赖于在打开工作簿时启用宏的人。此外,您实际上禁用了菜单项,因此您无法为工作簿中的任何其他工作表和任何其他打开的工作簿选择这些选项,而不仅仅是您想要的特定列。
这也是我过去发现的版本依赖,因为Excel版本中的菜单选项已经更改,因此在Excel 2007或2010中有效的版本在2013年可能无法正常工作,这意味着您现在需要在代码中包含版本检查,并根据特定版本的相应名称启用/禁用。
此外,如果Excel崩溃且BeforeClose
代码未运行,您可能无法正确重新启用菜单选项。
最终,最好的故障保护措施不是隐藏列并将任何敏感信息和公式移动到另一个工作表中,然后您可以通过VBA隐藏它以使其几乎不会从Excel应用程序中隐藏。
在Visual Basic编辑器中,单击“项目”窗格中的工作表,然后从下面的属性窗格中单击“可见”并将选项更改为xlSheetVeryHidden
现在,工作表将被隐藏但不会从Sheet/Unhide
菜单中看到,并且只能从Visual Basic编辑器访问(您必须再次取消隐藏它才能看到它)。此解决方案的最佳部分是,虽然只能从Visual Basic编辑器访问,但它是 NOT VBA解决方案,因此不依赖于启用宏的人。
答案 1 :(得分:0)
隐藏列后,保护工作表并确保未在“保护工作表”对话框中选中“格式化单元格/行/列”。
答案 2 :(得分:0)
只是隐藏标题,这使得取消隐藏列
变得更加困难