2017-10-11 74 views
1

我有一個包含5個工作表的工作簿:Sheet1,Sheet2,Sheet3,Sheet4,Sheet5。第一張:「Sheet」有一個單元:「C3」,帶有一個下拉菜單,有4個不同的選項:Opt1,Opt2,Opt3,Opt4。 根據在此下拉菜單中選擇的內容,我希望實時將不同的列隱藏在各種工作表中。如果沒有輸入,我不想隱藏任何列。Excel VBA根據另一個工作表中的不同單元格值實時隱藏不同的列

我已經輸入了部分工作的下面的代碼,但我認爲存在一個問題,因爲我選擇了重疊的列來隱藏 - 不完全確定。

此外,我想隱藏特定的行以及下面的列,具體取決於您在下拉菜單中選擇的不同選項。

此外,我將複製在所有Sheets1-5中隱藏相同的列。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Range("C3").Value = "Opt1" Then 
     Sheets("Sheet1").Columns("G:L").EntireColumn.Hidden = True 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("G:L").EntireColumn.Hidden = False 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = False 
    End If 

    If Range("C3").Value = "Opt2" Then 
     Sheets("Sheet1").Columns("B:F").EntireColumn.Hidden = True 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("B:F").EntireColumn.Hidden = False 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = False 
    End If 

    If Range("C3").Value = "Opt3" Then 
     Sheets("Sheet1").Columns("B:M").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("B:M").EntireColumn.Hidden = False 
    End If 

    If Range("C3").Value = "Opt4" Then 
     Sheets("Sheet1").Columns("B:AB").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("B:AB").EntireColumn.Hidden = False 
    End If 

End Sub 
+0

你就可以開始將在範圍內的所有列在子(表( 「工作表Sheet1」)開始被取消隱藏列( 「B:AB」)EntireColumn.Hidden。 = False),然後在你的代碼中只添加if(而不是其他)部分?這意味着只有針對測試條件的指定列將被隱藏。 – QHarr

回答

0

我已經重寫了您的代碼,以便於閱讀和編輯。我的目標是儘可能縮短代碼。我將你的if語句改爲Select Case。它更優雅,我認爲它更快,但不要聽我的話。

一個必須解決的問題是,如果我選擇選項1,然後從選擇OPT2,列選項1仍然會被隱藏。因此,在代碼隱藏任何內容之前,它會自動取消隱藏範圍B:AB中的所有列。

我添加了Case Else以取消隱藏所有列,如果您輸入了除Opt1,Opt2,Opt3或Opt4之外的任何內容。這可以很容易地改變成一個MsgBox,警告用戶輸入的值不正確。 如果您已經限制了用戶的選擇,則可以刪除此行。

守則:

Private Sub Worksheet_Change(ByVal Target As Range) 

    ' Unhide Columns 
    Worksheets("Sheet1").Range("B:AB").EntireColumn.Hidden = False 

    Select Case Worksheets("Sheet1").Range("C3").Value 

     Case "Opt1" 
     Worksheets("Sheet1").Range("G:L,N:T").EntireColumn.Hidden = True 

     Case "Opt2" 
     Worksheets("Sheet1").Range("B:F,N:T").EntireColumn.Hidden = True 

     Case "Opt3" 
     Worksheets("Sheet1").Range("B:M").EntireColumn.Hidden = True 

     Case "Opt4" 
     Worksheets("Sheet1").Range("B:AB").EntireColumn.Hidden = True 

     ' If anything else is entered, the columns will be unhidden. 
     Case Else 
     Worksheets("Sheet1").Range("B:AB").EntireColumn.Hidden = False 

    End Select 

End Sub 
+0

感謝您的幫助EliasWick! – Bonnie

1

繼續我的評論。您可以將整個範圍的列定義爲一個變量,例如wholeRange並將其設置爲在每個工作表更改開始時不隱藏。

添加對範圍的完全限定引用,即ThisWorkbook.Sheets(「Sheet1」)或ws(作爲下面顯示的變量)。

因爲一切都在開始時不被隱藏每個If語句都不需要Else。這可能是出現混淆的地方。

當您根據不同的期望值測試單個單元格的值時,更改爲Select case語句。

將您隱藏的單獨行列範圍合併到一行代碼中,例如

Sheets("Sheet1").Columns("G:L").EntireColumn.Hidden = True 
Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = True 

變爲:然後

ws.Range("G:L,N:T").EntireColumn.Hidden = True 

你的代碼將如下所示:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim entireRange As Range 
    Set wb = ThisWorkbook 
    Set ws = wb.Sheets("Sheet1") 
    Set entireRange = ws.Columns("B:AB") 

    entireRange.EntireColumn.Hidden = False 

    Select Case ws.Range("C3") 'Test the value of C3 

     Case "Opt1" 
      ws.Range("G:L,N:T").EntireColumn.Hidden = True 

     Case "Opt2" 
      ws.Range("B:F,N:T").EntireColumn.Hidden = True 

     Case "Opt3" 
      ws.Range("B:M").EntireColumn.Hidden = True 

     Case "Opt4" 
      entireRange.Hidden = True 

    End Select 
End Sub 

這將是更容易在那裏的東西都被隱藏或取消隱藏條款進行調試。

+0

謝謝這麼多QHarr!我最終使用了你的代碼的邏輯。我將每張表單設置爲單獨的ws1,ws2等,然後爲每個表單定義範圍。謝謝您的幫助!! :) – Bonnie

相關問題