---topics:ジャンプ---

其ノ10 データ重複と並べ替え 後編

ハイ毎度。 今回は、前回との関連で。
前回、重複のあるデータの取り扱いについてやりました。 本日の課題は、重複してるデータについて、差異のある箇所を割り出す、というものです。 ダブってる2件目、3件目のレコードを削除して1件にする、というところまではやりません。 むしろ、「どのレコードを活かし、どのレコードを削除するか」を判断する材料をつくる、というイメージです。 さてはて、どうなりますかな。

差異のあるセルを割り出す:並べ替え

では、本日の練習データ、ダウンロードお願いします。

開くとこんな↓です※1

kiso10_narabekae.xlsx

※1 kiso10_narabekae.xlsx

本日の課題は、「注文番号がダブってたら、商品名、および価格を比較して、もし差異があったらその箇所がわかるようにしてほしい」というものです。
「差異のある箇所がわかるようにしてほしい」のですから、差異のあるところにしるしをつければよさそうなんですが…、じゃあ、どうやって差異のある箇所を割り出しましょうかね、ってのが課題です。 みなさんも、ちょっとやり方、考えてみてください。

 ・
 ・
…まず、そもそも重複が存在するかを調べてみましょうか。 ダブリがないなら、そもそも何の問題もないですもんね。
というわけで、前回も使ったcountif関数を使って、重複があるかどうか調べてみましょう※2 ※3
A列(注文番号列)全体を範囲として、A2セル(注文番号1コ)を検索するんですよ。

countifで、注文番号に重複がないか調べる 「1」より大きいなら重複してる、ということ
※2 countifで、注文番号に重複がないか調べる 「1」より大きいなら重複してる、ということ
重複ありますね…
※3 重複ありますね…

重複ありますね…。 ま、そうなるように練習問題作ってるんですけど(笑)。
あ、そうそう、式を入れたところ、忘れずに値貼りしておいてくださいね。
列全体をコピーして、同じ場所に、右クリックで「形式を選択して貼り付け」→「値」でしたね。
関数入れたら値貼り、ですよ※4

値貼りしておくこと
※4 値貼りしておくこと

さて、課題は「ダブってるところの差異を知りたい」でした。
だから、重複数「1」のところはどうでもいいんですよ。 ダブってないのですから。
問題は、重複数が「2」と「3」のところですよね※5。 調査しなければならないのは。

重複数「2」と「3」が問題
※5 重複数「2」と「3」が問題

なので、重複してるレコードがタテに隣り合わせになるように、並べ替えをしておきましょうか。
というわけで、まず、並べ替えをする前に、「No」列を作成しておきましょう※6
もし「元の順番に戻して」と言われても、対応できるように、ね。

「no」列を左端に作った
※6 「no」列を左端に作った

「No」入れました。 では、並べ替えましょうか。

まず、並べ替え画面にして、最優先するキーを…って、おおっと!
範囲選択は大丈夫ですよね?
例によってこのExcelも1列空いてますので、範囲指定をきっちり、一番右の「入力日」まで含めてお願いします。
で、範囲をきっちり選択したところで、並べ替え時の最優先するキーを今回は「重複」(さきほどcountifを入れたところ)にします。 昇順ね。
そして、「重複」昇順のなかで、さらに「注文番号」順に並べたいので、並び替えレベルを追加し、「注文番号」昇順を指定してください※7
こんなふうに並べ替えられます※8

範囲をきっちり選択して、重複:昇順→レベルの追加→注文番号:昇順
※7 範囲をきっちり選択して、重複:昇順→レベルの追加→注文番号:昇順
重複数「1」/「2」/「3」で大きくまとまった
※8 重複数「1」/「2」/「3」で大きくまとまった

こうすると、重複数「1」/「2」/「3」で大きくまとまり、その中でダブった注文番号が上下隣り合わせになります。
この状態だと、重複数「1」のところはガサっと無視して良いですし、また、ダブリのあるところも、ダブってるレコードが上下隣り合わせになってますから、もし差異のある箇所を目で探しにいくとしても、見つけやすくなってますよね。 ちょっと、上からデータを眺めてみていってください。

 ・
 ・
