単一のセル値に基づいて行を非表示/再表示する VBA コード

単一のセル値に基づいて行を非表示/再表示する VBA コード

コードが機能しない理由がよくわかりません。基本的に、セル B5 には「calc_1」と「calc_2」の 2 つのオプションがあり、ユーザーはドロップダウンから選択できます。

calc_1 が選択されている場合は 6 行目から 29 行目を表示し、30 行目から 53 行目を非表示にし、calc_2 の場合はその逆になるようにします。以下は私が書いたコードです。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Range("B5").Value = "calc_1" Then
        Rows("6:29").EntireRow.Hidden = False
        Rows("30:53").EntireRow.Hidden = True
        

    ElseIf Range("B5").Value = "calc_2" Then
        Rows("6:29").EntireRow.Hidden = True
        Rows("30:53").EntireRow.Hidden = False

    End If

End Sub

このコードを実行すると、どの選択をしても 6 行目から 29 行目までしか表示されません。何が足りないのかわかりません。

答え1

ワークシートの変更と交差

  • コードはワークシートが変更されるたびに実行されていました。セルに変更があった場合にのみ実行されるように制限する必要がありますB5...

    If not Intersect(Range("B5"), Target) Is Nothing Then
        ' do your stuff
    End If
    

    ...またはコードのように:

    If Intersect(Range("B5"), Target) Is Nothing Then Exit Sub
    
    ' do your stuff
    
  • harrymc がコメントで述べたように、この場合 EntireRow は冗長です。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim iCell As Range: Set iCell = Intersect(Range("B5"), Target)
    If iCell Is Nothing Then Exit Sub
    
    If iCell.Value = "calc_1" Then
        Rows("6:29").Hidden = False
        Rows("30:53").Hidden = True
    ElseIf iCell.Value = "calc_2" Then
        Rows("6:29").Hidden = True
        Rows("30:53").Hidden = False
    'Else ' do nothing
    End If

End Sub

オプションで、Select Caseの代わりにを使用することもできますIf ElseIf

Select Case iCell.Value
Case "calc_1"
    Rows("6:29").Hidden = False
    Rows("30:53").Hidden = True
Case "calc_2"
    Rows("6:29").Hidden = True
    Rows("30:53").Hidden = False
'Case Else ' do nothing
End Select

関連情報