見出し画像

[EXCEL] 番号を振る(応用編)親番/枝番/項目別の通し番号を振る

目次 > 入力 > 連番・枝番

【まとめ】
・項目別の通し番号(枝番)は数式で付けられる(項目がまとまっていても、まとまっていなくても)
・親番はコード表からXLOOKUP関数で持ってくる。
・並び替えしても元に戻せるように通番も入れておく。



【説明】

番号(連番)の基本的な付け方を前回書きました。
[EXCEL] エクセル超基本 番号(通番)の入力方法
今回は、その応用です。


その1 項目別の番号を振る(項目がまとまっている場合)

下図のように番号をふりたいことはないでしょうか?

NO1は全体の通し番号(「連番/通番」であって「親番」ではない)。
NO2は、項目(都道府県)の個別の通し番号です。
NO2があることで、項目(都道府県)別にいくつデータがあるかわかります。
このNO2の番号はどうやれば付けられるでしょうか?
もちろん、手作業ではありません。

ポイントは「項目」名が同じなら「1,2,3,4・・・」と番号を「1ずつ」増やしていき、「項目」名が変わったら「1」を振る。
条件分岐があるので、IF関数が使えそうです。









非常に簡単な数式で番号付け出きます。
=IF(G1=G2,F1+1,1)

「都道府県」の欄が、上のデータ(都道府県)と同じなら 1を足す、違っていたら(都道府県名が変わったら) 1を入れる。
以上です。
これを下のセルにコピーしていけば(フラシュフィル可)、「都道府県」別の通し番号が付きます。

その2 項目別の番号を振る(項目がまとまっていない場合)

上の場合は、項目(都道府県)がまとまっていました。
では、次の場合どうでしょうか?
こちらは、項目(都道府県)がまとまっていません。
データとしては、項目がまとまっていた方が集計しやすいのですが、実務では、書類が来た順に入力していく、という場合があるので、下図のように、項目がまとまらない場合は多々あります。
最終的には書類もデータも並び替え(ソート)して、項目順にまとめる(並べる)でしょうけれど、書類にも項目別の番号を記載しておかないと散逸した際に並び替えができなくなります。

項目別の番号を付ける数式を作る上でのポイントは、「最初のデータから該当のデータまでの間に同じ項目名がいくつあるか」を出すことです。
「最初のデータから該当データまでに同じデータが3つある」=「該当のデータは3つ目」とわかれば、「NO2」には枝番として「3」が入ります。

具体的な数式はどうするか?
例えばK7セル。
ここには、こういう数式が入ります。
=COUNTIFS(L$2:L7,L7)

COUNTIFS関数は、「ある条件に合致する」データ(数値でも文字でも)が、指定範囲にいくつあるかを調べる関数です。
=COUNTIFS(L$2:L7,L7)
は。L2からL7の間に「L7」(千葉県)と同じデータがいくつあるか?を出します。
答えは、ご覧のとおり「2」。指定範囲内に「千葉県」は2つある、ということです。
従って、「千葉県」としての番号(枝番)は「2」になります。

ここで重要なのは、
=COUNTIFS(L$2:L7,L7) の 「L$2:L7」。最初の「L$2」の行番号には、絶対参照を表す「$」が付いています。一方、後ろの「L7」には「$」が付いていません。つまり、相対参照。
絶対参照($付き)の列番号(アルファベット)・行番号(数字)はコピーしても、変わりません。
相対参照($付き)はコピーすると変わります(ずれます)。
*絶対参照、相対参照については別記事で説明する予定です。

最初に、K2セルに数式を入れるときは、以下の通りとします。

「$」は手入力しなくても、「L2」セルを選択した後、F4キーを2回押すことで、行番号の2に「$」が付きます。
*F4キーを押す度に、L2 ⇒ $L$2 ⇒ L$2 ⇒ $L2 ⇒ 繰り返し と変わります。今回は、列(L)は絶対参照でも相対参照でも、どちらでも構いません(同じ列にコピーするため、どちらであっても、L列は変わらない)。

こうすることによって、K2セル(の数式)を下にコピーしても、始まりはL2セルのままである一方、終わりは、コピーしたセルと同じ行のとこまでが指定範囲となり、その範囲の中で、L列のセルと同じものがいくつあるか、を集計します。

コピーしたセルを「参照元のトレース」(Alt ⇒ M ⇒ P)で表示してみます。

K4セル

K10セル

このように、指定範囲の始まりは、どのセルも同じで、終わりは、セル毎に違うことがわかります。

これにより、項目(都道府県)がまとまっていなくても、項目別の番号がわかります。
多くのデータを扱っていて、かつ、項目(都道府県)がたくさんある場合、「このデータは、この項目では何番目か」ということがデータを入力するだけでわかります。

その3 親番+枝番(項目がまとまっている場合)