では、「商品名」と「価格」の差異の割り出し、どうやりましょうか。
「よし!目で探そう!」 ………繰り返しますが、私は根性のある人が大好きです。 それに、これぐらいの件数なら目で探してもそんなに時間はかからないでしょう。 でも、どうしても人間の目だと、微妙な文字の違いや数字の違いを見落とすかもしれません。 「3」と「8」って結構見間違えるんですよ。これホント。 なので、機械的に割り出したいところです。

差異のある箇所にフラグを立てる

では、どうしましょうか。
差異を割り出すのだから、其ノ2でも使ったイコール式を使いましょう。
まず、商品名を比較するための列を挿入します。 項目名は「←差異」でいいかな※9

差異を出すための式を入れるための列
※9 差異を出すための式を入れるための列

ではここに、イコール式を入れていきましょう。
前回は1コ上のセルと比較しました。 「TRUE」のところが、ダブった注文番号の2コ目以降、というフラグ(しるし)でしたね。
今回はですね…、こんなふうに↓しましょう※10

商品名について、1コ下のセルと比較
※10 商品名について、1コ下のセルと比較

まず、重複数「1」のところはガッサー!と無視します。 比較の必要がないですもんね。
んで、「商品名」を比較するんでしたね。
で、イコール式を入れたわけなんですが、今回は、1コのセルと比較します。 重複数「2」は146行目からはじまっているので、=(E146=E147)と、「その行のセル1コ下のセルがイコールかどうか」を調べるようにします。 そうすると、もし差異があれば「False」が返るはずですよね※11

このセルはTrueだったけど
※11 このセルはTrueだったけど

「じゃあ、この式をコピっておしりまで入れれば!」
…って、いつもだったらなりそうなものなんだけど、実はそうはいきません。
というのも、今現状並び替えた状態だと、重複してる商品レコードはこういう↓かたまりになっているんだけど…※12

同じ注文番号の2件が上下隣り合わせになっている
※12 同じ注文番号の2件が上下隣り合わせになっている

重複してる2レコード目にこの式を入れても、それは違う注文番号の商品名と比較しちゃうことになるから、意味がないんですよ※13

異なる注文番号のと比較しても、ほぼ確実にFalseになるだけで、意味がない
※13 異なる注文番号のと比較しても、確実にFalseになるだけで、意味がない

ちがう商品の商品名と比較しても、ほぼ確実にFalseになるので、ここに式を入れてもムダですよね。 なので、1コ飛ばしに式を入れられればよいのですが…。

1コ飛ばしに式を入れる

いやいや! 1コ飛ばしに式をいれること、できますよ!
やり方はですね…、まず、さきほど「イコール下」の式を入れたセルの下のセル、すなわち重複してる2コ目のセルは空白のままにしておいてください。 そして、上下2セルとも選択します※14。 上は式の入ったセル、下は空白ですよ。

下の空白を含めて選択
※14 下の空白を含めて選択

選択したら、選択範囲の右下のあたりにマウスを持って行ってください。 ポインタが十字型になるはずです。
そうしたら、下方向にドラッグします。
下セルが空白のままです※15
重複数「2」のゾーンのおしりまで引っ張ってください。※16

下の空白を含めて引っ張る
※15 下の空白を含めて引っ張る
重複数「2」の終わりまで埋める
※16 重複数「2」の終わりまで埋める

できました?

下セルと比較する式
空白
下セルと比較する式
空白
 ・
 ・
 ・
と、式と空白セルが交互に並ぶと思います。
Falseが出てるところ、たしかに商品名ちがいますね。
あ、今はアキアキですが、このアキのところは、後々処理しますよ。

続いて重複数「3」のゾーンです。
ここは、比較対象が3つあります。 わかりやすくするために、上からA・B・Cとしましょう※17

重複数「3」
※17 重複数「3」

もしここで、ABCもイコールなら、問題ないんですよ。 だから、ABCがイコールかどうかを調べたい。
でも、=(A=B=C)という式では、ダメなんです。 機能しないんです(ちゃんとした理由はよくわからないですけど…おそらく同時に2つのイコールを処理できないのではないかと思います)。
A・B・C、3つともイコールかを調べるには、ひと工夫して、

 A=B かつ A=C

