3

文字列を調べて最後の2文字が「XX」に等しいかどうかを判断するマクロを実行しようとしています。次に、行全体を削除します。

以下で強調表示されているオブジェクトエラーが発生します。

Sub Oval2_Click()


Last = Cells(Rows.Count, "E").End(xlUp).Row

For i = Last To 1 Step -1

`If (Right(Cells(i, "E"), 2).Value) = "TZ" Then`

    Cells(i, "E").EntireRow.Delete

End If
Next i

End Sub

助けてください!ありがとうございました。

4

5 に答える 5

5

から削除.ValueRight(Cells(i, "E"), 2).Valueます。関数.Valueに存在しないので文句を言っています Right

于 2013-01-09T21:18:31.217 に答える
4

あなたはすでにあなたの答えを持っていますが、私はこれを達成するためにループすることをお勧めしません。行数が多い場合、ループは遅くなります。これは比較的非常に高速な代替手段です。また、コードを理解するのに問題がないように、コードにコメントを付けました...

ロジック

  1. Autofilterを使用して、「XX」で終わるデータをフィルタリングします
  2. フィルタリングされたデータを削除する

コード

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    '~~> Change this to the respective sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        '~~> Remove any filters
        .AutoFilterMode = False

        '~~> Get last row of Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Use autofilter to identify the cells which end in "XX"
        With .Range("A1:A" & lRow)
            .AutoFilter Field:=1, Criteria1:="=*XX"
            '~~> Offset to exclude the header and delete them
            .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With

        '~~> Remove any filters
        .AutoFilterMode = False
    End With
End Sub

スクリーンショット

ここに画像の説明を入力してください

于 2013-01-10T02:45:45.537 に答える
2

これ

If (Right(Cells(i, "E"), 2).Value) = "TZ" Then

おそらく

If Right(Cells(i, "E").Value, 2) = "TZ" Then

これも機能するはずです:

If Right(Cells(i, "E"), 2) = "TZ" Then
于 2013-01-09T21:12:48.493 に答える
0

私はテストしました。これは機能Rangeし、コードの高速化にも使用するため、最速です。

Sub Oval2_Click()

    Dim Rng As Range 
    Dim i As Integer, counter As Integer
    'Please Set Your Range
    Set Rng = Range("E2:E300000")
    i = 1
    For counter =1 To Rng.Rows.Count
    
    If (Right(Rng.Cells(i),2)) = "XX" Then
        Rng.Cells(i).EntireRow.Delete
    Else 
       i = i + 1
    End If

    Next 

End Sub
于 2021-08-09T09:33:32.920 に答える
0

コメントで述べたように、ループを(逆方向に)回転させることをお勧めします。

For counter = To Rng.Rows.Count To 1 Step -1
  If (Right(Rng.Cells(counter),2)) = "XX" Then
      Rng.Cells(counter).EntireRow.Delete
  End If
Next counter
于 2021-08-10T07:27:51.067 に答える