---topics:vlookup関数、column関数---

其ノ19 変わったところはどこ? 後編

ハイ、前回のつづきです。
前回は、2つのExcelデータの差分を割り出す、ということをやりました。 その際、条件付き書式を使ったんでしたね。
今回は、その応用編です。
例によって、ダウンロードをお願いします。

開くとこんな↓※1 ※2になってて、例によってシートが2つあるんですが。

kiso19_datahikaku_1.xlsx 1つ目のシート(最新データ)
※1 kiso19_datahikaku_1.xlsx 1つ目のシート(最新データ)
2枚目のシート(3日前のデータ)だが、並び順がちがう
※2 2枚目のシート(3日前のデータ)だが、並び順がちがう

前回は「並び順が同じ」でしたが、今回は「並び順がちがう場合」です。
では、やっつけていきますか。

並び順がちがう→並べ替えてやればよい

タイトルで回答を書いてしまいましたが(笑)、並び順がちがうんだったら同じ並びに並べ替えてやればよいんですよ。
いきなり答えを書いてしまって申し訳ない。 学生のころ、数学の問題がわからなくてつい答えを見ちゃうんだけど、答えを見ても「なぜ1行目がこうなるのかわからない」ってこと、頻繁にあったのですが、…でもね、結局アレって、「経験値がないから」なんですよ。 経験していけば、理屈は勝手についてくる。 なので、わからなかった方、安心してください。 経験値を積んでいけば、おのずと着想できるようになります。 …ということで、ついてきてくださいね。

なので、両シートとも並べ替えてやりましょう。
まず、「最新データ」シートの方。
でね、並べ替えの前に準備として、「no」列を新しく作って連番を振っておきます※3

no列を新しく作り、1から順に連番を振っておく
※3 no列を新しく作り、1から順に連番を振っておく

こうしておけば、並べ替えた後になってもし「元の順番に戻したい!」ってなっても、戻すことができます。 なので。
では、注文番号:昇順で並べ替えてやりましょう※4 ※5 ※6

データ→並べ替え 範囲はきちんと選択しましょう
※4 データ→並べ替え 範囲はきちんと選択しましょう
注文番号:昇順
※5 注文番号:昇順
注文番号が若い順に並べ変わった
※6 注文番号が若い順に並べ変わった

ハイ、注文番号順に並び変わりました。
では続いて、次のシート「3日前のデータ」の方も同様に ※8 ※9

いつでも元の順に戻せるように「no」列を作って連番を振る
※7 いつでも元の順に戻せるように「no」列を作って連番を振る
データ→並べ替え 注文番号:昇順
※8 データ→並べ替え 注文番号:昇順
これで並び順が揃った
※9 これで並び順が揃った

こっちの「3日前のデータ」の方は並べ替えを実施しても特に並び変わった様子はないのですが…、元々注文番号順だったようですね。 まあ、それならそれで問題ありません。 大事なのは「同じルールで並び替える」こと。 そうすれば、両シートとも同じ並び順になりますので。

ということで、これで準備は終了です。 あとは前回同様、隣にもってきて、条件付き書式で比較してやる※10

「最新データ」シートに戻り、「最新データ」の隣に「3日前のデータ」をもってきて…
※10 「最新データ」シートに戻り、「最新データ」の隣に「3日前のデータ」をもってきて…

で、条件付き書式を設定してやるんだけど、「no」のところはこちらで勝手に入力したものだし違ってて当たり前なので、条件付き書式の範囲に含めなくていいです。 「注文番号」からの範囲を比較してやりましょう※11 ※12

「no」列をよけて、B列とI列、C列とJ列…を比較してやる
※11 「no」列をよけて、B列とI列、C列とJ列…を比較してやる
相対参照にするのを忘れないこと
※12 相対参照にするのを忘れないこと

式は相対参照にすることを忘れないようにしましょう。

さて、条件式を入れました。
…でね、下にずーっと見ていくと、途中ごそっと白いところがあるんですよ※13

ここからズレている
※13 ここからズレている

…ここでちょいと分析してやんなきゃいけないんだけど、…この場合、「3日前のデータ」の「A56068」のレコードがいらないんですよ※14

