Excel VBA で複数の行を非表示にする

Excel VBA で複数の行を非表示にする

列 A に値「xx」を含むすべての行を非表示にし、列 A に値「a」を含む行は非表示にしないようにします。範囲は A8:A556 です。このマクロは、セル C4 の変更によってトリガーされる必要があります。

なぜ機能しないのか、何か考えはありますか? 現在の試みは次のとおりです:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(True, True) = "$C$4" Then

    If Range("A8:A555").Value = "xx" Then
        Rows("8:555").EntireRow.Hidden = True
    ElseIf Range("A8:A555").Value = "a" Then
        Rows("8:555").EntireRow.Hidden = False

     End If
   End If

End Sub

ありがとう!

編集:

Fixer1234さん、詳細は次のとおりです。

  • マクロが正しく動作する場合、「xx」と「a」は一緒に存在しない可能性があります。
  • 非表示にする必要があるのは「xx」行のみです
  • 「xx」値は、非表示にできない値と組み合わせられていません。
  • 「a」値は、非表示にする必要がある値と組み合わせられません。
  • 「xx」または「a」を含まない他の行は非表示にする必要はありません (これらの列に「a」を追加するか、IfElse を完全に削除する必要がありますか?)。
  • 「xx」行には他の数式が含まれており、数式の結果が空白の場合は行を非表示にする必要があることを意味します。
  • 「a」行は同じ式を持ちますが、結果を生成するため、非表示にすることはできません。

実行時エラー '13': 型の不一致が発生し、デバッグは最初の If Range("A8:A555").Value = "xx" Then

答え1

を使用して範囲内のすべての値をテストすることはできませんRange("A8:A555").Value = "xx"。型の不一致エラーが発生します。

範囲内の各セルをループし、それがValue「xx」に等しいかどうかを個別にテストする必要があります。

コードの実行速度を上げるには、行が検出されるたびに非表示にするのではなく、非表示にする行をまとめてRangeからRanges、一度にすべてを非表示にします。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cel As Range
Dim RangeToHide As Range

    'Test if Target is C4
    If Not Intersect(Target, [C4]) Is Nothing Then
        'Loop through each cell in range and test if it's "xx"
        For Each cel In Range("A8:A555")
            If cel = "xx" Then
                If RangeToHide Is Nothing Then
                    'Initialise RangeToHide because Union requires at least 2 ranges
                    Set RangeToHide = cel
                Else
                    'Add cel to RangeToHide
                    Set RangeToHide = Union(RangeToHide, cel)
                End If
            End If
        Next
        RangeToHide.EntireRow.Hidden = True
    End If
End Sub

答え2

この VBA コードを標準モジュールとして使用すると、列にまたはXXのいずれかがあるすべての行を非表示にするのに役立ちます。xxA

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(True, True) = "$C$4" Then

Dim i As Integer
  Application.ScreenUpdating = False



    For i = 8 To 255

    If Sheets("Sheet1").Range("A" & i).Value = "XX" Or Sheets("Sheet1").Range("A" & i).Value = "xx" Then
    Rows(i & ":" & i).EntireRow.Hidden = True
    End If


    Next i
    End If

    Application.ScreenUpdating = True


End Sub

注意

aまたはを持つ行は既に表示されているため、それらの行を再表示するためのコードを使用する必要はありませんA。そして何よりも、使用されるコードは列 内の特定の行を非表示にしますA

答え3

別々の行を非表示にするにはどうすればいいでしょうか?
私の考えはこうです:

Private Sub CheckBox1_Click()
If CheckBox1 = False Then
    [15:15].EntireRow.Hidden = True
    [3:3].EntireRow.Hidden = True
Else
    [15:15].EntireRow.Hidden = False
    [3:3].EntireRow.Hidden = False
End If

よろしくお願いいたします
マティアス

関連情報