2011-07-29 28 views
3
Sub main() 
    Dim count As Integer 
    Dim i As Integer 
    count = Range("Q" & Rows.count).End(xlUp).Row 
    MsgBox count 
    For i = 2 To count 
     If Cells(i, "Q").Value = 2 Then 
      Sheets(1).Rows(i).EntireRow.Delete 
     End If 
    Next i 
End Sub 

コードがすぐに機能しないのはなぜですか?私はExcelのVBAコードの上に実行すると、それはいくつかの行を削除してから、このメッセージと一緒に出ています:特定の列に特定の値を持つ行を削除する

run time error 13 

それはどういう意味しますか?時々私はこのメッセージを得る:上記のVBAコードで

type mismatch 

を、私は、そのQ列の値が2であるが、それは働いていない行を削除します。バグがどこにあるのか教えてください。

何が起こっているか教えてください。コードが動作していますが、いくつかの行が削除され、実行時エラー13で中断します。Q列を表示するためにEXCELファイルを開いたとき、Q列の行の一部が#REF!でした。

これが原因だと思いますが、どうすればいいですか?コードを正しく動作させるにはどうすればよいですか?私はそれに1,2値からなるQ列を持っています。その中に2を持つQ列の行を削除する必要があります。つまり、行全体を意味します。

+1

エラーを再現できません。手続きがあなたの質問に止まるときに 'i'の値を編集できますか? – Jacob

+0

テストデータの最後の行にQ列に2がありますか? – James

答えて

1

各行のルーピングは、大きなワークシートに比べて時間がかかることがあります。 findメソッドを使用してみてください。また、画面更新をオフにします。

Sub HTH() 
    Dim rCell As Range 
    Dim strAddress As String 

    Application.ScreenUpdating = False 

    With ActiveSheet.Columns("Q") 
     Set rCell = .Find(What:=2, LookIn:=xlValues, SearchOrder:=xlByColumns) 

     If Not rCell Is Nothing Then 
      Do 
       strAddress = rCell.Address 
       rCell.EntireRow.Delete 
       Set rCell = .FindNext(Range(strAddress)) 
      Loop Until rCell Is Nothing 
     End If 

    End With 

    Application.ScreenUpdating = True 

End Sub 
2

行番号10 == 2の場合、行番号10を削除します。ループの次の反復では、行番号11を調べます。行番号11の行12の値は削除後にシフトアップされます。これは、削除された行のすぐ下の行をスキップすることを意味します。

おそらく、後方にループしたいと思うでしょう。

Sub main() 
    Dim count As Integer 
    Dim i As Integer 
    '//assuming all filled rows from Q2 downwards? 
    count = Range("Q2").End(xlDown).Row 

    For i = count To 2 Step -1 
     If Cells(i, "Q").Value = 2 Then 
      Sheets(1).Rows(i).EntireRow.Delete 
     End If 
    Next i 
End Sub 
+0

後方ループは素晴らしいです。 ^^素敵な答え! – aevanko

関連する問題