いらない子
※14 いらない子

つまり、3日前→最新のあいだで削除されたレコード、ってことなんだけど、とりあえずこういうデータ比較の際にはよけいなデータです。 なので、「A56068」は一旦別シートに逃がして、削除してやりましょう。
まず、新しいシートを作り、そこにA56068をコピーして、逃がしてやります※15 ※16

いらないデータといえどもすぐ消さない 一旦別シートに逃がす
※15 いらないデータといえどもすぐ消さない 一旦別シートに逃がす
ヘッダー行ももってくるとわかりやすくてよい
※16 ヘッダー行ももってくるとわかりやすくてよい

で、後はよけいなレコードを削除してやればよい※17 ※18 ※19

右クリック→削除 1行まるまる削除ではないことに注意
※17 右クリック→削除 1行まるまる削除ではないことに注意
削除後は上方向にツメる
※18 削除後は上方向にツメる
こうすると横が揃う
※19 こうすると横が揃う

これであらためて、同じ注文番号のレコードを横並びにすることができました。
今回のように、不要なレコードだからといって後先考えずに即削除したりせず、一旦別シートに逃がすというのは、大事な考え方です。 こうしておけば、後で見たときに「ああ、A56068は最新データでは削除されたんだな」ということもわかりますし。

ハイ、では、1行削除して条件付き書式もズレてしまったので、もう一度条件付き書式を入れ直してください。 お手数ですが※20 ※21

一度条件式をクリア
※20 一度条件式をクリア
再度条件付き書式を入れ直す 差分割り出しはこれの繰り返しです
※21 再度条件付き書式を入れ直す 差分割り出しはこれの繰り返しです

で、見ていくと、やっぱりズレてるところがまだあって※22

まだありました、ズレ
※22 まだありました、ズレ

今度は「3日前のデータ」の方に1レコード分挿入して、横を揃えてやりましょう。
この作業、前回もやりましたね※23 ※24 ※25

「3日前のデータ」のところだけ1レコード分挿入 繰り返すが1行まるまるではない
※23 「3日前のデータ」のところだけ1レコード分挿入 繰り返すが1行まるまるではない
下方向にシフト
※24 下方向にシフト
これで横が揃う
※25 これで横が揃う

ハイ、それでは大変お手数ですが、再度条件付き書式を入れ直してください
ちなみに、行数の調節はあと1か所出てきますので、あしからず※26

ML8734のところで再度「挿入」しないといけないのです
※26 ML8734のところで再度「挿入」しないといけないのです

 ・
 ・
…できました?
こうやって調節しながらやっていくと、最後にはおしりまできれいに揃って、こんな感じになります※27 ※28

最後までやりきると、こうなる
※27 最後までやりきると、こうなる
1行真っ白のところ=新しく追加されたデータ、ってこと
※28 1行真っ白のところ=新しく追加されたデータ、ってこと

けっこう大変でしたね。 特に、削除したり、挿入したり、ちまちま調節するのが。
でも、この作業が「件数が異なるデータを比較する」ときの基本となりますので、覚えておいていただければ。

並び順もちがうし、件数も大きくちがう

ではでは、もう1コやってみましょう。 下記のデータ↓をダウンロード願います。

開くとこんな↓です※29 ※30

最新データは161件
※29 最新データは161件
3日前のデータは145件で、並び順もちがう
※30 3日前のデータは145件で、並び順もちがう

コイツらも、例によって差分を出してやりたい。 ということで、やってみてください。 fight!!

 ・
 ・
…と、いきたいところなのですが、今回のデータ、ちまちま調節していくの、結構大変なんですよ。 だって、横に並べてみたら、結構件数ちがうし※31

並びを揃えて横にもってきたのだが、…こりゃ調節大変だぞ…
※31 並びを揃えて横にもってきたのだが、…こりゃ調節大変だぞ…

もちろん、ちまちま調整していけばいつかはきれいに揃うんですよ。 でも、結構手間…。
なので今回は、ちょっと違ったやり方でいきましょう。 vlookupで一気に横にもってきちゃうことにします。

ということでまず、3日前のデータからヘッダー(見出し)だけコピってください※32
これからここに、vlookupでデータをもってきますので。

