PeaceJet

@PeaceJets 新しいブログ → https://blog.peacejet.net 2018年、証券会社から転職して人材会社のシステムエンジニアになりました。マーケティングやデータ分析・UI/UX改善などもやっています! https://github.com/peacejet

【VBA】エクセルで重複以外の値を抽出する方法



エクセルで重複した値以外を抽出する方法

久々にVBAを書きます。 複数列(たとえば、A列とB列)に、それぞれデータが入っていて、これらA列とB列でそれぞれが重複した値だった場合は無視して、重複していない値のみを取得したい場合があります。 そんなときに使える方法をご紹介いたします。

目的

2つの列を比較し、重複した値以外の値を取得する。

方法は2通り

方法1

目的を達成するために、データを加工したり切り捨てたりと…工夫して解決する場合があります。 たとえば、B列の値をA列の一番下にペーストして「条件付き書式」の「セルの強調表示ルール」→「重複する値…」と進むと、重複した値に色を塗ることが出来ます。 色がついていないセルが重複していないセルなので、それを抽出やソートすることができればゴールとなります。 しかし、エクセルでは背景色などでソートすることが出来ないため目的を達成することが出来ません。 ただ、ある程度の塊であるのであれば、人海戦術でいけることもあります。

方法2

上記の方法でもラチがあかないぜ!プログラムで自動化して、なんとかしたい! そこで、本題になります。 エクセルマクロで解決します。

ロジック

ロジック自体は簡単です。 2つの列を比較して、重複があればTrueを返し、そうでなければFalseを返す。 それに従って、Falseであれば当該データを新たな配列に格納し、そうでないもの(Trueが返ってきたもの)についてはスキップします。

スクリプト

以下を貼り付けて試してみてください。 といっても、勝手がわからないひともいるでしょうから、サンプルを貼り付けておきます。 (現在、作業中です・・・)

Option Explicit

Sub google()

  ' 変数の定義
  Dim n, i, j, z As Long
  Dim Data: Data = ThisWorkbook.Worksheets("B").Range("A:A")
  Dim tData: tData = ThisWorkbook.Worksheets("B").Range("B:B")
  
  ' 可変長配列を定義
  ReDim newData(0)
  
  For i = LBound(Data, 1) To UBound(Data, 1)
    
    Dim row: row = Data(i, 1)
    Dim duplicate: duplicate = False
    
    For j = LBound(tData, 1) To UBound(tData, 1)
      If (row = tData(j, 1)) Then
        duplicate = True
      End If
    Next j

    ' 重複していたら無視して、していなければnewDataの一番うしろに突っ込んでいます。
    If duplicate = False Then
      n = UBound(newData)
      ReDim Preserve newData(n + 1)
      newData(n) = row
    End If
    
  Next i

  ' 結果を表示する方法になりますが、ひとまずC列に入れてみます。
  For z = 0 To UBound(newData)

    ThisWorkbook.Worksheets("B").Cells(z + 1, 3) = newData(z)

  Next z

End Sub

Googleスプレッドシート

以前、Googleスプレッドシートで書いたものをエクセルに引き直したものですが、一部改変して複数列でも判定ができるようにしています。

peacejet.hatenablog.com