[[20090903213512]] 『もしB列とD列が同じ値の場合 行削除をしたい』(にしき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『もしB列とD列が同じ値の場合 行削除をしたい』(にしき)

下記のような表があり、B列とD列が同じ場合、行削除を行いたいのですが、
不明です。データの量が多いのでマクロでできたらと思っています。

下の表の場合削除されるのは 1行目と3行目と5行目となります。

よろしくお願いします。

   A列  B列  C列    D列

1 りんご  やま   5     やま    

2 みかん  かわ  8     たに 

3 なし   たに   6     たに

4 みかん  かわ  8     やま 

5 なし   たに   6     たに  


Sub test()

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.