2017-10-11 14 views
1

Sheet1、Sheet2、Sheet3、Sheet4、Sheet5の5枚のブックがあります。最初のシート: "シート"にはセルがあります: "C3"にはドロップダウンメニューがあり、Opt1、Opt2、Opt3、Opt4の4つのオプションがあります。 このドロップダウンメニューで選択した内容に応じて、さまざまなシートにさまざまな列をリアルタイムで非表示にしたいと考えています。何も入力されなければ、私は列を隠してはいけません。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

を始めることができますが範囲内のすべての列がサブ(シート( "シート1")の開始時に再表示されます列( "B:AB")EntireColumn.Hidden。 = False)、その後、後でコードのif(else以外の部分)だけを追加しますか?これは、テスト条件に対して指定された列のみが非表示になることを意味します。 – QHarr

答えて

0

私はあなたのコードを読みやすく、編集しやすいように書き直しました。私の目標は、できるだけコードを短くすることでした。 if文をSelect Caseに変更しました。より洗練されていると思いますが、それは速いと思いますが、私の言葉はそれを受けません。

取り組まなければならなかった問題は、私はOPT1を選択し、OPT2を選択した場合、OPT1から列がまだ隠されてしまうということでした。コードが何かを隠す前に、自動的に範囲B:AB内のすべての列が表示されます。

Opt1、Opt2、Opt3、またはOpt4以外のものを入力した場合は、Case Elseを追加してすべての列を再表示しました。これは、入力された値が間違っていることをユーザーに警告する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は必要ありません。おそらく、混乱が起こる場所です。

異なる期待値に対して1つのセルの値をテストする場合は、Select caseステートメントに変更します。

1行に隠れている別の行の列範囲を組み合わせます。

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

関連する問題