男女別名簿を作る

学校では,様々な事務処理をするために名簿をよく使います。
通常は男女混合の名簿を使っているのだが,健康診断関係の事務処理には男女別の名簿が必要になってくるでしょう。
これを関数を使って,自動でできないでしょうか?

元の名簿に性別が記入してあれば,別の場所で男女別名簿になってくれるような。。。



(1)D列〜G列まで作業列に,I列〜K列までを男子の名簿に,M列〜O列までを女子の名簿になるよう,枠を作ります。



(2)男女を振り分け,男子の列(D)には男子だけ行番号を,女子の列(E)には女子だけ行番号を表示します。

  @D2に 『 =IF(C2="男",ROW(),"") 』 と打ち込みます。
   【意味】 C2が男なら,行番号( ROW() )を返し,そうでなければ空白を返します。

  AD2の式を,D17までコピーします。

  BE2に 『 =IF(C2="女",ROW(),"") 』 と打ち込みます。
   【意味】 C2が女なら,行番号( ROW() )を返し,そうでなければ空白を返します。

  CE2の式を,E17までコピーします。
   すると,以下のような表示になります。



(3)それぞれの行番号を,F列とG列で前に詰めて表示します。
  『 前に詰める 』というと,非常に難しそうですが,考え方を変えて,『小さい方から順に取り出す』と考えると,
  結果的に,前に詰めたことになします。

  @F2に,『 =SMALL($D$2:$D$17,1) 』 と打ち込みます。($は絶対参照なので,忘れず付けてください。)
    【意味】 D2〜D17の範囲にある数値で,小さい方から1番目の数値を表示します。

   F3以降ですが,このままF17までコピーしても,今回は使えません。なぜなら,コピーしたSMALL関数の『1番目』のところが,
   どれも1のままだからです。
   正しく結果が表示されるには,F4は『 =SMALL($D$2:$D$17,2) 』となり,F5は『 =SMALL($D$2:$D$17,3) 』とならなければなりません。
   それで,F17まで,数字だけ打ち直す必要が出てきます。
   (これって,すごく大変ですね。おまけに女子も,同じことをしなければなりません。)

   そこで,もうひとつ関数を組み合わせて,楽にできるようにしましょう。

  AROW関数を組み合わせます。
   F2に,『 =SMALL($D$2:$D$17,ROW(A1)) 』と打ち込みます。
    【意味】 ROW(A1)は,A1の行番号を返します。つまり,1を返します。

  BF2の式を,F17までコピーします。
   先ほどと何が変わったかですが,F3の式を見てみると,『=SMALL($D$2:$D$17,ROW(A2))』となっています。
   ROW(A2)で,A2の行番号を求めることになり,2を返しています。つまり,2番目を求めることになっています。
   ※ROW関数は,コピーして式を使うときに,知っておくと便利な関数です。

  C同じように,女子のG2に,『 =SMALL($E$2:$E$17,ROW(A1)) 』と打ち込みます。
   ※範囲が変わっているので,気を付けてください。

  DG2の式を,G17までコピーします。
   すると,以下のような表示になります。
   エラーになっている部分は,データがないのでエラーになりますが,このままでいいです。



(4)これで,下準備は整いました。あとは,求めたい結果を表示するだけです。
  男子の名簿を作りましょう。
  @I列は,Noです。元の名簿で,NoはA列にあります。
   そこで,I2に,『 =INDIRECT("A"&F2) 』と打ち込みます。
   【意味】 F2の内容が4なので,文字列Aと組み合わせて,A4の内容を表示しています。

  AI2の式を,I9までコピーします。
   結果は,得られたのですが,I6〜I9までエラーになっています。
   最終結果なので,ここは空白にしたいですね。


  Bそこで,I2を『 =IFERROR(INDIRECT("A"&F2),"") 』と修正します。
   【意味】 エラーになったら,""(空白)を返します。

  CI2の式を,I9までコピーします。

  DJ列は,名前です。元の名簿で,名前はB列にあります。
   そこで,J2に『 =IFERROR(INDIRECT("B"&F2),"") 』と打ち込みます。
   そして,J9までコピーします。

  EK列は,性別です。元の名簿で,性別はC列にあります。
   そこで,K2に『 =IFERROR(INDIRECT("C"&F2),"") 』と打ち込みます。
   そして,K9までコピーします。
   すると,以下のような表示になります。



(5)今度は,女子の名簿を作ります。
  @M列は,Noです。元の名簿で,NoはA列にあります。
   そこで,M2に『 =IFERROR(INDIRECT("A"&G2),"") 』と打ち込みます。
   そして,M9までコピーします。

  AN列は,名前です。元の名簿で,名前はB列にあります。
   そこで,N2に『 =IFERROR(INDIRECT("B"&G2),"") 』と打ち込みます。
   そして,N9までコピーします。

  BO列は,性別です。元の名簿で,性別はC列にあります。
   そこで,『』と打ち込みます。
   そして,O9までコピーします。
   すると,以下のような表が完成します。



(6)性別の部分は,男子なら男に,女子なら女に,必ずなるので,直接,男女を打ち込んでもいいような気がしますが,
  結果が正しく表示されているかどうかチェックするために,あえて関数で表示させておいた方が無難です。

作業列を使う方法は,複雑な処理もこなせるため,とても便利です。
配列数式を使う方法もありますが,後々のメンテナンス性を考えると,こちらの方がわかりやすいので,お勧めです。