次に、親番号(親番)と枝番号(枝番)を付すとともに、それらを繋げた番号をどう作るか、考えます。
親番とは通番(全体を通した連番)ではなく、項目の種類ごとに付く番号です。
親番+枝番は、下図の黄色部分のような番号です。

親番号は「親番」
枝番号は「枝番」としています

上の図の場合、親番は、「都道府県」が同じなら同じ番号が付きます。番号は入力された都道府県名の順に寄ります。枝番は、東京都・神奈川県・千葉県でそれぞれ何番目か、を表します。

この親番+枝番は、どうやれば付けられるでしょうか?

前提条件は、①「項目」(都道府県)が同じなら親番は同じ、②同じ項目の中で枝番を順番に付けていく、③項目はまとまっている、です。

親番は後回しにして、まずは枝番。
枝番は、簡単です。上の1と同じです。
P4セルなら =IF(S3=S4,P3+1,1) となります。

上のデータと項目(都道府県)が同じなら、上の番号に1を足す、そうでなければ「1」を入れる、です。

では、親番はどう出せばいいでしょうか?

これは、枝番と逆の発想になります。
つまり、「項目名が上のデータと同じなら番号は上のデータと同じままにし、項目名が上のデータと異なっていたら、上の番号に1を加えた番号んする」です。
O4セルなら
=IF(S4=S3,O3,O3+1) となります。

ただし、A2セルに、この数式をコピーするとエラーになってしまいます。
項目が上のデータと違うので、「O1+1」となりますが、O1は文字(都道府県)なので計算できず、エラーになるのです。
そのため、A2セル(データの1番目)のみ「1」を手入力する必要があります。


その3 別解 ROWS関数とUNQUE関数の合わせ技

別の数式も考えられます。
UNIQUE関数で、範囲を指定し、その中に重複しない(UNIQUE/ユニーク/独自な)データがいくつあるか数えます。

O5セルの場合 =ROWS(UNIQUE(S$2:S5))

「S$2:S5」の範囲には、「東京都」と「神奈川県」という2つの異なったデータがあります(東京都は複数ありますが、同じデータなので1つとなります)。
これを 行数を出すROWS関数を使うことで、独自データの数「2」が入ります。
単に「=UNIQUE(S$2:S5)」だと、実際のデータ(重複が排除されたたもの)が表示されてしまうので、ROWSで囲みます(下図)。

この場合、A2セルへの手入力は不要になります。

親番は自動で入れる(XLOOKUP関数を使う)

上の2つは、親番は入力の順により機械的に付与されます(入力者側で付与できない)。上の例では、たまたま「東京都」が最初に入力されたから親番に「1」がつきましたが、最初が「千葉県」なら、千葉県の親番が1になります。都道府県名が入力される順番により、親番が変わってしまいます。
しかし、、実務では、都道府県等の項目には独自のコード番号を付けておく方が、データを整理しやすいでしょう。
そのためには、親番(コード)と都道府県名を並べたコード表を作っておき、XLOOKUP関数で親番を自動表示します(親番の入力で都道府県名を自動表示することもできます)。

下図O4セルの場合 =XLOOKUP(S4,W:W,V:V) となります(都道府県から親番自動表示する場合)。
下図では、V列に「都道府県コード」、W列に「都道府県」名を並べた「コード表」を作り、、ここからデータを引っ張ってきます。

=XLOOKUP(S4,W:W,V:V) は S4セルのデータと同じものを、W列から探して、見つかった行のV列のデータを表示する、という意味です。
S4(東京都)がW列の2行目に見つかるので、V列の2行目の「1」を表示しています。
*通常は「コード表」は別シートにしておくべきです。
*XLOOKUP関数はデータ列の並び順に左右されないなど柔軟性が高く、かつ、記述も簡単な関数です。VLOOKUP関数の上位互換の関数ですので、いまだにVLOOKUP関数を使っている人は(環境が許すなら)VLOOKUP関数はやめて、XLOOKUP関数を使いましょう。
詳しくは以下参照。
VLOOKUP関数をいまさら使ってはいけない
なぜ、いまだにVLOOKUP関数の使い方を指南する人がいるのが不思議。その理由を考えてみた。他山の石に。
*=XLOOKUP(S4,W2:W4,V2:V4)といったように行番号での範囲指定も可能ですが、面倒かつ間違いが生じやすいので、列番号のみ指定した方が簡単です。ただし、列全体を指定すると、エクセルが重くなる場合があります。
参考:[EXCEL] セルを行番号で範囲指定してはいけない(SUMIFS/COUNTIF/XLOOKUP関数等)
*東京都:1 神奈川県:2 というのは、説明用のものです。実際は、自治体コード番号を用いた方がいいでしょう(データによって自治体に付く番号が違うと後々不便です)。ただし、都道府県の場合、あるいは同一都道府県内の市町村の場合は、総務省が示す正式な自治体コードは長すぎるので、通常は簡略化した番号(2桁)でもいいかと思います(自治体名から番号を表示するなら、長いままでもいいかもしれません)。

