見出し画像

15-重複を除いたリストを作る(エクセルマクロ)

名前の重複があるデータを行削除せずに重複なしで書き出す

皆さんこんにちは。
名前の重複があるデータで、名前の列だけの重複なしリストが必要な時、ありますよね。
そんな時にとっても便利なマクロをご紹介します。

動画で覚える:【マクロルーティン22】重複を除いたリストを作る!

◆イメージ

画像2

氏名に重複のある「販売リスト」から
(★この時、同姓同名はいないものとします。氏名Noだといいですね)

次の図のように氏名の重複を除いたリストを「氏名リスト作成」ファイルにマクロで書出します。

画像2

◆書くマクロ

画像6

★少しでも簡潔にお伝えしたいので、変数宣言を強制させずに書きます。
実際、ちょっとした短いマクロを書くときはなるべく簡潔に済ませたいです。
→ですので今回は「Option Explicit」はコメントアウトするか削除して書いてくださいね。

◆準備


VBA画面のツールメニュー→参照設定を選び、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。

画像4

画像5

◆解説

画像8

①Dictionaryオブジェクトをコードで使うための準備
②「販売リスト」のA列(氏名)を重複なしでDictionaryに追加していく
③「氏名リスト作成」ファイルに②で作成したDictionaryの中身を書出す

+++++++++++++++++++++++++++++++++

Dim dic As New Scripting.Dictionary
 →【変数宣言】「dic」はDictionaryオブジェクトですよ。
(dicは自分で勝手に作った変数です。)

②Workbooks("販売リスト.xlsx").Worksheets("リスト詳細").Activate
 →Dictionary 作成は「販売リスト.xlsx」ファイル上でのみ作成しますので、Activeにしておきます。

❷For i = 2 To 21
 ❶shimei = Range("A" & i).Value
 ❸If dic.Exists(shimei) = False Then
  ❶dic.Add shimei, shimei
 ❸End If
❷Next

まず、Dictionaryオブジェクト(ここでは「dic」)に値を追加していく書き方は

画像7

と書き、キーと要素を追加できます。
★今回は氏名だけ取り扱いたいので、[キー]の位置に氏名を追加していきます。[要素]はないので、何でもいいのですが[キー]と同じ氏名を入れておくこととします。

今回追加したい値はA列の値ですので、行番号を「i」として
Range("A" & i).Value
と書けます。追加する書き方に当てはめると
(❶)dic.Add Range("A" & i).Value, Range("A" & i).Value(キーと要素に同じ値を入れるので)
となりますね。
このままでもいいのですが、Range("A" & i).Value の部分が見ずらいので、変数shimeiに入れます。
❶shimei = Range("A" & i).Value
すると次のように書けますね。すっきりしました。

❶dic.Add shimei, shimei

そしたら、「i」の範囲を指定した、For Nextで挟みます。
❷For i = 2 To 21 (販売リストには21行目までデータがあります)
 ①shimei = Range("A" & i).Value
 ①dic.Add shimei, shimei
❷Next

★あともう少しです!

ここで、Dictionaryには2行目からの氏名が[キー]として追加されていくわけですが、氏名の重複は避けたいです。
そんなときに便利なメソッドがExistsです。
dicに特定の[キー]が存在するかしないかを判定してくれます。

画像8
のように書きます。「dic(Dictionaryオブジェクト)」に追加されていれば、Trueを返し、まだ追加されていなければFalseを返してくれます。
氏名を追加する前にこれを利用してFalseならば追加するように書けばいいですね。

❸If dic.Exists(shimei) = False Then(shimeiがdicに存在していなければ)
 ①dic.Add shimei, shimei ←dicの[キー]と[要素]にshimeiを追加
❸End If

shimeiとは❶で指定したA列「i」行目の値のことですよ。
★ここでもshimeiという変数を作っておいてよかったですね。
変数を作らずに書いた場合次のようなコードになります。

 ❸If dic.Exists(Range("A" & i).Value) = False Then
  ❶dic.Add Range("A" & i).Value, Range("A" & i).Value
 ❸
End If

このように書いてから気づいて変数を作ることもあります。

今回は長くなってしまいました。
続きは次回にいたします。

◆関連動画


この記事が気に入ったらサポートをしてみませんか?