Excel2013対応
---topics:並べ替え、イコール式---

其ノ2 並べ替える まとめる 前編

第2回です。
実は、このページの一番上に水平に走っている赤いバーに、その回のトピックを置いています。
今回のトピックは「並べ替え」と「イコール式」。
「イコール式」ってことばは、私が勝手にそう呼んでいるだけなのでポピュラーじゃないかもしれません。何を指しているのかは以下解説していきますので。
「並べ替え」は、Excel触る人なら誰もが使う機能だと思います。誰もが使う機能だからこそ、基本的なことを知っていてもらいたいなと思って、今回のテーマとしました。
今回は、実際にデータを眺めながらお話していきましょうか。まず、こちら↓からExcelファイルをダウンロードしてください。

<ダウンロードについて>
今、このページをご覧いただいているブラウザの種類にもよりますが、おそらく、上のリンクをクリックすると、別ウィンドウが開き、中にExcelのシートが表示されると思います。 そのシートを「名前をつけて保存」してください。
保存先は、自分の使いやすいところで。デスクトップなり、デスクトップに今日の日付をつけた一時フォルダを作ってその中、とか。

送られてきたデータ
※1 練習データ その1

開くとこんな※1です。通販で扱う商品のデータ、というイメージです。 ノートやらメモ帳やらのデータが並んでますね(注:データの内容は架空のものです)。
各項目の意味を解説しておくと、
  ・注文番号…注文用紙に記入する際の番号。商品の名前を長々と書く代わりに使われますね。「MX9898」×2、とか。
  ・メーカー名…製造メーカーの名前。
  ・商品名…商品の名前。
  ・メーカー型番…メーカー側で商品を特定するために振っている記号。
  ・提供価格…お値段。
  ・入力日…データを入力した日付。
てな感じです。
…さて、あなたは上司に、「注文番号ダブってたら解消しといて~」と軽~い感じで言われました。
さて、どうしましょうか。
 ・
 ・
上司は軽~く言ってきましたけど、この依頼、一気に2つのことを言ってます。つまり、
 1.注文番号に重複がないか調べる
 2.もし重複があれば解消する
と。この2つの作業を順番に片づけていかねばなりません。
…ところで、なぜ注文番号の重複が問題になるのでしょう? というか、そもそもなぜ、商品情報の重複が発生してしまうのでしょう?
まず、重複の発生について。 こういうケースを想定してください。 例えば3人の営業さん、Aさん、Bさん、Cさんがいます。彼ら3人がそれぞれいくつかの商品を担当し、各人が自分の持っている商品情報を送ってきます。 本部にいるあなたはそれをとりまとめて、ひとつの表に合体しました。 けれども、例えばAさんとBさんで担当する商品がかぶっていた。彼らは同じ商品についてそれぞれ情報を送ってきます。 そうなると、あなたのところで情報をとりまとめたとき、ダブリが発生してしまいます。
そして、重複がなぜ問題かというと、同一の商品なのに複数の情報がある、というのは混乱の元だからです。 しかも、もしその情報に差異があったら。大きさが違う。重さが違う。特に、価格が違ったら大問題です。 ここで話題にしている「注文番号」っていうのは、われわれ消費者が注文するときのキーであると同時に、 企業側が商品管理する際のキーでもあるんですよ。 なぜなら、注文番号というのは、一意性というか、ユニークなものでなければならない、という大前提があるからです。 けれども、その注文番号(正確には、注文番号にひもづく商品情報)が複数存在したら。 例えば、極端な例ですが、100円の消しゴムと100,000円のテーブルが同一の注文番号になっちゃってて、 消しゴムを注文したお客さんのところにテーブルが届いちゃった、なんてことになったら、企業の根幹に関わるクレームが来るでしょう。 だから、注文番号の重複に神経をとがらせているんです。

でも、2.の重複の解消ってどういう状態のことでしょうか? 上司に尋ねると、「ダブってたら単純に片方消して良い。1コにして欲しい」とのことでした。 …うーん、本当にそれで良いのか?…まあ今回は、重複する商品情報に差異はないという想定のもと、 単純に重複情報を1コにするやり方を考えていきましょう。

 ・
 ・
まず、重複があるかどうか調べましょう。どうやりますか?

「よし!検索しよう!」…こういう根性で何とかしようとする人、個人的には嫌いじゃないので、ちょっと付き合ってください。
ctrl+Fで検索画面出して、一番最初の注文番号「MX9898」を検索!

検索
※2 検索してみた

あ、3コ出てきた※2。ということは、ダブりがあることは確定だね!
…って、今回はたまたま一発目からダブりにぶつかったから結果オーライですが、このやり方だと、このExcelはデータが175件あるんですが、最悪174回ctrl+Fを押さなきゃいけない。 まだこれは200弱だから何とかなるかもしれないけど、1000件以上あるデータとかだと何時間あっても足りません。
こういうときは関数使いましょう。countif関数です。

