繁体   English   中英

如何使用VBA禁用Excel中的取消隐藏列?

[英]How do i disable unhiding columns in Excel using VBA?

我在Excel中隐藏了许多列,并希望阻止用户使用格式控制选项以及取消隐藏这些列的上下文菜单。 我怎么能用VBA这样做?

实际上,通过菜单选项阻止用户取消隐藏列,最终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编辑器访问,但它不是 VBA解决方案,因此不依赖于启用宏的人。

隐藏列后,保护工作表并确保未在“保护工作表”对话框中选中“格式化单元格/行/列”。

只是隐藏标题,这使得取消隐藏列更难

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM