このブログのリファラーを見ていると、あいかわらず「VBA Excel 重複行」で検索されてくる方が多いですね。

みなさん、そんなに重複行をどうにかしたいのでしょうか?(^^;)

重複行について、今までに書いたのは以下の記事です。

VBAのお勉強 Excelで重複行を探す

こちらは、複数の列で重複している値を探す、というものでした。

VBAのお勉強 VBAでExcelの重複した行を探して表示

こちらは、一つの列の中で重複している値を探す、というものでした。

ただ私の経験で、今までデータの重複行、うんぬんを考えるとき、「重複行をどうしたいのか?」で考えると、一番多いのは、

こんなデータがあったとき、B列で重複している行を1行だけ残して、削除してしまう、つまり、

こうしてしまいたい、という事のような気がします。違いますかね?(^^;)

名簿なんかで「同じ人がいたら1行残して後は消す」みたいな処理、多いと思うんですけど。


んで、こういうことをするには、「フィルタ」とかを使うのでしょうけど、あの機能って、いまいちよく分からないんですよね。。。

重複した行を「見えなくする」事や、重複しないデータにして、別の位置に抽出して抜き出す、のは、なんとなく出来たんですが。

あとは並べ替えて、IFを使って前の行と同じ値だったらフラグを立てて、その行を消す。とか。

・・・なんか、余計な項目を作ったり、別のところに書き出したり、並べ替えたりするの、めんどくさいんですよね(^^;)

自分がやりたいのは、「重複してる行を1行残して、削除する」という事です。

これってエクセルの機能で一発でできないんでしょうか?(^^;)

08/4/10 追記
Excel2007には、これを実現させる機能があるようですね。
こちらのサイトにその機能の詳細がのっています

ということで、VBAで書いてみます。

今回はB列の値をみて、

  • 重複していない行は、そのまま残す
  • 重複している行は、一番先頭の行を残して、残りは削除する

という条件でやってみます。

Visual Basic:
  1. Sub test()
  2.  
  3.     Dim lastgyou As Integer
  4.     Dim i As Integer
  5.     Dim j As Integer
  6.  
  7.     Dim checkatai As String
  8.  
  9.     'B列の最終行を求めます。
  10.     lastgyou = ActiveSheet.Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row
  11.  
  12.     '1行目から最終行の前まで繰り返します。
  13.     For i = 1 To lastgyou - 1
  14.  
  15.         'チェックする値を、checkataiに代入します。
  16.  
  17.         checkatai = ActiveSheet.Cells(i, 2).Value
  18.  
  19.         '今見てる行から、下をチェックします。
  20.         For j = i + 1 To lastgyou
  21.  
  22.             'もし、値が同じであれば、
  23.             If checkatai = ActiveSheet.Cells(j, 2).Value Then
  24.  
  25.                 'その行を削除します
  26.                 ActiveSheet.Rows(j).Delete
  27.  
  28.                 '最終行が1行減ったのでlastgyouの値を減らします。
  29.                 lastgyou = lastgyou - 1
  30.  
  31.                 'チェックしている行を1行前に戻します。
  32.                 j = j - 1
  33.  
  34.             End If
  35.  
  36.         Next j
  37.  
  38.     Next i
  39.  
  40.  
  41. End Sub

先頭から1行ずつ、最後の行の前まで見ていきます。

今見てる行の次の行以下を最後の行まで探し、もし今見てる行と同じ値があったら、見つけたほうの行を削除する、という考えかたです。人間が手作業で削除するのと同じですね。

削除した場合、全体の行数が減るのと、次にチェックすべき行(プログラムの j の変数)が1行上に来るので、それも減らす、という感じです。

実行してみると、、、

ん、重複行がなくなりました(^^)

とりあえず、ここに置いときます。→vbastudy_24
今回は重複をチェックする対象が、B列だけでした。

これを、

といったように「住所」「名前」の両方が重複している場合削除する、といったように、複数の列をチェックの対象にすることもプログラムを変更すれば可能です。これは次回にやります。

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 simple blog いろいろ勉強中 Suffusion theme by Sayontan Sinha