親番と枝番を繋げる

親番号と枝番号が出たら、それを繋げます。
繋げる方法は色々ありますが、ここではシンプルに
=O2&"-"&P2 としました。

あるいは、一連の数値とするなら
=O2*1000+P2 という方法もあります(一例)。

枝番は3桁(999)までを想定して、親番は1000番台からにしています。
親番は2桁になることを想定して、頭に0を付けています。これは「セルの書式設定」で設定しています。

最初に示した「1-1」の場合は、親番と枝番が「-」で区切られているので、親番と枝番の区別がつきやすいという利点があります。
一方、文字列扱いになるので、数式では扱いづらい場合があるかもしれません。
後者の「01001」は、親番と枝番の区別がつきづらい反面、数値のままなので、数式で扱いやすいといえます(一定数値以上を括り出す等)。
なお、後者の場合でも「セルの書式設定」で以下のよう「00-000」とすると、親番と枝番の区別がつきやすくなります。

上2桁と下3桁が
「-」で区切られていますが、
データは数値のままです

その4 親番+枝番(項目がまとまっていない場合)


実務では、このように、項目名(都道府県)がまとまっていない場合が多いのではないでしょうか?
「集計(入力)作業中」は、こんな感じでしょうか。

これにどうやって「親番号+枝番号」を付けていくか?
「枝番号」は上の3と同じで簡単です。
W5セルなら =COUNTIFS(Y$2:Y5,Y5) となります。

問題は、親番。
ここは、上の④の後段の説明のとおり、コード表を別に作っておいて、XLOOKUP関数で番号を持ってくるのが一番簡単(かつ分かりやすい)ではないでしょう。
V5セルなら =XLOOKUP(Y5,AD:AD,AC:AC) となります。

親番+枝番の作り方は、上の④と同じです。
なお、このデータ表は、出来上がった後、「親番」で小さい順から並び替えれば、項目(都道府県)別に並び変わります。
並び替え(ソート)ウィンドウ(ダイアログボックス)は、Alt ⇒ D(データ)⇒ S(並び替え)で出てきます。

「親番」で並び替え(ソート)すると・・・

ただし、並び替えてしまうと元の順番には戻せません(CTRL+Z のやり直し  には戻せる限度がある)。


通し番号(連番・通番)があれば元の並び順に戻せる

その点で、この「親番+枝番」の左に「全体の通し番号」(連番・通番)を付けておくと便利です。並び替えをしても、「全体の通し番号」で再度並び替えすることにより、元の並び順に戻せます。
*実務では受付した書類に番号(通し番号)を入れ、同じ番号を「全体の通し番号」とすることで、データ表の順と書類の順番とが同じになり、内容確認の際にも書類探しの手間が減ります。


親番号で並び替えてしまっても・・・

通番で並び替えれば・・・

元(入力時)の並び中に戻ります。

親番と枝番を1つのセルで計算する

上の例では、親番と枝番をそれぞれ出してから合体させていますが、当然、計算式をまとめることで、1セルに親番と枝番を出すこともできます。
例えば、
=XLOOKUP(AG2,$AD:$AD,$AC:$AC)*1000 + COUNTIFS(AG2:AG$2,AG2) 

「+」より前が親番、後ろが枝番です。

親番に1000を掛けて、枝番を足しています(枝番が999までの場合)。
実際は、真ん中の「+」の前後のスペースは不要です。
このぐらいの計算式なら、そんなにわかりづらくないかもしれません。

数式は長くなってしまいました

頭の「0」とハイフン入れは、「セルの書式設定」でやっています。


以上、番号の付け方、応用編でした。

連番とか通番とか通し番号、親番とか枝番とか、色々出てきてわかりづらいところがあるかと思いますが、ご寛恕ください。
一番は、全体の通し番号、項目のコード番号(親番号)、項目別の枝番号の3つ(後ろ2者はまとめてもいい)があるのが理想です。データ表が番号だらけになってしまうのもいけませんが・・・。

「そこは違うよ」「もっといい方法がある」という方はぜひご教示ください。


さて、これまでの説明は「すでにデータが入っている表」への番号付けでした。
しかし実務では、データを入力しながら番号を付けていく場合の方が多いと思います。
その場合、どうやって番号をつけていけばいいか?
もちろん、手入力という方法もありますが、間違う恐れもあります。
データを入力しながら、同時に自動で番号を付けていく方法は、また別の記事で説明します。

以上、参考になれば幸いです。
もし何か「発見」があったら、「スキ」「フォロー」「チップ」していただける嬉しいです!



いいなと思ったら応援しよう!