web-dev-qa-db-ja.com

セル値に基づいて行全体を削除する

Excel(2003)で、インポートしたデータダンプを取得して、レポートにフォーマット設定したい。私が行ったことのほとんどは、マクロを記録し、必要に応じてコードをカスタマイズすることです。純粋なコードを必要とするスポットがあります。

発生のタイプをリストするSORTED列(D)があります(たとえば、車両の火災、脳卒中、動物の咬傷など)。列Dの各値を読み取り、探しているいくつかの値の1つではない場合は、行全体を削除します。

複数のバージョンのコード(オンラインで見つけたもの)を試しましたが、必要な結果に最も近い結果を生成するコードは次のようになります。

Range("D:D").Select
Dim workrange As Range
Dim cell As Range
Set workrange = Intersect(Selection, ActiveSheet.UsedRange)
For Each cell In workrange
    If ActiveCell.Value <> "VFIRE" _
        And ActiveCell.Value <> "ILBURN" _
        And ActiveCell.Value <> "SMOKEA" _
        And ActiveCell.Value <> "ST3" _
        And ActiveCell.Value <> "TA1PED" _
        And ActiveCell.Value <> "UN1" _
            Then ActiveCell.EntireRow.Delete
Next cell
End Sub

このコードはリストの大部分(元の168の〜100行)を削除しますが、必要なものの最初の値に達するまで行を削除するだけです。たとえば、この現在のデータダンプには "ILBURN"または "SMOKEA"の値はありませんが、 "ST3"が最初に発生するとマクロは停止します。エラーは発生していませんが、実行されたと考えているようです。

リスト全体でマクロを呼び出すには、何を追加すればよいですか?

5
user3613124

私は簡潔さについてすべてです。

Sub DeleteRowBasedOnCriteria()
Dim RowToTest As Long

For RowToTest = Cells(Rows.Count, 4).End(xlUp).Row To 2 Step -1

With Cells(RowToTest, 4)
    If .Value <> "VFIRE" _
    And .Value <> "ILBURN" _
    And .Value <> "SMOKEA" _
    And .Value <> "ST3" _
    And .Value <> "TA1PED" _
    And .Value <> "UN1" _
    Then _
    Rows(RowToTest).EntireRow.Delete
End With

Next RowToTest

End Sub
5
tbur

私は@Tim_Williamsに同意します。それは問題のように見えるので、逆方向に作業する必要があるということです。私はこのようなことをします。

Sub Main()
Dim workrange As Range
Dim Firstrow As Integer
Dim Lastrow As Integer
Dim lrow As Integer

'Find first and last used row in column D
Range("D:D").Select
Firstrow = ActiveSheet.UsedRange.Cells(1).Row
Lastrow = ActiveSheet.Range("D1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp).Row

'Loop through used cells backwards and delete if needed
For lrow = Lastrow To Firstrow Step -1
    Set workrange = Cells(lrow, 4)
    If workrange.Value <> "VFIRE" _
        And workrange.Value <> "ILBURN" _
        And workrange.Value <> "SMOKEA" _
        And workrange.Value <> "ST3" _
        And workrange.Value <> "TA1PED" _
        And workrange.Value <> "UN1" _
            Then workrange.EntireRow.Delete

Next lrow

End Sub
0
Adach1979

これを自分のタスクの1つで使用しました。100回の反復のテストデータの配列があり、最初の10回の反復にトリミングしたいので、「iteration#> 10」セルを使用して行全体を削除しました。

Sub trim_row()

' trim_row Macro
' to trim row which is greater than iteration#10

Dim RowToTest As Long
Dim temp As String
Dim temp1 As Integer

For RowToTest = Cells(Rows.Count, 6).End(xlUp).Row To 2 Step -1

With Cells(RowToTest, 6)

temp = .Value
If temp = "" Then

    Else
    temp1 = Trim(Replace(temp, "Iteration# :: ", ""))

        If temp1 > 10 Then
        Rows(RowToTest).EntireRow.Delete
        End If
End If

End With

Next RowToTest

End Sub

文字列から数値を抽出するためにユーザーが置換とトリップを行い、空の行をスキップするためにif = ""条件を導入しました。テストデータのセットを区切る空の行がありました。

0
mdkarthikeyan