2017-08-31 5 views
1

私はこの問題をここでの解答で解決したと思っていましたが、まだ削除が必要な2行目を削除するだけです。ループは次のとおりです。ForループのExcel VBAのみ2行おきに削除

For Each row In ActiveSheet.UsedRange.Rows 
    'test for v in cell f and delete if there isn't one 
    str = Cells(row.row, "F").Value 
    Debug.Print "str is " & str 
    If InStr(1, str, "V") <> 0 Then 
     Debug.Print "hello str is " & str 
    Else 
     row.Delete Shift:=xlUp 
    End If 
Next row 

をしかし、私は次の行でそれを実行すると:私はおかしくなりそうだように私は感じ

M1301 PMH 
M1401 Rod Washer 
M1502 Rod Washer 
MV1502 Rod Washer 
MV1503 Rod Washer 

M 1301 
M 1302 
M 1401 
ES 1501 
M 1501 
M 1502 
MV 1502 
M 1503 
MV 1503 

私はで終わります。私はループのカウンタも増分していましたが、それが問題だと思っていましたが、参照行にカウンタを使用するのをやめましたが、まだそれを持っています。

私が想定していることを指摘する助けがあれば、どれも分かりやすいでしょう。

おかげ

+0

あなたの援助を受けた人々にこの時間をフィードバックし、かつ/または信用を与えること。あなたはあなたがここで尋ねた以前の投稿でやっていないし、良い答えを得ました。あなたは答えを「答え」とする方法を知っていますか? –

+0

申し訳ありません - 私は今これを行う方法を理解します! – Madeline

答えて

2

は、以下のコードを試してみてください、私はあなたのオリジナルのロジックの限りを使用しようとしました(それを行うには、簡単かつ短い方法があるにもかかわらず、 )。コメントとしてコード内の

説明、

:一般に、オールウェイズループが後方あなたのケースではObjects、またはRowsを削除します。

コード

Option Explicit 

Sub DeleteV() 

Dim Rng As Range, i As Long, LastRow As Long 
Dim Str As String 

' I would rather use Worksheets("SheetName") instead 
Set Rng = ActiveSheet.UsedRange 

LastRow = Rng.Rows.Count + Rng.Row - 1 ' just in case your range starts from the 2nd row (or 3rd...) 

' allways loop backwards when deleting rows 
For i = LastRow To Rng.Row Step -1 
    'test for v in cell f and delete if there isn't one 
    Str = Cells(i, "F").Value 
    Debug.Print "str is " & Str 

    If InStr(1, Str, "V") <> 0 Then 
     Debug.Print "hello str is " & Str 
    Else 
     Rows(i).Delete 
    End If 
Next i 


End Sub 
+0

ありがとうございます。私はおそらくそれをやるより良い方法があると思っていました。 ActiveSheetではなくWorksheets( "SheetName")を使用する理由を尋ねることはできますか? – Madeline

3

あなたは例の4行目の行row.Delete Shift:=xlUpを削除するので、あなたが行を削除し、その後、次の行(旧行6行5)に行くとき、行5は現在、4行目になります。

あなたの削除の後にRow = Row - 1を置くこともできますし、逆にすることもできます。

For X = range("A" & rows.count).end(xlup).row to 2 step - 1 
    'Do something per row 
    'Delete a row if need be 
Next 

これはあなたにこの問題を解決するためのアイデアを十分に与える必要があります。

+0

ニースの詳細な説明 –

+0

ありがとうございます。終わった後の括弧内のxlupの目的は何ですか? – Madeline

+0

@Madeline上向きの矢印を表します。 – AntiDrondert

1

私が助けるコード内のいくつかの変更を、提案することができます:

'always store reference to the sheet in a variable! 
Dim sh As Worksheet 
Set sh = ActiveSheet 
'determine last row in F column 
lastRow = sh.Cells(sh.Rows.Count, 6).End(xlUp).Row 

For i = lastRow To 1 Step -1 
    'test for v in cell f and delete if there isn't one 
    'we make it uppercase, to avoid situation that we didn't match v with V 
    str = UCase(sh.Cells(i, 6).Value) 
    Debug.Print "str is " & str 
    If InStr(1, str, "V") > 0 Then 
     Debug.Print "hello str is " & str 
    Else 
     Rows(i).Delete 
    End If 
Next i 
+0

行を削除するときにループを進めたいですか? –

+0

コメントありがとうございました:) –

+0

ありがとうございました - 変数にシートへの参照を常に格納する理由は何ですか? – Madeline

1

あなたが行を消去した瞬間には、以下のすべての行のインデックスが1ずつ減少します。

これは、行がnに「V」が含まれているため、この行がnになり、テストされません。この場合、行n+1が行になります。

これにより、コードはすべての2行目をスキップします。

これを修正するには、行を逆に進めてください。

関連する問題