下面就以一個文件的鏈接,你可以從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
嗨拉爾夫,我給了它一個去,但它似乎沒有工作。第一個標籤「輸入」繼續工作,但第二個「輸出」仍然沒有。 –