2017-08-19 10 views
2

別のモジュールで生成されたテーブルを検索し、文字列"REPAIR_RTS"を含まない行を削除しようとしています。私はこのサイトからいくつかの方法を試しましたが、検索値を"REPAIR_RTS"(CASE ...という行)に変更するたびに型の不一致が発生します。文字列を含まない行を削除する

以下は私の最近の試みです。

Public Sub Test() 
lastRow = Range("D65000").End(xlUp).row 
For i = lastRow To 2 Step -1 
Select Case Cells(i, 4).Value 
    Case "REPAIR_RTS" 
     'Do nothing 
    Case Else 
     Cells(i, 8).EntireRow.Delete 
End Select 
Next i 
End Sub 

私はまだVBAに新しいので、私はこれをトラブルシューティングするのが非常に困難です。私は他の方法にもオープンしています。最初のアナリストの仕事を続けるうちに、新しい方法を素早く学びたいと思っています。

+0

これを実行する予定のワークシートをご存知ですか? – Jeeped

+0

フレーズ* ''を含まない行 '*は曖昧です。それは、セル全体の値または長い文字列の一部であることを意味しますか? – Jeeped

+0

クラッシュすると、 'Cells(i、4).Value'の値は何ですか?それは 'Error 2007'や' Error 2042'のようなエラー値ですか? (つまり、D列に '#N/A'、'#DIV/0! 'などの値がありますか?) – YowE3K

答えて

1

エラー値(#N/Aなど)を文字列と比較することはできません。つまり、「タイプの不一致」エラーが発生しています。次いで

この周りの最も簡単な方法は、最初のエラーをテストすることであり、それはエラーでない場合に特定の文字列の検査を続行:

Public Sub Test() 
    Dim lastRow As Long 
    Dim i As Long 
    With Worksheets("Chargable Vendors") 
     lastRow = .Cells(.Rows.Count, "D").End(xlUp).row 
     For i = lastRow To 2 Step -1 
      If IsError(.Cells(i, 4).Value) Then 
       .Rows(i).Delete 
      Else 
       Select Case .Cells(i, 4).Value 
        Case "REPAIR_RTS" 
         'Do nothing 
        Case Else 
         .Rows(i).Delete 
       End Select 
      End If 
     Next i 
    End With 
End Sub 

を代替内に含まれることであろうSelect Caseステートメント、各エラー値の特定のテストより前に文字列のテスト

Select Case .Cells(i, 4).Value 
    Case CVErr(xlErrNA), CVErr(xlErrDiv0), CVErr(xlErrName), CVErr(xlErrValue) 'etc 
     .Rows(i).Delete 
    Case "REPAIR_RTS" 
     'Do nothing 
    Case Else 
     .Rows(i).Delete 
End Select 

IsErrorはすべてをテストする方が簡単です。


注:

これはまたSelect Caseの文ではなく、If文で行うことができる:

Public Sub Test() 
    Dim lastRow As Long 
    Dim i As Long 
    With Worksheets("Chargable Vendors") 
     lastRow = .Cells(.Rows.Count, "D").End(xlUp).row 
     For i = lastRow To 2 Step -1 
      If IsError(.Cells(i, 4).Value) Then 
       .Rows(i).Delete 
      ElseIf .Cells(i, 4).Value <> "REPAIR_RTS" Then 
       .Rows(i).Delete 
      End If 
     Next i 
    End With 
End Sub 
3

The simplest way around this is to test for errors first...

errは...ありません。

Cells(i, 4).ValueCells(i, 4).Textに変更するだけです。

まだ、.Textは表示されている内容を正確に返すため、痛みを伴う可能性があります。

Cells(i, 4).ValueからCStr(Cells(i, 4).Value)への変更がそれほど簡単ではありません。しかし、それはあなたが望むものを正確に行うべきです。

まだ質問がある場合は、D

+1

私は毎日何か新しいことを学びます! (私は 'CStr(CVErr(xlErrNA))'が型不一致エラーを出すことを期待していました) – YowE3K

+0

ありがとう、これは完全に動作します! – MGorecki

関連する問題