という式の入れ方をしてあげる必要があります。
なので、この「かつ」の部分、and関数をつかって、

=and(A=B , A=C)

としてあげればOKです。
実際に式を入れてみましょう※18

=and(A=B,A=C)
※18 =and(A=B,A=C)

この式を入れると、A・B・C、3つともイコールなら「TRUE」、1コでも違うのがあれば「FALSE」になります。 結果はどうなったでしょうか?※19

FALSEでした
※19 FALSEでした

Falseでした。 差異があるみたいですね。 あ、よおく見ると、1コ目・3コ目は「タテ788~」なのに、2コ目は「タテ789~」だ…。

とりあえず、残り2つのセルは空白のままにしておいてくださいね。 次の工程で処理しますよ。

<この機会にちょっとお話>
今回は、重複数「3」のゾーンが1かたまりしかありませんでした。 では、もし「3」のゾーンがずらーっとあったらどうしましょうか。
…実は、「2」のときと同じです。 下の空白セル2セルを含めてまとめて選択して、下に引っ張ればOKです。 そうすれば、

and式
空白
空白
and式
空白
空白
 ・
 ・
 ・
となりますよ。

では、式を入力したので、値貼りしておきましょう。 列全体を選択して、「形式を選択して貼り付け」→「値」ですよ※20

値貼りしておきましょう
※20 値貼りしておきましょう

さて、準備は整いました。

上セルと同じ値を入れる:ジャンプ

さて、式を入れ終えました。
現状、重複してる上側のセルだけに判別の式の結果が入っています。
この状態で、FALSEのところを目で探していって、例えばそこに色を塗っていっても良いんですが、せっかくだからもうひと手間加えたいと思います。 差異のあるところだけ、フィルタで抽出できると良いな、と思いまして。
そのために、ジャンプという機能を使います。
案ずるより産むが易し。 やってみましょう。
まず、F列(「←差異」列)を選択します※21

F列選択
※21 F列選択

範囲選択しました? ジャンプは、必ず範囲選択してから行ってくださいね。
次に、ctrlキーを押しながらGを押してください。 ctrl+Gです。 すると、「ジャンプ」というウインドウがでます。 その中の、「セル選択」を選んでください※21

ジャンプ
※22 ジャンプ

すると、「選択オプション」というウインドウが出ます。 そこで、「空白セル」を選択※23して、OK※24

空白セルを選択、でOKすると…
※23 空白セルを選択、でOKすると…
ジャンプの結果
※24 ジャンプの結果

こうすると、指定範囲内の空白セルを全部選べるんですよ。
…「だから何?」って顔、しないでください。
えーと、何がしたいかっていうと、現状、ダブリの上側にTRUE/FALSEが入っているじゃないですか。 もし、ダブリの下側(現状blanc)のところにも上セルと同じ結果(TRUE/FALSE)を入れることができれば、フィルタでFALSEだけを抽出できる=差異あるところだけピックアップできる、と考えまして…。
あ、ジャンプの前の範囲選択、忘れないでくださいね。 範囲選択しないと、シート内の全部の空白セルが選ばれちゃいますから。

さて、続きです。
ジャンプができましたら、イコール上とする式を入れてください※25。 「=」入れて、1コ上のセルを選択、ですよ。
あ! まだenterは押さないでくださいね。

イコール1コ上のセル
※25 イコール1コ上のセル

式を入れたら、ctrlキーを押しながらenter! ctrl+enterです。
すると、ジャンプで選んだセル、すなわちF列の空白セルすべてに、イコール上の式が入ります※26 ※27

ctrl+enter! すると、最初は「←差異」ばっかになっちゃうが…
※26 ctrl+enter! すると、最初は「←差異」ばっかになっちゃうが…
「2」のゾーンと「3」のゾーンの空白には、上と同じ値が入る
※27 「2」のゾーンと「3」のゾーンの空白には、上と同じ値が入る

空白セルが埋まりましたね。式を入れたので、もう一度値貼りしておいてください※28

式を入れたので、もう1回値貼りする
※28 式を入れたので、もう1回値貼りする

