私のデータベースは膨大になってきているので、もう少し管理しやすくしたいと思っています。基本的に私がやろうとしているのは、次のことです。
セル 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コマンドは、代わりcel
にTarget
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
これで完了です。