2017-07-10 19 views
0

VBAを使用してワークシートのデータを修正しようとしましたが、残念ながら次のコードが正しく動作していません。 基本的に列Aにはテキストがあり、列Aが「Pit」(「Pit」は含まず、「Pit」のみ)の場合は行全体を削除します。何らかの理由でコードが行を削除するだけで、他の行は削除しないので、スクリプトを何度か実行して、すべての "Pit"を取り除かなければなりません。削除する行と削除しない行の間には明確な違いはありません。すべてのテキストは空白ではありません。&列Aのテキストが異なる数千もの行があります。ここでコードは、私は非常に任意の提案に感謝します。VBA削除行が正しく動作しない

Sub Pitdelete() 

Dim lastrow As Long 
Dim datasheet As Worksheet 
Dim i As Long 

Set datasheet = Worksheets("DefCatCou") 

lastrow = datasheet.Range("a" & datasheet.Rows.Count).End(xlUp).Row 

For i = 2 To lastrow 
If datasheet.Cells(i, 1) = "Pit" Then 
datasheet.Rows(i & ":" & i).EntireRow.delete 
End If 

Next i 

End Sub 

ありがとうございます!

+1

解決策はSO [docs]にあります(https://stackoverflow.com/documentation/excel-vba/1576/common-mistakes/11796/deleting-rows-or-columns-in-a-loop#t= 201707100805060985475)がすでにインストールされています。 –

+0

[Excel for VBA for forループで行を削除すると重複する可能性があります](https://stackoverflow.com/questions/43454139/excel-vba-deleting-rows-in-a-for-loop-missesrows) –

答えて

0

だけループ:

次のような別の変数を宣言し、それをあなたが行を削除するたびに増やすことができ

Sub Pitdelete() 

Dim lastrow As Long 
Dim datasheet As Worksheet 
Dim i As Long 

Set datasheet = Worksheets("DefCatCou") 

lastrow = datasheet.Range("a" & datasheet.Rows.Count).End(xlUp).Row 

For i = lastrow To 2 step -1 'This should fix it. 
    If datasheet.Cells(i, 1) = "Pit" Then 
     datasheet.Rows(i & ":" & i).EntireRow.delete 
    End If 
Next i 
End Sub 

理由は、あなたが行を削除する場合ということで、 iを1つ増やすと、基本的に次の行がスキップされます。削除がその行を上にシフトしたからです。

行の後ろにi = i - 1を追加する方法があります。

+0

ステップ-1を含めてくれてありがとう、私はそれをする方法を知らなかった! –

0

行を削除するたびに、その下のすべての行が上に移動します。行を削除するとき、後方

Dim c as Integer 
c = 0 
If datasheet.Cells(i, 1) = "Pit" Then 
datasheet.Rows(i - c & ":" & i - c).EntireRow.delete 
c = c + 1 
... 
+0

ええ、わかりました。その場合、私は直接私を操作すればうまくいくのだろうか?すなわち、 i = i-1ではなくc? –

+0

技術的にはできますが、これは私にとってはよりクリーンです:) – zipa

0

@zipaは大丈夫です。行を削除すると、他の行が上に移動してインデックスを変更します。彼の提案する代わりに、あなたは逆に実行するループを得ることができます:あなたが行を削除する場合

For i = lastrow To 2 Step -1 
    If datasheet.Cells(i, 1) = "Pit" Then 
     datasheet.Rows(i & ":" & i).EntireRow.delete 
    End If 
next i 

そうすれば、それはあなたのループ内の次のインデックスには影響しません。

+1

ループ宣言に 'Step -1'を追加する必要があります。 –

+0

ああ、とても賢い! –

+0

ああ - ありがとう@ EganWolf。たしかにそれは正しいね。一定。 – ainwood

関連する問題