2016-08-20 276 views
0

我正在開發一個項目,以最大限度地減少任何時候在Excel工作簿中可見的工作表數量。我正在嘗試創建一個父表(用作切換按鈕)來顯示/隱藏子表。例如,我在工作簿中有6個工作表:輸入,輸入1和輸入2,輸出,輸出1 &輸出2.輸入和輸出將激活時切換隱藏並取消隱藏其他工作表。我創建了2個工作表級別的子函數來嘗試並執行此操作。第一個很好,但另一個只有在第一個被激活並再次隱藏時纔有效。任何建議,更好的方式來做到這一點會很好。我不知道爲什麼excel已經沒有這個功能。我嘗試使用數組,但這似乎不起作用。我認爲你需要單獨取消隱藏每個標籤。Excel VBA工作表事件在隱藏/取消隱藏之間切換

'1. Inputs: 

Private Sub Worksheet_Activate() 

On Error Resume Next 
Sheets("Input 1").Visible = True = Not Sheets("Input 1").Visible = True 
Sheets("Input 2").Visible = True = Not Sheets("Input 2").Visible = True 
Sheets("Input 1").Activate 'needed to deactivate inputs sheet 

End Sub 

'2. Outputs 

Private Sub Worksheet_Activate() 

On Error Resume Next 
Sheets("Output 1").Visible = True = Not Sheets("Output 1").Visible = True 
Sheets("Output 2").Visible = True = Not Sheets("Output 2").Visible = True 
Sheets("Output 1").Activate 'needed to deactivate Outputs sheet 

End Sub 
+0

顯然,您正在使用'Worksheet_Activate()'事件來顯示或隱藏工作表。但是,此外,您正在使用此事件**激活**另一張表。通過這樣做,您(遞歸)激活該表單的事件'Worksheet_Activate()'。如果Worksheet_Activate()中的表單上還有代碼,那麼它也會被激活(依此類推)。因此,在激活此代碼中的工作表之前,您可能需要添加'Application.EnableEvents = False'。一旦另一張紙被激活,您可以重新啓用它:'Application.EnableEvents = True'。 – Ralph

+0

你的實際目標是什麼?哪些表應該是可見/隱藏的,什麼時候? – user3598756

+0

嗨拉爾夫,我給了它一個去,但它似乎沒有工作。第一個標籤「輸入」繼續工作,但第二個「輸出」仍然沒有。 –

回答

0

按照user3598756,這個問題可能需要一些澄清,但它聽起來像你試圖仿效類似這樣的行爲:

Action    Visible Worksheet 
------    ----------------- 
Open Workbook  [Input], [Output] 
Activate [Input] [Input], [Output], [Input1], [Input2] ' (shows InputX) 
Activate [Input1] [Input], [Output], [Input1], [Input2] ' (no change) 
Activate [Output] [Input], [Output], [Output1], [Output2] ' (hides InputX, shows OutputX) 

這使得[Input][Output]你唯一的網關工作表,所以以下[Input](以及[Output]的逆向)將實現此目的。

Private Sub Worksheet_Activate() 
    Sheets("Input 1").Visible = True 
    Sheets("Input 2").Visible = True 
    Sheets("Output 1").Visible = False 
    Sheets("Output 2").Visible = False 
End Sub 

注意事項使用On Error Resume Next除非你有特殊原因,

  1. 避免。如果你的代碼有什麼錯誤,你的代碼就會停下來,這樣做通常是件好事,而不是把它的小祕密保留在自己身上,而讓你更聰明。

  2. .Visible屬性本身是Boolean,所以條件.Visible = True等於僅使用.Visible本身。您的.Visible聲明可能不會解決您的意圖。每一行中只有一個=將爲分配運算符,其他將爲等於檢查。在沒有括號的情況下,這將是你的第一個=,而其他的=將一步一步地等於檢查從右到左工作。這是運營商優先在工作。凡我所相信的目的是

    Sheets("Input 1").Visible = True = Not Sheets("Input 1").Visible = True 
    Sheets("Input 1").Visible = True = Not     <True> = True 
    Sheets("Input 1").Visible = True = Not      <True> 
    Sheets("Input 1").Visible = True = <False> 
    Sheets("Input 1").Visible = <False> 
    

關於最後一點,說片輸入1是可見的,你的第一行會解決

Sheets("Input 1").Visible = Not Sheets("Input 1").Visible ' i.e. toggle my visibility 

這些事情可能很難與布爾變量相提並論,因爲即使您的邏輯錯誤,結果可能是「一半」的時間。

+0

