[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『もしB列とD列が同じ値の場合 行削除をしたい』(にしき)
下記のような表があり、B列とD列が同じ場合、行削除を行いたいのですが、
不明です。データの量が多いのでマクロでできたらと思っています。
下の表の場合削除されるのは 1行目と3行目と5行目となります。
よろしくお願いします。
A列 B列 C列 D列
1 りんご やま 5 やま
2 みかん かわ 8 たに
3 なし たに 6 たに
4 みかん かわ 8 やま
5 なし たに 6 たに
Dim i As Long
Dim MaxRow As Long
With Worksheets("Sheet1") MaxRow = .Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行
For i = 1 To MaxRow '特定行のB列とC列の値が0の場合
If .Cells(i, 2).Value = Cells(i, 4).Value Then '特定行を削除する .Cells(i, 1).EntireRow.Delete End If Next End With End Sub
すみません。上記でできました。
このコードは、ご自身で作成されましたか?
削除のループ処理は 下から行うのが基本です。 現在は上から行っているので データの状況によっては上手く行かない場合が有ります。
> For i = 1 To MaxRow 1行目からA列の最終行まで iの値を一つずつ増やしながら行うのではなく
For i = MaxRow To 1 Step -1 A列の最終行から1行目まで iの値を一つずつマイナスしながら行う
に変更しておかれるのが良いのではないかと思います。
>データの量が多いのでマクロでできたらと思っています。 で、このコードは 実用に問題有りませんか? データ量が多いと、処理に時間がかかるかもしれません。
(HANA)
横から失礼します。 To HANAさん たびたびお世話になっている"あらくま"です。 >で、このコードは 実用に問題有りませんか? >データ量が多いと、処理に時間がかかるかもしれません マクロ記述というか処理方法の考え方によって処理所用時間に 差が出てきて、実用に問題が出る場合のあることは、以前、小 生も指摘されたことがあります。 本コードの場合、1行ずつ条件判断をすることが原因というこ とでしょうか。 処理時間への対応という点で、今回のような場合、どのような マクロを考えればよいのでしょうか。 マクロを勉強中の者として、お教えいただければ幸いです。 (あらくま)
こんな感じにすると、セルへのアクセスを減らせますね。(ROUGE) Sub test() Dim i As Long, MaxRow As Long, txt As String With Worksheets("Sheet1") MaxRow = .Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行 For i = MaxRow To 1 Step -1 If .Cells(i, 2).Value = Cells(i, 4).Value Then txt = txt & "," & .Cells(i, 1).Address(0, 0) End If If Len(txt) > 245 Then .Range(Mid$(txt, 2)).EntireRow.Delete txt = "" End If Next If Len(txt) > 0 Then .Range(Mid$(txt, 2)).EntireRow.Delete End If End With End Sub
マクロで処理をさせようと思った時に 時間がかかる処理は いくつか有ります。
簡単な所だと シートのデータを見に行く シートにデータを書き込む シートの操作をする 等。
現在のコードの流れを大きく考えると 1.シートにデータを見に行く 2.データを見比べる 3.シートの行を削除する の繰り返しですが 今回の場合 3が一番時間がかかります。 そして、削除する行が10行有ったら10回実行されます。
ですから ◆消す必要の有る行を先に先に印を付けておいて 印のある行を一気に消そう と考えると。。。 [[20090716225958]]『行の削除』(絵癖瑠二千酸) ↑のichinoseさんの書いて居られるコードの様に 出来ると思います。
上でROUGEさんが書いて居られるコードの考え方も ◆毎回削除するんじゃなくて、まとめて削除しましょう と言う考え方だと思います。
でも、マクロは シートへアクセスして 行の削除は行います。 それすらもさせない方法を考えると・・・ ◆残したいデータだけを集めた表を作成して それと差し替える。 例えば↓の弥太郎さんのコードの様に [[20060815232153]]『数値が0ではないものを抽出したい』(VBA初心者なおパパ)
1の処理(シートにデータを見に行く)と 3の処理(シートの行を削除する)を比べたときに 確かに3の処理の方が時間がかかりますが 当然1の処理も時間はかかるので 事前に配列に取り込む 等 毎回データを見に行かなくても済む方法を考えた方が 全体の処理は速くなるかもしれません。
>本コードの場合、1行ずつ条件判断をすることが原因というこ >とでしょうか。 この点だけを挙げるなら 1行ずつ条件判断をすること よりも 1行ずつデータを見に行くこと が 時間がかかると思います。
(HANA)
あらくまさん、
参考にどうぞ
[[20070831170349]] 『特定の文字を含んだセルの行を削除』(とんび)
(seiya)
ROUGEさん、HANAさん、seiyaさん、ありがとうございました。 横から失礼した私に対して、対応いただき嬉しく思います。 >1行ずつ条件判断をすること よりも >1行ずつデータを見に行くこと ROUGEさんのコードを読み深めていて、条件判断ではないなあ〜と感じていました。 皆さんのコメントでマクロの理解がまた少し、深まりました。 (あらくま)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.