以下の記事は、「重複している行を探して表示する」というものです。
重複している行を1行だけ残して、削除する、というサンプルは、
VBAのお勉強 Excelで1行残して重複行を削除
こちらをご覧下さい。

このブログのリファラーを見ていたら、「Excel VBA 重複行」で検索されている方がいました。

その方はたぶん

http://www.simple-sys.com/blog/2008/03/13/43/

のページを見られたようですが、 これは2列で重複している行を探す、という形の重複行を探すものです。

ただ、一般的に「重複行を探す」といったら、

160-01.jpg

みたいなデータがあったときに、

「あ」、「う」、「お」、「く」が重複している、

っていうような探し方、のほうが多いような気がします。

なので、今回はVBAを使って、重複した行を探してみたいと思います。

160-02.jpg

こんな感じで、A列で重複しているデータにはそのB列に「重複」って文字が 入るようにしてみたいと思います。

考え方は、こんな感じ。

  • 1行目から見ていって、
    • その行の値を次の行から探していき、
      • 同じ値があったら、その行と、今見てる行のB列に「重複」の文字を入れる
    • これを最後の行まで繰り返す
  • っていう作業を最後の1つ前の行まで繰り返す

こんな感じです。

一番最後が、「最後の1つ前の行まで」ってなってます。

なんで最後の行まで繰り返さないか? その理由は簡単です。

最後の行にはもう、「次の行」がありません。

最後の行はそれ以降にチェックする対象がないので、最後の1つ前の行まで、ということになります。

ということで、コードを作っていきます。

まずは、A列を最初から最後の1つ前までイミディエイトウィンドウに表示させてみます。

Sub test()

    Dim lastgyou As Integer
    Dim i        As Integer
    
    'Sheet1を選択します
    Sheets("Sheet1").Select
    
    '最後の行を求めます
    ActiveSheet.Range("A1").End(xlDown).Select
    lastgyou = ActiveCell.Row
    
    '最後の行まで、B列を空にします。
    For i = 1 To lastgyou
        
        ActiveSheet.Cells(i, 2).Value = ""
    
    Next
    
    '1行目から最後の行の1行前まで、とりあえずイミディエイトウィンドウに表示
    For i = 1 To lastgyou - 1
        
        Debug.Print (ActiveSheet.Cells(i, 1).Value)
    
    Next

End Sub

まず、最終行の行番号を求めるのはいつもどおりです。

B列の値を全部消して、その後で、1行ずつ表示しています。

実行すると、

160-031.jpg

(^^)いつもとほぼ同じですね。

それでは、今の行より下の行をチェックしていくプログラムを追加してみます。

Sub test()
    
    Dim lastgyou As Integer
    Dim i        As Integer
    Dim j        As Integer
    Dim atai     As String
    
    'Sheet1を選択します
    Sheets("Sheet1").Select
    
    '最後の行を求めます
    ActiveSheet.Range("A1").End(xlDown).Select
    lastgyou = ActiveCell.Row
    
    '最後の行まで、B列を空にします。
    For i = 1 To lastgyou
        ActiveSheet.Cells(i, 2).Value = ""
    Next
    
    '1行目から最後の1つ前の行までチェックします
    For i = 1 To lastgyou - 1
        
        '今見ている i 行目の値を atai という変数に入れておきます。
        atai = ActiveSheet.Cells(i, 1).Value
        
        '今見ている行( i )の1つ下から、最後の行まで、チェックします
        For j = i + 1 To lastgyou
            
            'もし、ataiと j 行目が、同じ値だった場合
            If atai = ActiveSheet.Cells(j, 1).Value Then
                
                'i行目と、j行目が重複していることになるので、
                '両方の行のB列に、「重複」という文字を代入します。
                ActiveSheet.Cells(i, 2).Value = "重複"
                ActiveSheet.Cells(j, 2).Value = "重複"
            End If
        Next
    Next
End Sub

ataiという変数と j という変数を追加しました。

atai に今見ている i 行目のA列の値を入れておきます。

j で今見ている行の次の行から最後の行まで繰り返し見ていき、 j 行目の値と atai の値が一致した場合、「重複」という値をB列に代入する、となっています。 実行してみると、

160-04.jpg

ん、できました(^^)

これで完成。。。なんですが。

例えば、「あ」について見てみると、

160-05.jpg

「あ」は1行目と、8行目にあります。

1行目のチェックが終わった段階で、

160-06.jpg

こんな状態になってます。

プログラムはこの後、2行目、3行目と同じように進んでいきますが、 8行目まで来たときについて考えてみます。

8行目は「あ」です。

「あ」はすでに1行目でチェックしたときに重複していることが分かっていますので、 B列には、「重複」という文字が入っています。

ということは。。。。

8行目まで来たときですが、この「あ」については探す必要がないですよね?(^^;)

なぜなら、すでに1行目で重複していることはわかっていますし、仮に9行目以降に「あ」があったとしても、 それはすでに1行目でチェックした際に重複と判断されてB列に「重複」が入ってるはずです。

ということで、

もしB列に「重複」という文字列が入っている場合、その行の値については探す必要がない、

ということをプログラムに組み込んでみます。

Sub test()
    
    Dim lastgyou As Integer
    Dim i        As Integer
    Dim j        As Integer
    Dim atai     As String
    
    'Sheet1を選択します
    Sheets("Sheet1").Select
    
    '最後の行を求めます
    ActiveSheet.Range("A1").End(xlDown).Select
    lastgyou = ActiveCell.Row
    
    '最後の行まで、B列を空にします。
    For i = 1 To lastgyou
        ActiveSheet.Cells(i, 2).Value = ""
    Next
    
    '1行目から最後の1つ前の行までチェックします
    For i = 1 To lastgyou - 1
        
        'もし、今見ている行がまだ「重複」じゃない場合
        If ActiveSheet.Cells(i, 2).Value = "" Then
            
            '今見ている i 行目の値を atai という変数に入れておきます。
            atai = ActiveSheet.Cells(i, 1).Value
            
            '今見ている行( i )の1つ下から、最後の行まで、チェックします
            For j = i + 1 To lastgyou
                
                'もし、ataiと j 行目が、同じ値だった場合
                If atai = ActiveSheet.Cells(j, 1).Value Then
                    
                    'i行目と、j行目が重複していることになるので、
                    '両方の行のB列に、「重複」という文字を代入します。
                    ActiveSheet.Cells(i, 2).Value = "重複"
                    ActiveSheet.Cells(j, 2).Value = "重複"
                End If
            Next
        End If
    Next

End Sub

IF文を使って、i 行目のB列に「重複」が入っていない場合だけ、内側の For Nextを実行するようにしています。

実行してみると、

160-07.jpg

ん、おっけいですね(^^)

こちらにアップしておきます→vbastudy_16.xls

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