感謝您的回覆。這會起作用,但隨着我的工作表變得更加複雜,即我有第三個「網關」(如進程),我需要添加所有不希望看到的工作表。我寧願只從「父」工作表管理這個,並將其作爲一個切換按鈕。另一個原因是,如果有15個左右不同的輸入,我將無法在不滾動的情況下看到輸出選項卡。它是一個很好的替代解決方案。你會如何將我的論點放在括號內? –

+0

我明白了爲什麼你重新激活非父母表單。如果您的問題之一是維護代碼無處不在,也許您可​​以在工作簿本身的單個「Workbook_SheetActivate」事件上統一所有「父」工作表的所有功能? (我會更新答案以展開'='事物)。 – Jon

+0

我想出了一個可行的解決方案。見下面 –

0

我已經設法完成了這項工作。當「Input 1」工作表被激活和隱藏時,嘗試使用「Outputs」Private Sub Worksheet_Activate()函數時遇到了問題。我添加了另一個名爲「Main」的選項卡來替換此選項卡,因此在功能激活後,「Main」將始終爲活動選項卡。這樣可以解決這個問題,但如果在瀏覽每個「文件夾」中的內容時,重點不會圍繞工作簿跳過,那將會更好。這裏是更新的代碼...

'Inputs "Parent folder" sheet 
Private Sub Worksheet_Activate() 


On Error Resume Next 
Sheets("Input 1").Visible = True = Not Sheets("Input 1").Visible = True 
Sheets("Input 2").Visible = True = Not Sheets("Input 2").Visible = True 
**Sheets("Main").Activate** 'needed to deactivate Inputs sheet 


End Sub 

'Outputs "Parent folder" sheet 
Private Sub Worksheet_Activate() 


On Error Resume Next 
Sheets("Output 1").Visible = True = Not Sheets("Output 1").Visible = True 
Sheets("Output 2").Visible = True = Not Sheets("Output 2").Visible = True 
**Sheets("Main").Activate** 'needed to deactivate Outputs sheet 


End Sub 

我認爲這是一個很好的方式來簡化帶有可能標籤的工作簿。它可以明顯改進,所以期待聽到任何建議。

這裏是我的工作文件的鏈接

https://1drv.ms/x/s!AvtNNMCst1bIgxjCBCemZlCerHMo

0

下面就以一個文件的鏈接,你可以從onedrive下載:

https://1drv.ms/x/s!Ah_zTnaUo4DzjhWzQ3OTq9tq1APC

而非硬代碼應該發生什麼當選擇每個工作表時,我在「控件」工作表上使用了一個ListObject(即Excel表)來存儲「父」工作表與其各個「子」之間的關係。代碼簡單地檢查這個ListObject,看看哪些孩子屬於哪個父母,然後相應地採取行動。這有助於讓不理解VBA的人輕鬆添加或修改需要的父/子表單關係,從而使其變得非常容易。

我也實現了一個'開發人員'模式,其中表單隱藏不會發生。沒有什麼比試圖在僅將'用戶'視爲'用戶'的應用程序上進行開發更令人沮喪的了:您可以使用鍵盤快捷鍵Ctrl + Shift + D(D for Developer)在「用戶」和「開發者」模式之間切換)。

下面是我剛纔放在一起的示例文件的外觀。我已經添加了如下所示爲一個名爲「控件」的新表中的ListObject,並給予的ListObject「VisibleSheets」的名字: Controls

我還添加了名爲DeveloperMode命名區域,與真值: Name Manager

下面是切換「用戶」模式和「開發者」模式的應用程序的代碼,即進入在標準代碼模塊:

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個父表: Inputs

Outputs

Throughputs

...這是會發生什麼,當我使用Ctrl + Shift + d的快捷方式將應用程序置於'開發者'模式,所有表單都被隱藏,包括其上的控件。 Controls

我建議給父母標籤與我在這裏相同的顏色,以便用戶更容易理解他們不會改變,無論有選擇地出現/消失的其他標籤。

如果有可能用戶(或您)想要重命名工作表,請使用代號而不是工作表名稱。如果你不確定我在說什麼,請告訴我。

+0

感謝您的答案。我快速瀏覽了一下,但無法在我的Mac上運行。由於我主要在工作中使用excel,所以在這裏我不太熟悉它,這是我的錯。明天下班後我會看看。歡呼關於添加文件的提示。我編輯了我的答案,包括一個鏈接到我的工作文件。它工作正常,雖然需要通過代碼手動添加頁面,並且一旦打開/關閉「文件夾」,它將始終恢復爲「主」頁面。然而,我更擔心的是,如果表單被隱藏,但是還沒有進行測試和實現,一些舊的宏不起作用。感謝你的迴應。 –

+0

我剛剛從onedrive上重新下載了它,它似乎沒有像原來那樣工作,所以它可能是一個onedrive問題。 –