0

VBA に関していくつか質問がありますが、ご回答いただけると幸いです。私は VBA を初めて使用するコーダーです。

目的- 「valueRange」に同様の値が見つかった場合、「cellRange」からすべての行を削除します

ここまでのコード

Sub DeleteRows()

Set valueRange = Worksheets("Delete Rows").Range("A4:A65000")
Set cellRange = Worksheets("Load File").Columns(Worksheets("Delete Rows").Range("F1").Value)

For Each Cel In cellRange.Cells
    For Each Value In valueRange.Cells
        If Cel.Value = Value.Value Then
            Cel.EntireRow.Delete
        End If
    Next Value
Next Cel
End Sub

問題 1: valueRange に常に 65000 行すべてが入力されているわけではありません。範囲がA4の範囲のみを取得するようにするにはどうすればよいですか:(空の列に到達するまで)

問題 2:問題 1 と同様ですが、cellRange

問題 3:行が削除されるたびに、範囲の設定方法に影響するようです。つまり、行 #10 を削除すると、ループは行 #10 を再度チェックせずに行 #11 に移動します。ルックに 2 回目のパスを実行するか、ファイルをもう一度確認するように指示するにはどうすればよいですか。

4

3 に答える 3

2

P1: ここに 2 つのオプション
a) Cel.Value が空の場合、Exit For
b) 適切な範囲の選択については、この男を参照してください: Excel: セルが空になるまですべての行を選択する

P2: 同上

P3: For-Each は「後方」に移動できないため、実行できる最善の方法は次のとおりです。
行を削除せずに、代わりにその番号を Long 配列などに保存してから、For-Next を追加して「マークされた」を削除します。次のような行:

For x = UBound(myLongArray)-1 To 0 Step -1
    cel(x).EntireRow.Delete
Next x

b) For-Each の代わりに、行数を (ROWS関数を介して) 変数に格納し、「Step -1」ループで行を調べます。

于 2013-04-19T13:56:23.197 に答える
1

他の人が言及しているように、削除するときは後退する必要があります。

また、ValueRange の各セルに対する不要な反復を避けるように変更し、代わりにMatch()関数を使用して にCel.Value存在するかどうかを確認しましたValueRange

Sub DeleteRows()
Dim r as Long
Dim valueRange as Range, cellRange as Range
Dim Cel as Range

Set valueRange = Worksheets("Delete Rows").Range("A4:A65000").End(xlUp) '<~~ Get the last unused row
Set cellRange = Worksheets("Load File").Columns(Worksheets("Delete Rows").Range("F1").Value)

For r = cellRange.Cells.Count to 1 Step -1  '<~~ When deleting rows you must step backwards through the range to avoid the error you are encountering.'
    Set Cel = cellRange.Cells(r)

    'Check to see if Cel.Value exists in the ValueRange using the "Match" function'
    If Not IsError(Application.Match(Cel.Value,ValueRange,False) Then
        Cel.EntireRow.Delete
    End If
Next r
End Sub
于 2013-04-19T13:57:08.547 に答える