2017-10-03 11 views
1

私はExcel VBAを初めて使用しています。私はウェブ全体で解決策を探してみましたが、同様の問題を見つけることができませんでした。Excel vba条件を満たすまで行を削除

特定の条件に基づいて行を削除し、別の一定の基準が満たされるまで行を削除し続けるマクロを作成しようとしています。

などです。以下の表に、IはコルA = 1及びコルC <> 0

A | B | C 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
2 | TC | 1 
-----|-----|----- 
1 | TC | 0 
-----|-----|----- 
2 | TC | 2 
-----|-----|----- 
3 | TC | 1 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
1 | TC | 0 
-----|-----|----- 
1 | TC | 1 
-----|-----|----- 
2 | TC | 0 
-----|-----|----- 
3 | TC | 2 
UNTILコルA = 1 ANDコルC = 0、およびその行 下行を削除継続行を削除したいです

だからマクロの最終結果は次のようになります理想的

A | B | C 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
2 | TC | 1 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
1 | TC | 1 
-----|-----|----- 
2 | TC | 0 
-----|-----|----- 
3 | TC | 2 

、IはコルA = 2行を削除し、コルC = 0となるまで、その行の下の行を削除して再びループにこれを希望Col A = 2およびCol C <> 0

以下は、私が覚えているマクロです。すべての提案に開放され、学びたいと熱望しています。

Sub deleterow() 

Range("C2").Select 
Do Until ActiveCell.Offset(0, -2) = "1" And ActiveCell.Value <> "0" 
If ActiveCell.Value = "0" And ActiveCell.Offset(0, -2) = "1" Then 
Rows(ActiveCell.Row & ":" & Rows.Count).Delete 
End If 
Loop 

End Sub 

お楽しみに!

は、基準が満たされているので

答えて

0

あなたのループは、最初の行で停止していただきありがとうございます。したがって、以下のコードは、最初の行から最後の行までループして、基準を検索します。

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1) 'Set the first worksheet to work 
Dim n As Long, i As Long 
Dim rng As Range, new_rng As Range 

lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 'lastrow number 
For n = 1 To 2 'Criteria is Col A = 1 To 2 
    For i = 1 To lastrow 'Loop from 1 to last row 
     If ws.Cells(i, 1) = n And ws.Cells(i, 3) = 0 Then 
      If rng Is Nothing Then Set rng = ws.Range("A" & i) 'Set first Range so Union won't give an error 
      Set new_rng = ws.Range("A" & i) 
      Set rng = Union(rng, new_rng) 'create a non contiguous range to delete 
     End If 
    Next i 
Next n 

rng.EntireRow.Delete 

シートが大きい場合、それは最適な方法ではないことに留意されたいです。コードのパフォーマンスを向上させる最善の方法があります。ループが使用されたのは、OPによって試された方法だったからです。

もう1つの方法は、マルチレートをフィルタリングして、表示された行を削除することです。

+0

私はこれで非常に新しいので、事前に謝罪します。私は上記のコードを適用しようとしましたが、うまくいかないようです。私はあなたのコードを見直しています。私は理解しているかどうかわかりません。私はコードのコンセプトを理解していると思いますが、私はそれの特定の行を把握することはできません。なぜそれは "rngは何も設定されていない" ..ですか? 「rngが何も設定されていないのであれば」ではないでしょうか?そして私はライン "rng = Union(rng、new_rng)"を理解していません。 rngを自分自身と新しいrngの連合とどのように等しくすることが可能ですか? –

+0

また、この特定の問題に対してフィルタと削除メソッドがどのように機能するかはわかりません。マクロは、条件が満たされるまで削除を続行する必要があるためです。しかし、私はそれが動作する限り、任意のソリューションに開放されています。 –

+0

連合は、Range( "B1:B5"、 "C42:C65"、 "Z300") 'のように連続しない範囲を作成するために使用されるため、deleteを使ってすべてを削除できます。削除操作は遅いので、削除を1回だけ行うと、その操作を行うのにかかる時間が最適化されます。そして 'もしrngが何もないならば、rng = ws.Range(" A "&i)'はUnionを使うために使われます。なぜなら、2つの範囲がなければUnionはエラーを出します。したがって、最初の範囲(rngが空でも何もない場合)では、 'rng = new_rng = ws.Range(" A "&i)' – danieltakeshi

関連する問題