…重複数「1」のゾーンに「←差異」と入ってしまったのはご愛嬌。
ですが、こうすると、「FALSE」のところ=差異のあるアイテム、ってことになるんですよ。
ジャンプ前までは、ダブってる1コ目だけに判別の値(TRUE/FALSE)が入っていました。
ダブりの2コ目以降は空白でした。
だけど、ジャンプしてイコール上を入力することで、1コ目と同じ判別の値(TRUE/FALSE)が入る。
そうすれば、フィルタで「FALSE」を抽出でき、ダブリで差異のあるアイテムだけ見ることができます。
…なんだかことばで説明するとむずかしそうに見えちゃいますね。 ただ、こういうロジックを組み立てるのって、経験が物を言うところがあります。 そして、今、経験、したじゃないですか。 僕のこのサイトって、経験してもらうためにあるんですよ。 手を動かして、失敗して。練習なんだからいくらでも失敗できます。 そうやって、経験値を積んでもらって、Excel力をつけてもらえたら良いな、と思っています。 なので、チャレンジしてみてください。

さて、話は戻りまして。 もうひと工夫しようかな、と。
まず、フィルタをかけて、「←差異」のところ、消しましょうか※29 ※30 ※31

フィルタをかけて… おおっと 範囲選択は大丈夫?
※29 フィルタをかけて… おおっと 範囲選択は大丈夫?
重複数「1」のところ、ジャンプで入ってしまった「←差異」を抽出して…
※30 重複数「1」のところ、ジャンプで入ってしまった「←差異」を抽出して…
そこは消す(blancにする)
※31 そこは消す(blancにする)

同様に、「True」のところもフィルタで抽出して、消しちゃいましょう※32

同様に、フィルタでTrueを抽出し、消しちゃう
※32 同様に、フィルタでTrueを抽出し、消しちゃう

さて、残りは「FALSE」です※33

Falseが残る
※33 Falseが残る

さて、現状「FALSE」のところ=差異のあるアイテムなんですが、「FALSE」ってあんまり一般的なことばではないですね。 Excelに不慣れな上司には伝わらないかもしれません。
なので、「FALSE」を「×」とかわかりやすい表現に変えましょうか。
フィルタで抽出して「FALSE」→「×」に変えましょう※34~※38

フィルタでFalseを抽出して…
※34 フィルタでFalseを抽出して…
一番上を×に打ち換えて…
※35 一番上を×に打ち換えて…
その×をコピー
※36 その×をコピー
Falseのところに…
※37 Falseのところに…
貼り付け
※38 貼り付け

ということで、差異のあるところだけフラグ(しるし)を立てることができました※39

×がある=差異あるアイテム
※39 ×がある=差異あるアイテム

価格についても同じようにしてください※40~※43

イコール式を1コ飛ばしで入れて…
※40 イコール式を1コ飛ばしで入れて…
ジャンプで空白だけを選択して…
※41 ジャンプで空白だけを選択して…
イコール上式を入れてctrl+G
※42 イコール上式を入れてctrl+G
こうなる
※43 こうなる

ハイ、できました。 フラグの立った箇所について、どこがどう違うのか、確認しておいてください。

ちなみに、XH4165の商品名「レポートパッド B5 A罫 7㎜ 28行」ですが、 一見すると商品名同じみたいなのに、「×」になっています。
でもこれは、僕たちの計算が間違ったわけではないんです。
どちらか一方の商品名のおしりに、余計なアキスペースが入っていませんか? セルの中に入って確かめてみてください。
イコール式は、そういうところまで検出してくれるんです。

と、いうことで、本日の課題は終わり!
本日の課題はちょっと、むずかしかったかもしれません。 練習は何度でもできるし、いくら失敗してもよいので、稽古不足を幕は待たない/恋はいつでも初舞台にならないよう、やってみてください。
あ! あと、ジャンプで空白選択→イコール上、のコンボは、覚えておくといろいろな場面で使えます(ピボットテーブルで抽出したデータを穴アキ箇所を埋める、とか)。 なので、覚えておくとよいですよ。 では、シーユーアゲン!

Copyright(C)森田表計算