=COUNTIF(範囲,検索する値)

countif関数は、ある範囲の中の、重複数を調べる式です。最初に①範囲を指定し、次に②調べたい値を指定します。 今回調べたいのは「注文番号」ですから、こんなふうにしてみましょう。
まず、「注文番号」の右に1列追加しましょう。そんで、一番上に項目名を作りましょう。「重複」でよいかな。
次に、1コ目のデータ「MX9898」の隣に、「=countif(」と入力してください。 「((カッコ)」まで入力すると、範囲を指定するよう促してくるので、範囲として注文番号の列全体を選択※3します。 Excelの「A」のあたりにマウスを合わせると下向きの矢印が現れるので、その状態でクリックすると、「A」列全体、すなわち注文番号全体が選択されますよ。

countif範囲
※3 countif 範囲選択

範囲を選択したら「,(カンマ)」を入れてください。カンマは半角ですよ。
次いで、検索する値として、左隣のセルA2を選択※4します。 こうすることによって、A列、つまり「注文番号」の値全部に対して、A2の値、すなわち「MX9898」を照合して、重複数を出してくれるわけです。

countif検索の値
※4 countif 検索の値の指定

)(とじかっこ)」も忘れず入れてね。
ということで、式を入力しました。答えとして、「1」とか「2」とか「3」とかの「数値」が返ってくるはずなのですが…
あれ?=COUNTIF(A:A,A2)っていう、式の表示のままですね。
これは、セルの書式設定が「文字列」だからです。列を挿入するとき、隣のセルと同じ表示形式になってしまうのですが、隣の「注文番号」列が「文字列」に設定されているせいで、こうなってしまうのです。 お手数ですが、右クリックでセルの書式設定を「標準」に直して※5、あらためて式を入れてくださいな。

セルの書式設定
※5 セルの書式設定

よしよし。あとはこの式をコピって、「重複」列(あなたが追加した列ですよ)のおしりまで貼り付けしてください。こんな感じになるはずです※6

重複調査
※6 関数を全部入れた 注:写真は色を付けてあります。ガンプラのパッケージと一緒ですね。

関数をコピーをして貼り付けると、2コ目のデータ「GX5361」のところでは、式が=COUNTIF(A:A,A3)になる、 つまり、範囲全体に対して2コ目のデータ「GX5361」を照合するよう自動的に調節されます。そのうえで、計算結果が表示されます。
3コ目なら=COUNTIF(A:A,A4)です。今度は「GX5363」が照合されるようになります。 確認しておいてください。
さて、countif関数を入れた結果、重複数、「1」とか「2」とか「3」とか…が回答として返されてきます。 「1」なら問題ないわけですよ。重複してないわけですから。というか、絶対1コはあるはずですよね。 「0」が返ってきたとしたら、式の書き方を間違えたと思ってください。
「2」とか「3」のとき、それがダブってる値です。
…けっこうダブりありますね。

では次に、重複を解消していきましょう。…さて、どうやって解消しましょうか。
関数初心者の中には「重複と言えばcountif」と覚えてる人もいるかと思うのですが、countifでは「重複してる/してない」はわかっても、「重複の解消」はできないんですよ。 つまり、ダブってるのを1コにすることはできないんです。そりゃそうですよね、フィルタでcountifの結果が「2」や「3」のところを抽出しても、「ダブってるアイテムはコレです」ってことがわかるだけで。 手作業で解消していきます?2つあるものを1コ消して…って。

もうちょっとスマートなやり方で、やってみましょうか。
まず、注文番号を昇順で並べ替えます。ようやく今回のテーマのひとつ、「並べ替え」が登場しましたね。 「昇順」っていうのは若い順のこと、数字なら「1、2、3、…」、アルファベットなら「A、B、C、…」のことです。逆は「降順」です。 そして、ここがポイントなんですが、並べ替えを実行すると、注文番号が同じものは上下隣り合わせに並ぶんですよ。
ということで、並べ替え、やってみましょう。※7

並べ替え
※7 並べ替えるんだけど…

 ・
 ・
おおっと、ちょっと待った!
いきなり並べ替えていませんか?それやっちゃうと、ちょっとまずいんですよ。
というのは、この表、罠がありまして。右の「提供価格」と「入力日」の間が1列空いてるじゃないですか。 こういうアキがあると、Excelは、そこから先を表として認識してくれないんですよ。 上の画像を見てください。並べ替えの範囲は「提供価格」までですよね。「入力日」は範囲の外です。 この状態で並べ替えを実行してしまうと、左側は並びが移動するのに、右は動かないから、表としての関係性がおかしくなってしまう。 だから、並べ替えのときは、忘れず範囲を指定してほしいんですよ。 コレ、並べ替えだけでなく、置換とかフィルタとかにも言えることです。 範囲指定、習慣にしてください。

<この機会にちょっとお話>
本当は、こういう1列アキのある表は、危険なんですよ。自分ひとりがこのExcelに触っているのであれば、まだ問題は少ないのですが、 いろんな人が触るようであれば、この表の運用はやめた方がいいでしょう。なぜなら、みんながみんな、きちんと範囲を選択してくれるとはかぎらないからです。
なので、アキのない表を運用するのがベストなんです、が、どうしても空けておかなければならないときは、「未使用列」とか適当な名前をつけて、一番上の項目名だけ埋めましょう。 2行目以降からっぽでもよいので。こうしておけば、たとえ範囲指定を忘れても、Excelはちゃんと最右列まで表として認識してくれます(今回は、勉強のために、アキのあるまま進行しますが)。
同様に、一番左の列も、できればおしりまで空白なしにみっちりデータが入っている方が望ましいです。仮に、途中に1行まるまる空白のところがあると、そこまでしか表として認識されないことがあるので。 適当なものがないときは、作っちゃいましょう。僕は「No」列を作って「1、2、3…」と入れることにしています。
実は、このホームページを貫いているテーマは「運用」なんです。ショートカットキーや関数を紹介しているサイトはたくさんあります。 だけど、僕が発信したいのは、「どうすればミスなく仕事ができるのか」、あるいは「どういうときに、どんな作業を、どういう手順で行うか」なんです。

ということで、「入力日」も範囲に含めて、並べ替えを実行しましょう。よろしく。
あともうひとつ。並べ替えた後で、「順番元に戻しといて~」と言われたりすることがあります。 でも、元の順番って、何の順番ですかね?注文番号順ではなさそうですが…。 順番を元に戻すことに作業的に意味があるのかはいまひとつピンときませんが、上司にしかわからないこともありますし、上司は思いつきでものを言ったりしますし、 そういう事態に対応できるように、現状の順番を保存しておきましょう。「1」「2」「3」って番号を入れていけばよいかな。
一番左に新しく列を挿入し、「No」って名前にします。「1」「2」と連番で振ったところで、その「1」「2」を範囲選択する。 そうしておいて範囲右下にカーソルを合わせると、ポインタが十字型に変化します。その状態で一番下までひっぱっていく※8と、 「1,2,3,…,175」と入力されますよ。

No列追加
※8 No列追加

これでどんだけ並べ替えても安心だね!「No」列昇順にすれば元の並びに戻るyo!
というわけで、準備ができたところで、並べ替えましょう。「入力日」まできちんと範囲に含めて※9から、「注文番号」昇順ですよ。

範囲を指定する
※9 範囲をきちんと選択

並べ替え、できました?
並べ替えると、↓こんな感じ※10になります。同じ注文番号がタテに並んでいるのを確認してください。

注文番号昇順で並べ替えました
※10 注文番号昇順で並べ替えました。

ではいよいよ、重複を解消していきましょう。
注文番号のとなりに1列挿入しましょう。項目名は「ダブリの解消」とでもしましょうか。 そんで、今からこの列に式を入れようと思っているので、この列全体の書式を「標準」にしておいてください。右クリックから、ですよ。
そうしたら、次の式を入れてください。

=(B2=B1)

入れ方。C2セルを選択して、「=(」と入力します。そしてまず、隣のセル、B2セルを選択してください※10

イコール式を入れる
※11 イコール式を入れる

で、も1コ「=」を入れます。そうして今度は、B1セルを選択します※11

イコール式を入れる つづき
※12 イコール式を入れる つづき

おしりに「)」、入れてやってくださいね。
この式の意味、わかりますよね?「1コ上の注文番号とイコールか否か」を計算してるんです。 この手の式を私は(勝手に)「イコール式」と呼んでます。 計算結果は、イコールなら「TRUE(トゥルー)」、イコールじゃないなら「FALSE(フォルス、「ファルス」じゃないよ!「ファルス」だと「男根」になっちゃう!)」が返ってきます。
1コ目(2行目)の値は、当然「FALSE」ですね。当たり前ですよね。「注文番号」って項目名と「A52018」を比較しているんですから。
ではこの式を、最下段までコピってください。そうすると現在、同じ注文番号は上下に並んでいるので、ダブっている注文番号の2コ目以降は「TRUE」が返ってくるはずですよね※13

イコール式を入れた
※13 イコール式を入れた 注:写真は色を付けてあります。

できました?こうすると、重複数「1」のものは全部「FALSE」、重複「2」以上のものは、一番上の1コだけが「FALSE」で、ダブってる2コ目以下が「TRUE」になりますよね? ということは、この「TRUE」だけを削除してやればよいんですよ。
では、フィルタをかけて「TRUE」を抽出しましょう。
 ・
 ・
おっと!範囲指定、忘れてませんか?入力日も仲間に入れてくださいね。
フィルタをかけるとタイトル行に▼下向き三角が付きます※14

フィルタ
※14 フィルタ

▼下向き三角をポチっとやって、「TRUE」を抽出しましょう※15

TRUE抽出
※15 TRUE抽出

「TRUE」だけが表示されました。ではいよいよ、こいつらを行ごと削除してやりましょう!※16

重複削除
※16 重複削除

フィルタを「すべて」にして確認してみましょう。いやーこれで重複がなくなった!
…あれ?何だろう「#REF!」って※17

#REF!?
※17 #REF!?

実はこの「#REF!」とは、関数エラーってやつでして。 元々はこの式、=(B84=B83)という式だったんですよ。だけど、B83を削除しちゃったから、「参照セルが見つからないよ!」ってエラーを発信してるんです。
実は、今回に限っては、このエラーが出ても気にしなくてよかったりするんですが、ちょっと気持ち悪い。 それに、エラーが出たら「何だろう?」って考えるクセは、身につけておくべきです。 なので、TRUEを削除する前に戻って、エラーが出なくなるようひと手間加えましょうか。
「戻る」ボタンで削除前の状態に戻ってください。フィルタも「すべて」に戻しておいてくださいね。

まず、「ダブリの解消」列(「TRUE」「FALSE」の式が入っている列)を、1列まるまるコピーしてください※18

列ごとコピー
※18 列ごとコピー

そして、同じ場所に、右クリック→「形式を選択して貼り付け」→「値」と選択し、貼り付けます※19

値で貼り付け
※19 値で貼り付け

この一連の作業、私は「値貼り」と呼んでるんですが、こうすると、値が固定されるんですよ。元々この列には式が入っていました。 だから、もしこの状態で注文番号をいじったら、TRUEがFALSEになったりFALSEがTRUEになったりと、表示が変動するんです。 だけど、値貼りをすると、セルの中身は、=(B2=B1)という式ではなくて、「TRUE」「FALSE」という文字列になります※20。 こうしておけば、もし注文番号をいじっても、再度並べ替えたり削除したりしても、「TRUE」「FALSE」の値が変動することはありません。

値貼りすると…
※20 値貼りすると…

関数を入れたら基本的には値貼りするものだ、と思ってください。式を入れた後、当然もろもろ作業するじゃないですか。 そのときに、値がころころ変わっちゃったら困るわけで。なので、関数入れたら値貼り、コレ、覚えておいてください。

と、いうことで、改めて※15・※16の作業を行ってください。作業後の件数は159件(160行)になるはずです。

※実は、Excel2007から、「重複の削除」ってボタン、あるんですよね。これを使えば上述の作業は不要なのですが、Excel2003以前の人を仲間はずれにするわけにはいかない ですし、それに、重要なのは、操作を通じてExcel仕事を身につけてもらうことなので、「なーんだムダな作業だったのか」なんて思うことなきよう。


これで、とりあえず重複の解消はできました。 「ホントにできたかな?」と思ったら、注文番号に対してもう一度countif関数を当ててみてください。結果がALL「1」になるはずですので。
今回のポイントは、並べ替えると同じコードはタテ並びにまとまる、ってことですね。覚えておいてください。

では、つづけざまに問題その2!「重複していたら、入力日の新しい方を残して」とオーダーされたら、どうしますか?
つまり、入力日が新しい=情報が正、って考える場合なんですけど、どうやりましょうか。 ちょっと考えてみてください。
 ・
 ・
わからなかった人、大丈夫ですよ。大事なのは、考え方を身につけることですから。わからない経験も財産です。
さて、考え方は、実はこれまでと同じで大丈夫。ただ、並べ替えのときにひと工夫加えます。
イコール式を入れると、一番上が残るんでしたね。ということは、一番上に日付の新しいものが来れば、同じやり方で対処できる、ということになりますよね。
だから、並べ替えのときに、注文番号:昇順にプラスして、入力日:降順とオーダーします。
そうすれば、一番上に日付の新しいデータが来るので、あとは、イコール式でTRUEを削除すれば解決。よしよし。

では、もし、「注文番号がダブってたら、商品名、および価格を比較して、もし差異があったら、その箇所を教えてもらえる?」 と上司からオーダーされたら、どうしますか?
 ・
 ・
これはちょっと手強いですね。ページを改めて、其ノ4で、解説しましょうか。

Copyright(C)森田表計算