其ノ9 データ重複と並べ替え 前編
ハイ。 今回は、「データの重複」ってヤツを、2回に分けてやっていきたいと思います。 データ重複って、おそらくみなさんもお仕事するなかで耳にしたことあるかと思うのですが、どういう状態かというと、例えば、こんな↓データがあったときに…※1。
同じデータが複数ある状態を言います※2。
同じレコードが複数ある(データ1件1件のことを「レコード」と言います)のははっきり言ってムダですし、また、…実は、こういうレコード重複があるデータを仕事で運用しちゃうと、いろいろと害が発生するおそれがあります(後述します)。
なので、ぜひとも解消するよう、お仕事では求められます。
この場合の「重複の解消」とは、「複数存在するレコードを1件にする」という意味です。
つまり、2件あるものは片方削除して1件にしたい、ということ。
ちょっと、やってみましょうか。
レコード重複がなぜ問題か
では、いつものように、下↓からダウンロードお願いします。
開くとこんな↓です※3。
シートが2枚あるのですが、実は内容は同じです(笑)。
今日は2つ課題をやろうと思いまして。
まあ、まず、1枚目のシート「れんしゅう1」を見ていきましょう。
・
・
…ハイ。
では、このデータ。
通販で扱う商品のデータ、というイメージです(データの内容は架空のものです)。
各項目の意味を、かんたんに解説しておくと、
・注文番号…注文用紙に記入する際の番号。
商品の名前を長々と書く代わりに使われますね。
「MX9898」×2、とか。
・メーカー名…製造メーカーの名前。
・商品名…商品の名前。
・メーカー型番…メーカー側で商品を特定するために振っている記号。
・提供価格…お値段。
・入力日…データを入力した日付。
てな感じです。
…さて、あなたは上司に、「注文番号ダブってたら解消しといて~」と軽~い感じで言われました。
はて、どうしましょうか。
・
・
上司は軽~く言ってきましたけど、この依頼、一気に2つのことを言ってます。
つまり、
1.注文番号に重複がないか調べる
2.もし重複があれば解消する
と。
この2つの作業を順番に片づけていかねばなりません。
…ところで、なぜ注文番号の重複が問題になるのでしょう?
それは、同一の商品なのに複数の情報がある、というのは混乱の元だからです。
しかも、もしその情報に差異があったら。
大きさが違う。
重さが違う。
特に、価格が違ったら大問題です。
ここで話題にしている「注文番号」っていうのは、われわれ消費者が注文するときのキーであると同時に、企業側が商品管理する際のキーでもあるんですよ。
なぜなら、注文番号というのは、一意性というか、ユニークなものでなければならない、という大前提があるからです。
けれども、その注文番号(正確には、注文番号にひもづく商品情報)が複数存在したら。
例えば、極端な例ですが、100円の消しゴムと100,000円のテーブルが同一の注文番号になっちゃってて、消しゴムを注文したお客さんのところにテーブルが届いちゃった、なんてことになったら、企業の根幹に関わるクレームが来るでしょう。
だから、注文番号の重複に、みな神経をとがらせているんです。
では、重複を解消していきましょうか。
重複を解消する仕方、というか、ルールには、現場現場でいろいろなルールがあったりするのですが、今回はまず、「ダブってたら単純に片方消して、1コにする」というやり方をやっていきましょう。
すっごく単純に、ダブリをなくす
では、「れんしゅう1」シート、使います。
単純に、レコード重複をなくしていきましょう。
まず、重複があるかどうか調べましょう。
さて、どうやりますか?
・
・
「よし!検索しよう!」
…こういう根性で何とかしようとする人、個人的には嫌いじゃないので、ちょっと付き合ってください。
ctrl+Fで検索画面出して、一番最初の注文番号「MX9898」を検索!※4 ※5
あ、3コ出てきた。
ということは、ダブリがあることは確定だね!
…って、今回はたまたま一発目からダブリにぶつかったから結果オーライですが、このやり方だと、このExcelはデータが175件あるんですが、最悪174回ctrl+Fを押さないといけない。
まだこれは175件だから何とかなるかもしれないけど、1000件以上あるデータとかだと何時間あっても足りません。
こういうときは関数使いましょう。
countif関数です。
=countif(範囲, 検索する値)
countif…、「カウントイフ」と読みます。
ある範囲の中の、重複数を調べる式です。
最初に1:範囲を指定し、次に2:調べたい値を指定します。
今回調べたいのは「注文番号」ですから、こんなふうにしてみましょう。
まず、「注文番号」の右に1列追加しましょう。
そんで、一番上に項目名を作りましょう。
「重複」でよいかな※6。
次に、1コ目のデータ「MX9898」の隣に、「=countif(」と入力してください。 「((カッコ)」まで入力すると、範囲を指定するよう促してくるので、範囲として注文番号の列全体を選択※7します。 列番号の「A」のあたりにマウスを合わせると下向きの矢印が現れるので、その状態でクリックすると、「A」列全体、すなわち注文番号全体が選択されますよ。
範囲を選択したら「,(カンマ)」を入れてください。
カンマは半角ですよ。
次いで、検索する値として、左隣のセルA2を選択※8します。
こうすることによって、A列、つまり「注文番号」の値全部に対して、A2の値、すなわち「MX9898」を照合して、重複数を出してくれる、というワケです。
「)(とじかっこ)」も忘れず入れてね。
ということで、式を入力しました。
答えとして、「1」とか「2」とか「3」とかの「数値」が返ってくるはずなのですが…。
…あれ?
=countif(A:A,A2)っていう、式の表示のままですね※9。
…失礼しました。
これは、セルの書式設定が「文字列」だからです。
列を挿入するとき、隣のセルと同じ表示形式になってしまうのですが、隣の「注文番号」列が「文字列」に設定されているせいで、こうなってしまうのです。
なので、お手数ですが、右クリックでセルの書式設定を「標準」に直して※10、あらためて式を入れてくださいな※11 ※12。
「3」という数値が返ってきました。
これは、「指定した範囲(今回の場合だとA列)にA2の値(MX9898)が3コありますよ」って意味です。
ためしに、フィルタでMX9898を抽出して、確かめてみましょう※13 ※14。
やっぱり、countifの計算どおり、3件ありましたね、MX9898。
では、この式をコピって、おしりまで式を埋めてください。
こんな感じになるはずです※15。
関数をコピーをして貼り付けると、2コ目のデータ「GX5361」のところでは、式が=COUNTIF(A:A,A3)になる、つまり、範囲全体に対して2コ目のデータ「GX5361」を検索するよう自動的に調節されます。
そのうえで、計算結果が表示されます。
3コ目なら=COUNTIF(A:A,A4)で、「GX5363」が検索されるようになります。
確認しておいてください。
さて、countif関数を入れた結果、重複数、「1」とか「2」とか「3」とか…が回答として返されてきます。
「1」なら問題ないわけですよ。重複してないわけですから。
というか、絶対1コはあるはずですよね。
自分自身の1コが必ずありますから。
「0」が返ってきたとしたら、式の書き方を間違えたと思ってください。
「2」とか「3」のとき、それがダブってる値です。
…けっこうダブリありますね。
では次に、重複を解消していきましょう。
さて、どうやって解消しましょうか。
関数初心者の中には「重複と言えばcountif」と覚えてる人もいるかと思うのですが、countifでは「重複してる/してない」はわかっても、「重複の解消」はできないんですよ。
つまり、ダブってるのを1コにすることはできないんです。
そりゃそうですよね、フィルタでcountifの結果が「2」や「3」のところを抽出しても、「ダブってるアイテムはコレです」ってことがわかるだけで。
ということで、せっかく作ってもらって関数まで入れてもらったのに残念なのですが、「重複」列、削除しておいてください。
もう使いませんので。
あしからず。
…「なんだよ無駄かよー」とか思わないでください。
割とExcel仕事では、こういう調査のための列づくり、やるんですよ。
なので、「こういうこともあるんだ」くらいに思っていただければ。
さてはて、では、重複解消の仕方です。
まず、注文番号を昇順で並べ替えます。
…ようやく今回のテーマのひとつ、「並べ替え」が登場しましたね。
「昇順」っていうのは若い順のこと。
数字なら「1、2、3、…」、アルファベットなら「A、B、C、…」のことです。
逆は「降順」です。
そして、ここがポイントなんですが、並べ替えを実行すると、注文番号が同じものは上下隣り合わせに並ぶんですよ。
ということで、並べ替え、やってみましょう。※16
・
・
おおっと、ちょっと待った!
いきなり並べ替えていませんか?
それやっちゃうと、ちょっとまずいんですよ。
というのは、この表、罠がありまして。
右の「提供価格」と「入力日」の間が1列空いてるじゃないですか。
こういうアキがあると、Excelは、そこから先を表として認識してくれないんですよ。
画像を見てください。
並べ替えの範囲は「提供価格」までですよね。
「入力日」は範囲の外です※17。
この状態で並べ替えを実行してしまうと、左側は並びが移動するのに、右は動かないから、表としての関係性がおかしくなってしまう。
だから、並べ替えのときは、忘れず範囲を指定してほしいんですよ。
コレ、並べ替えだけでなく、置換とかフィルタとかにも言えることです。
なので、範囲指定、習慣にしてください。
<この機会にちょっとお話>
本当は、こういう1列アキのある表は、危険なんですよ。
自分ひとりがこのExcelに触っているのであれば、まだ問題は少ないのですが、いろんな人が触るようであれば、この表の運用はやめた方がいいでしょう。
なぜなら、みんながみんな、きちんと範囲を選択してくれるとはかぎらないからです。
なので、アキのない表を運用するのがベストなんです、が、どうしても空けておかなければならないときは、「未使用列」とか適当な名前をつけて、一番上の項目名だけ埋めましょう。
2行目以降からっぽでもよいので。
こうしておけば、たとえ範囲指定を忘れても、Excelはちゃんと最右列まで表として認識してくれます(今回は、勉強のために、アキのあるまま進行しますが)。
同様に、一番左の列も、できればおしりまで空白なしにみっちりデータが入っている方が望ましいです。
仮に、途中に1行まるまる空白のところがあると、そこまでしか表として認識されないことがあるので。
適当なものがないときは、作っちゃいましょう。僕は「No」列を作って「1、2、3…」と入れることにしています。
実は、このホームページを貫いているテーマは「運用」なんです。
ショートカットキーや関数を紹介しているサイトはたくさんあります。
だけど、僕が発信したいのは、「どうすればミスなく仕事ができるのか」、あるいは「どういうときに、どんな作業を、どういう手順で行うか」なんです。
ということで、「入力日」も範囲に含めて、並べ替えを実行することにしましょう。
あともうひとつ。
並べ替えた後で、「順番元に戻しといて~」と言われたりすることがあります。
でも、元の順番って何の順番ですかね?
注文番号順ではなさそうですが…。
順番を元に戻すことに作業的に意味があるのかはいまひとつピンときませんが、上司にしかわからないこともありますし、上司は思いつきでものを言ったりしますし、そういう事態に対応できるように、現状の順番を保存しておきましょう。
一番左に新しく列を挿入し、「No」って名前をつけ、連番を振っておけばよいかな※18。
これでどんだけ並べ替えても安心だね!
「No」列昇順にすれば元の並びに戻るyo!
というわけで、準備ができたところで、並べ替えましょう。
「入力日」まできちんと範囲に含めて※19から、「注文番号」昇順ですよ。
あ、もし「最優先されるキー」のところで、項目名じゃなく「A列、B列、C列、…」って出てきちゃったら、「先頭行をデータの見出しとして使用する」にチェック入れてくださいね。
そうすれば項目名が表示されるようになります。
さて、並べ替え、できました?
並べ替えると、↓こんな感じ※20になります。
同じ注文番号がタテに並んでいるのを確認してください。
ではいよいよ、重複を解消していきましょう。
注文番号のとなりに1列挿入しましょう。
項目名は「重複の解消」とでもしましょうか。
そんで、今からこの列に式を入れようと思っているので、この列全体の書式を「標準」にしておいてください※21。
右クリック、ですよ。
そうしたら、次の式を入れてください。
=(B2=B1)
…イコール式です。
式の意味は、「注文番号が、1コ上のとイコールかどうか」ということになります※22。
…ん?
いまいちピンときてませんか?
では、式をおしりまでコピってみましょう。
何が見えてくるでしょうか※23。
同じ注文番号が2コ並んでいるとき、2件目だけが「True」になっていますね。
なぜなら、並べ替えを実行したおかげで、同じ注文番号は上下に並んでいるからです。
ちょっと、上からデータを眺めてみてください。
1件しかない(重複ナシの)レコードはFalseで、2コ並んでいるときの1件目もFalse。
複数レコードあるときの2件目、3件目だけがTrueになるんです。
と、いうことは?
…そうです。
Trueのところだけ削除すれば、重複ナシのデータができあがる、というワケです。
この作業のポイントは、並べ替えを実行して同じ注文番号をひとかたまりにまとめておく、というところですね。
そいで、以前はヨコ隣との比較に使ったイコール式を、タテに使うところですね。
と、いうことで、Trueのところを削除してやりましょう。
フィルタをかけて、と…。
・
・
おおっと!
範囲指定、忘れてませんか?
入力日も仲間に入れてくださいね。
フィルタをかけるとタイトル行に▼下向き三角が付きます※24。
▼下向き三角をポチっとやって、「TRUE」を抽出し、コイツらを行ごと削除してやりましょう※25 ※26。 そうすれば、いよいよ重複のないデータの完成です!
そんで、フィルタを「すべて」にしてやれば、重複のないデータが完成するのですが…。
…あれ?
何だろう、「#REF!」って※17?
…実は、この「#REF!」って、関数エラーってやつでして。
元々はこの式、=(B84=B83)という式だったんですよ。
だけど、83行目を削除しちゃったから、「参照セルが見つからないよ!」ってエラーを発信してるんです。
実は、今回に限っては、このエラーが出ても気にしなくてよかったりするんですが、ちょっと気持ち悪い。
それに、エラーが出たら「何だろう?」って考えるクセは、身につけておくべきです。
なので、TRUEを削除する前に戻って、エラーが出なくなるようひと手間加えましょうか。
「戻る」ボタンで削除前の状態に戻ってください。
フィルタも「すべて」に戻しておいてくださいね。
…なんか、僕のExcelだと、「戻る」を実行しても#REF!が残ったままなんだけど…、まあ仕方ない。
=(B2=B1)のイコール式を入れ直して対応しよう。
んで、エラー出なくなる対応策。
イコール式を入れた列(「重複の解消」列)を値貼りします※28 ※29。
そうすれば、「#REF!」のエラーは出なくなります。
これをやっておくとさきほどの参照エラーは出なくなるのですが、なぜ出なくなるかというと、値貼りをすることで値が固定されて、さっきまで数式だったところが、「TRUE」「FALSE」という文字列になるからです※30。
関数を入れたら基本的には値貼りをするものだ、と思っておいてください。 数式のままだと、作業しているあいだに値がころころ変わってしまうので。 もちろん、経理の仕事なんかだと式のままの方が適しているのですが、今回のような作業の場合、式を入れたところの値が変わってしまったりエラーになったりすると困るわけで。 なので、関数入れたら値貼り、覚えておいてください。
以上、エラー出なくなる対策、終わり。
ということで、さきほどの作業、再度やってみてください※31 ※32。
作業後の件数は159件(160行)になるはずです。
…念のため、本当に重複がなくなったかたしかめてみますか。
さきほどのcountif関数を使ってたしかめてみましょう。
=countif(B:B,B2)ですよ。
この計算の結果が、全部「1」なら、重複がなくなった、ということですよね。
どうでしょうか※33 ※34。
大丈夫みたいですね。
今回の作業、覚えられましたでしょうか。
重複をなくすときは、
1. 並べ替えをする
2. そのうえで、イコール式をつかって重複してる箇所を割り出す
となります。
ちょっとむずかしいですが、練習してみて、ロジックが身につくようやってみてください。
※実は、「データ」のところに、「重複の削除」って機能、あるんですよ。
これを使えば、単純な重複の削除だったらすぐさまできちゃったりするのですが、…うーん、何というか、使い勝手が悪いんですよね。
応用が利かない、というか。
使いこなせば便利な機能ではあると思うのですが、今回は、手作業でやってもらいました。
それに、「重複の削除ということで、どういう作業をしなければいけないか」を体感してもらうためにも、上のような工程をやってもらった次第。
なので、もし余裕がありましたら、「重複の削除」機能もためしてみてください。
日付の新しい方を残す
さて、上記は「単純にダブリをなくす」というものでした。
では、次の問題!
今度は、「重複していたら、入力日の新しい方を残して」というオーダーです。
つまり、同じ注文番号が2件重複していたら、日付の古い方を削除して、新しい方を残す、ということです。
要は、入力日が新しい=情報が正、ってことなんでしょうけど、さて、どうやりましょうか。
2枚目のシート「れんしゅう2」にさきほどと同じデータを用意してあります※35ので(「れんしゅう1」はさっきさんざんいじくっちゃったもんね)、ちょっと考えてみてください。
・
・
わからなかった人、大丈夫ですよ。
大事なのは、考え方を身につけることですから。
わからない経験も財産です。
さて、考え方は、実はこれまでと同じで大丈夫。
ただ、並べ替えのときにひと工夫加えます。
イコール式を入れると、一番上が残るんでしたね。
ということは、複数レコードがあるときに、一番上に日付の一番新しいものが来れば、同じやり方で対処できる、ということになりますよね。
つまり、もし下↓のように並べ替えることができたら…※36。
だから、並べ替えのときに、注文番号:昇順にプラスして、入力日:降順とオーダーすれば。
そうすれば、一番上に日付が一番新しいデータが来るので、あとはさきほどと同様、イコール式でTRUEを削除すればOK。
なので、並べ替えのときに、「最優先されるキー:注文番号」とした後、「レベルの追加」をして「次に優先されるキー」を表示させ、「次に優先されるキー:入力日」とし、順番を「降順」とします※37 ※38。
この状態で並べ替えを実行すると、ベースは注文番号:昇順なのですが、そのなかで、もし同じ注文番号があったら、だから例えばもし「MX9898」が3件あったら、そのなかで入力日:降順で、つまり日付が新しい順に並び替えられます。
ね? なってるでしょう?※39
あとはさきほどと同様、イコール式で1コ上と同じかどうか調べて、で、Trueのところを削除すればOK※40。 そうすれば、日付の古いものを削除し、新しいものを残すことができます。
いかがでしたでしょうか。
重複の解消は、けっこういろいろな場面で要求される作業です。
また、後々お話しますが、vlookup関数を使うときに、準備作業として必要だったりすることも多いです。
なので、みなさんも、重複解消の仕方、練習しておいてください。
次回は後半戦、「重複してるレコードに差異がある場合」をやりますよ。
では、See You!