複数のセルに基づいて行を非表示にする

複数のセルに基づいて行を非表示にする

私のデータベースは膨大になってきているので、もう少し管理しやすくしたいと思っています。基本的に私がやろうとしているのは、次のことです。

セル E:E = "完了" の場合は対応する行を
非表示にします。セル F:F = "完了" の場合は同じ/対応する行を非表示にします。

これは年間52週間続き、データに応じて行数は無限になります。

簡単なコードを試してみました:

Private Sub Worksheet_Change(check)

    If Range("E:Z") = Complete Then
        Rows("3:7000").EntireRow.Hidden = True
    Else
        Rows("3:7000").EntireRow.Hidden = False
    End If

これはコンパイルされますが、それ以外にはあまり何も起こりません。

どんな助けでも大歓迎です。

答え1

さて、これを分解してみましょう。

コマンドは行全体と列全体をブロックとして扱いますが、実際には現在のセルを評価しません。VBA のテキスト値は二重引用符で囲む必要があります。そうでない場合、Excel はこれを名前付き変数またはオブジェクトであると想定します。

私の理解では、入力する単語「Complete」を E 列から Z 列まで調べたいということですね。Worksheet_Change イベントは Target、つまり変更されたセルに対して作用します。セルが E 列から Z 列にあるかどうかを確認するには、Target がその範囲と交差しているかどうかを確認します。

Intersect(Target, Range("E:Z"))

このコマンドは範囲オブジェクトを返します。変更されたセルが指定された範囲内にない場合は何も返されません。次のものは二重否定ですが、交差オブジェクトが範囲内にある場合に何かが起こるようにしたいのです。ない何もない。これは次のように書かれている

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
'   do something
End If

次に、ターゲット セルの値が "Complete" であるかどうかを確認します。大文字と小文字を区別しないようにするとよいかもしれません。その場合は、target を で囲むとUCase対応できます。

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        ' some code to hide the row
    End If
End If

行を非表示にするコードでは、対象セルの行番号を取得する必要があります。これは を使用して実行できTarget.Row、その後、使用したものと同様のコマンドに渡すことができますRows()が、対象セルの行に対してのみ使用できます。

Rows(Target.Row).EntireRow.Hidden = True

これまでのコードは

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        Rows(Target.Row).EntireRow.Hidden = True
    End If
End If

End Sub

...これは個々の行に対して機能します。しかし、「Complete」を一度に複数の行にコピーすると、ターゲットには複数の行が含まれるため、コードを調整してそれを反映する必要があります。セルという名前の範囲を宣言し、ターゲット範囲内の各セルをループします。UCaseコマンドとRowsコマンドは、代わりcelTarget

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cel As Range
If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    For Each cel In Target
        If UCase(cel.Value) = "COMPLETE" Then
            Rows(cel.Row).EntireRow.Hidden = True
        End If
    Next cel
End If

End Sub

これで完了です。

関連情報