2

私はVBAの初心者であり、次のコードに従って、Ifステートメントで機能する2つのループを作成しようとしました。

Sub Filter()
For Count = Worksheets("STR").Range("A1").End(xlDown).Row To 1 Step -1
    For Counter = 5 To Worksheets("Filter").Range("A5").End(xlDown).Row
    With Worksheets("STR").Range("C" & Count)
        If .Value Like Worksheets("Filter").Range("C" & Counter).Value _
            Or .Value Like Worksheets("Filter").Range("D" & Counter).Value _
            Or .Value Like Worksheets("Filter").Range("E" & Counter).Value _
            Or .Value Like Worksheets("Filter").Range("A" & Counter).Value Then
                Worksheets("STR").Range("D" & Count) = "X"
                'Worksheets("STR").Row("A" & Count).EntireRow.Delete
            Next Counter
        End If
    End With
Next Count
End Sub

ある段階で、クラッシュするまで何度もループすると思います。デバッガーはそれが「EndIf」行であると教えてくれますが、何が悪いのかわかりません。これを簡単にする方法はありますか?

前もって感謝します!

4

1 に答える 1

2

4つのこと

  1. コードをインデントします。@barrowcが提案したように、エラーを起こさないようにします。
  2. End(xlDown)最後の行を見つけるために使用しないことをお勧めします。最後の行を見つける方法については、このリンクを参照してください。
  3. FalseScreenUpdatingに設定し、オンに戻します。
  4. エラー処理を使用する

上記の 4 つの提案を適用した後のコードは、次のようになります。

Option Explicit

Sub Filter()
    Dim LastRowSTR As Long, LastRowFilter As Long
    
    On Error GoTo Whoa
    
    Application.ScreenUpdating = False
    
    With Sheets("STR")
        LastRowSTR = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    With Sheets("Filter")
        LastRowFilter = .Range("A" & .Rows.Count).End(xlUp).Row
    End With
    
    For Count = LastRowSTR To 1 Step -1
        For Counter = 5 To LastRowFilter
            With Worksheets("STR").Range("C" & Count)
                If .Value Like Worksheets("Filter").Range("C" & Counter).Value _
                Or .Value Like Worksheets("Filter").Range("D" & Counter).Value _
                Or .Value Like Worksheets("Filter").Range("E" & Counter).Value _
                Or .Value Like Worksheets("Filter").Range("A" & Counter).Value Then
                    Worksheets("STR").Range("D" & Count) = "X"
                    'Worksheets("STR").Row("A" & Count).EntireRow.Delete
                End If
            End With
        Next Counter
    Next Count
LetsContinue:
    Application.ScreenUpdating = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

興味深い読み物。

トピック: 「Err」するのは人間です

リンク: http://siddharthrout.wordpress.com/2011/08/01/to-err-is-human/

于 2012-08-13T21:31:53.303 に答える