下面就以一个文件的链接,你可以从onedrive下载:
https://1drv.ms/x/s!Ah_zTnaUo4DzjhWzQ3OTq9tq1APC
而非硬代码应该发生什么当选择每个工作表时,我在“控件”工作表上使用了一个ListObject(即Excel表)来存储“父”工作表与其各个“子”之间的关系。代码简单地检查这个ListObject,看看哪些孩子属于哪个父母,然后相应地采取行动。这有助于让不理解VBA的人轻松添加或修改需要的父/子表单关系,从而使其变得非常容易。
我也实现了一个'开发人员'模式,其中表单隐藏不会发生。没有什么比试图在仅将'用户'视为'用户'的应用程序上进行开发更令人沮丧的了:您可以使用键盘快捷键Ctrl + Shift + D(D for Developer)在“用户”和“开发者”模式之间切换)。
下面是我刚才放在一起的示例文件的外观。我已经添加了如下所示为一个名为“控件”的新表中的ListObject,并给予的ListObject“VisibleSheets”的名字:
我还添加了名为DeveloperMode命名区域,与真值:
下面是切换“用户”模式和“开发者”模式的应用程序的代码,即进入在标准代码模块:
Public Sub ToggleDeveloperMode()
Dim ws As Worksheet
If ActiveWorkbook.Names("DeveloperMode").Value = "=TRUE" Then
ActiveWorkbook.Names("DeveloperMode").Value = "=FALSE"
Else
ActiveWorkbook.Names("DeveloperMode").Value = "=TRUE"
For Each ws In ActiveWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws
End If
End Sub
下面是实际执行所有的藏身代码,取消隐藏,这也是一个标准RD代码模块:
Sub DisplaySheets()
Dim ws As Worksheet
Dim lo As ListObject
Dim lc As ListColumn
Dim vMatch As Variant
Set lo = Range("VisibleSheets").ListObject
If Not [DeveloperMode] Then
For Each lc In lo.ListColumns
If lc.Name = ActiveSheet.Name Then
For Each ws In ActiveWorkbook.Worksheets
Set vMatch = Nothing 'Reset from last pass
vMatch = Application.Match(ws.Name, lo.HeaderRowRange, 0)
If IsError(vMatch) Then 'It's not one of our main sheets
Set vMatch = Nothing 'Reset from last pass
vMatch = Application.Match(ws.Name, lc.Range, 0)
If IsError(vMatch) Then
ws.Visible = xlSheetVeryHidden
Else
ws.Visible = xlSheetVisible
End If
End If
Next ws
End If
Next lc
End If
End Sub
这里的代码片段去指派按Ctrl +的键盘快捷键放在ThisWorkbook模块中按住Shift + d到ToggleDeveloperMode程序,让您可以轻松地模式之间进行切换。 (不要告诉用户该键盘快捷键是什么):
Private Sub Workbook_Open()
Application.OnKey "^+D", "ToggleDeveloperMode"
End Sub
最后,这里的代码触发DisplaySheets程序,也去了的ThisWorkbook模块中:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
DisplaySheets
End Sub
它的工作原理一种享受。这是我看到的时候我又选择各3个父表:
...这是会发生什么,当我使用Ctrl + Shift + d的快捷方式将应用程序置于'开发者'模式,所有表单都被隐藏,包括其上的控件。
我建议给父母标签与我在这里相同的颜色,以便用户更容易理解他们不会改变,无论有选择地出现/消失的其他标签。
如果有可能用户(或您)想要重命名工作表,请使用代号而不是工作表名称。如果你不确定我在说什么,请告诉我。
显然,您正在使用'Worksheet_Activate()'事件来显示或隐藏工作表。但是,此外,您正在使用此事件**激活**另一张表。通过这样做,您(递归)激活该表单的事件'Worksheet_Activate()'。如果Worksheet_Activate()中的表单上还有代码,那么它也会被激活(依此类推)。因此,在激活此代码中的工作表之前,您可能需要添加'Application.EnableEvents = False'。一旦另一张纸被激活,您可以重新启用它:'Application.EnableEvents = True'。 – Ralph
你的实际目标是什么?哪些表应该是可见/隐藏的,什么时候? – user3598756
嗨拉尔夫,我给了它一个去,但它似乎没有工作。第一个标签“输入”继续工作,但第二个“输出”仍然没有。 –