- ベストアンサー
VBAの条件に一致すれば行削除する処理について
- VBAの条件に一致すれば行を削除する処理について質問です。
- Forループの処理範囲の指定方法によって結果が異なる理由を教えてください。
- 処理をする行の順番によって結果が変わる理由についてご教示ください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>タイプミスがあったらすみません >処理は成功しています。 処理は成功しているので、ここへの転記ミスだと思いますが。 × Cells(Rows,Count 1) ○ Cells(Rows.Count, 1) >For data = 2 To Cells(Rows,Count 1).End(xlDown).Row >に変えると何も起こらなくなります。 2行目「data = 2 To」から最終行番号「Cells(Rows,Count 1).End(xlDown).Row」までの処理 上記の通り、Cells(Rows.Count, 1は「A1048576」セルで、 そこから下に連続した終端のセル「.End(xlDown)」の「.Row」行番号と記載されています。 つまり、2~1048576 行を範囲としていますが、実際に使われているコードと合っていますか? xlUpをxlDownに変更されているため、開始行から連続している終端行までを意図としていると思われますが。 その場合は「Cells(2, 1).End(xlDown).Row」になります。(2行1列=A2のセルから連続する下側の終端のセルの行番号) For data = 2 To Cells(2, 1).End(xlDown).Row ですが、はじめに29列目の「おやつ」が存在している行より手前のA列に、空欄のセルなど「2行目から下方向へ連続している」の条件にそぐわないセルがありませんか? キーボードでの操作で、A2セルにカーソルを置いた後、Ctrl+下矢印キー「↓」で停止した次のセルで処理が終了するようになっています。 >上の行から処理するか下の行から処理するかの違いで、やっていることは同じだと思う 目的と処理する範囲が同じでも処理する方向により処理する方法(考え方)が変わります。 VBAによるマクロは手作業で行われることが自動化されているため、手作業で行う場合を想像してください。 下から上へ処理の場合、dataの値が最終行から2行目まで処理を行います。 1~10行目の範囲だとして、7行目に「おやつ」がある場合は7行目を削除することで8~10行目は7~9行めに上側へズレます。 ズレた7~9行目(元8~10行目)は処理済みで、1~6行目はまだ未処理となりますが未処理の範囲は7行目削除の影響を受けていません。 そのため引き続き3行目に「おやつ」があっても、4~9行目が3~8行目にズレ、最終行の2行目まで処理が行われます。 上から下へ処理の場合、3行目を削除すると4~10行目が3~9行目にズレます。 削除したのち、処理は4行目を処理しようとしますから元4行目(削除後は3行目)に「おやつ」があればスキップされてしまいます。 そのため、上から下を行削除する処理の後に「data = data - 1」を追加して、次に処理する行を削除した分だけ減らす必要があります。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
>やっていることは同じだと思うのですが 経験不足。やってみればわかる。 行(番号)を指定して、For Nextで繰り回すとき、行削除すると、今までの考えで指定していた番号が変わる(1歩手前でおもっていたのと比べて)。 例えば A1:A6に1,2,3,4,5,6、(以下空白)と入れておいて下記をテストする。 Sub test01() For i = 1 To 6 MsgBox Cells(i, "A") 'ここはセルの値を表示、行番号ではない。 If Cells(i, "A") = 3 Then Rows(i).EntireRow.Delete Next End Sub 行番号1,2,3,4,5,6と捕まえて、各々の行で処理をしてほしいところ 3の段階でデータは(1行削除されて全体的に)1行繰り上がるので、4が3の位置に来るので、次の4は飛ばして残りの、5,6、空白の3行を処理してしまう。 下の方から削除していくと、上の方でのiの指す行は影響を受けない。 ーー 誰しも1度は経験するが、その段階で不適当に気づき、公に質問するまでには至らないもの、と思っていたが。
お礼
イメージが中々沸かなかったのですが、ご教示いただいたメッセージボックスを使う方式で目に見えて処理の進捗状況が分かるようになりました!これからもこの方法を活用させていただきます、ありがとうございました(^_^)
- kkkkkm
- ベストアンサー率66% (1719/2589)
あと ).End(xlDown). なので途中で空白のセルがあればそれ以上は進みません。
- kkkkkm
- ベストアンサー率66% (1719/2589)
上の行から削除するとたとえば3行目を削除したときに次の対象は4行目になりますが、3行目を削除したために元の4行目が3行目になってしまい、もとの4行目は検査対象から外れてしまいます。 (data=1 1行→1行 (data=2 2行→2行 (data=3 3行削除 4行→3行 (data=4 5行→4行
お礼
ご回答いただいてありがとうございます!確かに手作業でやってもその通りになりますね…!なんだかVBAは違う物だと思っていましたが、いわれてみればおっしゃるとおりだと思いますm(_ _)m
- oboroxx
- ベストアンサー率40% (317/792)
For data = Cells(Rows,(ここがカンマになっているからでは?)Count(ここにカンマ) 1).End(xlUp).Row To 2 Step -1 For data = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
お礼
ご回答いただいてありがとうございます!しかしこれはタイプミスで実際はちゃんとカンマが入っています…!<(_ _)>
お礼
確かに手作業でも上から1行削除すれば列番号が変わります…!これを下から削除すれば下からの処理なので確かに影響は受けないですね…!-1をEnd Ifの前に追加すると上からの処理でも成功しました!本当にありがとうございます…!