ヘッダーだけもってくる わかりやすくなるよう色も変えた
※32 ヘッダーだけもってくる わかりやすくなるよう色も変えた

今回は「no」列も作りませんし、並べ替えもしません。 なぜなら、注文番号をキーにvlookupでデータを引っ張ってきちゃうからです。 なので、並べ替えなくてもvlookupが検索してくれるから、大丈夫。

あ、そうそう忘れてた。 これからvlookupを使うので、その準備として書式統一をやっておきましょう。 書式統一、其ノ13でやった、テキストファイルにコピって戻して文字列にする例のアレです。 覚えてます?
思い出しがてら、ちょっとやってみましょう※33~37

新しく列を挿入し、書式:文字列に
※33 新しく列を挿入し、書式:文字列に
注文番号をコピーし…
※34 注文番号をコピーし…
テキストファイルに貼り付け それを再度コピーして…
※35 テキストファイルに貼り付け それを再度コピーして…
Excelに貼る
※36 Excelに貼る
元の注文番号は削除
※37 元の注文番号は削除

思い出しました?
じゃあ、「3日前のデータ」の方も同様に※38

3日前のデータの方も、書式を文字列にし、テキストファイルに貼りつけ→戻す
※38 3日前のデータの方も、書式を文字列にし、テキストファイルに貼りつけ→Excelに戻す

この一連の作業、vlookupやるときのクセにしておいてほしいんですよ。 実は今回、緑の三角付きになるものは1コもありません(今回の「注文番号」が記号/数字混じりだからです)。 だから、結果的にはムダな工程になってしまうのですが、しかしもし書式が揃っていなくて後になって「やっておけばよかった!」ってなるのはそれこそ大いなるムダです。 なので、準備にひと手間かける、というのは悪くない心がけです。
脱線しました。
ということで、いよいよvlookupを入れていきます。 vlookupの式って、

=vlookup(検索値 , 検索範囲 , 欲しいのは左から何番目? , FALSE)

でしたね。
ということで、式を入れていきましょう。
1コ目の引数はこう↓※39なります。 この式は、後でコピーしたいので、列番号だけ絶対参照にしますよ。 だから$A2ね、$A2。

検索値は$A2
※39 検索値は$A2

指定範囲はもちろん「3日前のデータ」の方ですよね。 こちらも絶対参照※40で指定します。

範囲指定
※40 範囲指定

次は「左から何番目?」の指定。 ココで本日は、column関数を使います。
column関数の「column」とは「列」のことで、参照セルの列番号を表示する関数なんです。 かたちは、

=column(参照セル)

というもの。 例えば、参照セルに「A1」を指定すると、「A」列って(左から)「1」番目の列だから、=column(A1)の値は「1」になります。 =column(B1)だと「2」です。 そしてこの式、行方向はどこまで行っても無視されるので、例えばC列99行目のセルを指定し=column(C99)としても、返る値は「3」になります。
其ノ12でvlookup式をコピーしたとき、「欲しいのは左から何番目?のところは動いてくれると楽なのにな~」と思いましたよね? この部分を、column関数を使って実現しよう、というワケです。

ではさっそく。 vlookupのなかにcolumn関数を埋め込みます。 こんな感じで↓※41 ※42

