VBA:

2012-04-09 18 views
4

私は列AここVBA:

に「真」を持つすべての行を削除するマクロを記述しようとしているが、私がこれまで持っているものである特定の値と行の削除:

Sub deleteBlankRows3() 
Dim lastrow as Long 
Dim x as Long 

lastrow = 4650 
For x=8 to x=lastrow 
    If (Range("A1").Offset(x,0) = True) Then 
    Range("A1").Offset(x,0).EntireRow.Delete 
    x = x + 1 
End if 
Next x 

End Sub 

何が間違っているのかわかりません!

答えて

4

ここでは3つのことが行われている可能性があります。あなたが基本となる値を同値のためにテストしている場合

まず、あなたは明示的にセルの値を見てする必要があります。

If (Range("A1").Offset(x,0).Value = True) Then 

saying.Valueがなければ、私はデフォルトの戻りによる細胞は、それがためにTextプロパティだと思います範囲外プロパティに対する等価性テスト

第二には、あなたの細胞は、おそらく値ではなくTrueので、あなたのは、実際に終了します、あなたが実際に行を見つけた場合、最後に

If (Range("A1").Offset(x,0).Value = "True") Then 

を使用してみてください、あなたはそれを削除し、「真」の文字列が含まれています(行5は行4になるなど)、でもが増えたので、削除したすべての行の直後に行がスキップされます。

For x=lastrow to 8 step -1 

またはあなただけの行を削除した場合のxをインクリメントしません:あなたはこのようなオフに優れているテストを行わず

If (Range("A1").Offset(x,0).Value = "True") Then 
    Range("A1").Offset(x,0).EntireRow.Delete 
Else 
    x = x + 1 
EndIf 
+0

ありがとう!3つのポイントすべてで、ハハ。 –

2

を:

この、降順のいずれかでループを修正するには
For x=lastrow to 8 step -1 
     If (Range("A1").Offset(x,0) = True) Then 
      Range("A1").Offset(x,0).EntireRow.Delete 
     End if 
    Next 

カウントアップには、1行削除するとすべての行が上に移動した後もループによってすべての行が見えなくなるという問題があります。そして、あなたはxに1を加えるので、あなたはそれをさらに悪化させました。他の問題を引き起こすかもしれない4650 + number_of_deleted_rowsの合計をまだチェックしていれば、-1が良いでしょう。最後から開始し、開始に向かって移動することで、両方の問題を防ぐことができます。

1

問題はアルゴリズムが間違っていることです。破損したループ変数の古典的なケース。問題は、ループが依存している変数が変更されてしまうことです。間違っているためです。

これを行う正しい方法は、この方法です。

Dim x as integer 
x = 8 
do 
    if (Range("a1").Offset(x, 0) = True) Then 
     Range("a1").Offset(x, 0).EntireRow.Delete 
    Else 
     x = x + 1 'We only increase the row number in the loop when we encounter a row that is false for containing true in cell a1 and their offsets 
    End If 
Loop Until (x > 4650) 
+0

申し訳ありませんが、私は私の答えを編集している間に問題が解決されているのを見たことがありませんでした。 – ervinbosenbacher

6

私はあなたが探していたものをすでに持っていると知っています。しかし、ここでも、Autofilterを使用する別の方法があります。これは、各行をループして値をチェックするよりもはるかに高速です。

Sub Sample() 
    Dim lastRow As Long 

    With Sheets("Sheet1") 

     lastRow = .Range("A" & Rows.Count).End(xlUp).Row 

     '~~> Remove any filters 
     .AutoFilterMode = False 

     '~~> Filter, offset(to exclude headers) and delete visible rows 
     With .Range("A1:A" & lastRow) 
      .AutoFilter Field:=1, Criteria1:="TRUE" 
      .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete 
     End With 

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

HTH

+1

+1ループよりずっと良い – brettdj

+0

+1私はbrettdjに同意します –

0

私はラインを隠していたし、フィルタリング方法はありませんどのそれらを再表示したくありませんでした。 また、すべての行をループしたくないので、ここに私の10c .....

Sub DelError() 
    Dim i As Integer 
    Dim rngErrRange As Range 
    With ActiveSheet 
     Do 
      Set rngErrRange = .Columns("A:A").Find(What:="#REF!", _ 
       After:=.Cells(1), LookIn:=xlFormulas, _ 
       LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
       MatchCase:=False, SearchFormat:=False) 
       If Not rngErrRange Is Nothing Then 
        rngErrRange.EntireRow.Delete 
       Else 
        End 
       End If 
     Loop 
    End With 
End Sub