=column( と入れたら…
※41 =column( と入れたら…
A1セルを選択し、かっこを閉じる これで列番号が参照され1,2,3…とうまい具合に増えていく
※42 A1セルを選択し、かっこを閉じる これで列番号が参照され1,2,3,…とうまい具合に増えていく

こうすれば、この式を横方向にコピーしたときに、1,2,3,…とずれていってくれます
あ、そうそう、ここは絶対参照にしちゃダメですよ! ずれることに意味があるのですから。

あとはいつもの決まり文句「FALSE」で、いっちょうあがり!※43です。

vlookup式を入れました
※43 vlookup式を入れました

なので、式の最終形は

=VLOOKUP($A2,'3日前のデータ'!$A:$E,COLUMN('3日前のデータ'!A1),FALSE)

となります。
試しに、今入れた式を横方向にコピーしてみましょう※44

イイ感じじゃない?
※44 イイ感じじゃない?

うまい具合に機能している、ような感じですね。
これね、何でかって言うと、ちょっと試しに下の実験画面を見てください。 column関数を入れ、A1セルを参照させたものです※45
A1を参照してるので、A1セルの列番号「1」が返ります。

column参照実験
※45 column参照実験

では、この式をとなりにコピってみます。
となりにコピると、B1が参照されるので、結果「2」が返ります※46

式を横にコピーすると、columnの中身も1ずつ増えていく
※46 式を横にコピーすると、columnの中身も1ずつ増えていく

もっと横方向にコピると、3,4,5,…と増えていきます※47
つまり、これを応用して、vlookupの「左から何番目?」の部分を動かしていく、というワケです。

column関数のカラクリ
※47 column関数のカラクリ

ということで、columnの解説は終わり。
ではでは、さきほど入れたvlookup式を、おしりまでコピーしていきましょう※48 ※49

vlookup式をコピーして、おしりまで貼る
※48 vlookup式をコピーして、おしりまで貼る
ところどころ#N/Aがありつつも、とりあえず埋まる
※49 ところどころ#N/Aがありつつも、とりあえず埋まる

式をおしりまでコピーしました。
ところどころ#N/Aがありますが、これは注文番号が見つからなかったところ、つまり3日前のデータから新しく増えたレコードになります。 なので、差し当たりは#N/Aのままでよいでしょう。
ひとまず、式を入れたので、値貼りしておいてください※50

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

ハイ、vlookupを使って一応は「3日前のデータ」をとなりにガバッともってくることができました。
あとは、いつものように条件付き書式を使って比較してやればOKです※51 ※52

条件付き書式を設定する
※51 条件付き書式を設定する
「差異があるところ」と「新規追加されたところ」(=#N/Aのところ)が白ヌキに
※52 「差異があるところ」と「新規追加されたところ」(=#N/Aのところ)が白ヌキに

こんな感じ。
vlookupでとなりにデータを引っ張ることで、並べ替えたり、ちまちま挿入削除したりせずに、差分を割り出すことができました。

あ、でもね、このやり方だと、「3日前のデータ」→「最新データ」間で何が増えたかはわかるんだけど(#N/Aになって1行まるまる白ヌキになるから)、何が減ったかまではわからないんですよ。 なので、countif関数を使って調べてみましょう。
調べるのは「3日前のデータ」シートの方。 「3日前のデータ」シートの空いてる列を使って、countif関数で調査します※53~55。 検索範囲は、「最新データ」シートの方の「注文番号」です。

まずは=countif( と入れて…
※53 まずは=countif( と入れて…
検索範囲は「最新データ」の注文番号
※54 検索範囲は「最新データ」の注文番号
検索条件は「3日前のデータ」に戻り、そこの注文番号1コ
※55 検索条件は「3日前のデータ」に戻り、そこの注文番号1コ

できました?
この式ね、「最新データの注文番号に、A52018(3日前のデータの注文番号)は何個ありますか?」って意味になります。 だから、もし最新データの方にもあれば「1」が、最新データからなくなっていれば(=最新データで削除されていれば)「0」が返ります。
ちょっと、おしりまでコピって、フィルタでのぞいてみましょう※56~58

式をおしりまでコピーした
※56 式をおしりまでコピーした
フィルタをかけて、「0」を抽出
※57 フィルタをかけて、「0」を抽出
最新で削除されたレコードはコイツ
※58 最新で削除されたレコードはコイツ

割り出しできました。
「最新データ」で削除されたレコードは「X02888」です。
あとは、別シートに逃がしてやるなりして、わかりやすくしておいてください。

本日はこんなところです。
並び順がちがうなら同じ並びにしてやればよいし、vlookupを使ってデータをもってくる方法もある。
vlookupを使う場合、件数がちがっても欲しいデータだけ引っ張ってこれるし、並び順も気にしないで済む。 なので、

・件数が同じか、せいぜい1件2件しか違わない → 並べ替えて、単純にとなりにコピペ
・件数がけっこうちがう → vlookup

って使い分けるとよいかもしれません。
ということで、本日はここまで。 シーユーアゲン!

Copyright(C)森田表計算