いきなり答える備忘録

Google Workspace(旧G Suite)・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)横持ちのデータを縦持ちに変換する

 Excelで、いわゆる横持ちのデータを縦持ちにする変換を関数で行う例です。

  • TOCOL関数等を使って横持ちのデータを縦持ちに変換することができます。

手順

 変換の対象となっているデータの範囲はB3:E6です。
 これに対してG3セルに関数式を入力することで変換を実現しています。

 G3セル

=HSTACK(TOCOL(IF(C3:E6="",NA(),B3:B6),2),TOCOL(IF(C3:E6="",NA(),C3:E6),2))

 HSTACK関数を使って2つの列を並べています。
 最初の「TOCOL(IF(C3:E6="",NA(),B3:B6),2)」の部分ですが、これは「氏名を、それぞれが持っている資格の数だけ繰り返した1列の表を作る」というものです。詳しくは下記の備考をご覧ください。
 2番目の「TOCOL(IF(C3:E6="",NA(),C3:E6),2)」の部分は、資格の名前を縦1列に並べています。ここは単純に「TOCOL(C3:E6,1)」(資格名から空白セルを除いて縦1列に並べる)としても良さそうですが、資格名に空文字列が含まれる場合に最初の列との間にズレが生じてしまうため、慎重を期してこうしています。
 HSTACKを使わずG3,H3セルにそれぞれ式を入れても同じ結果になりますが、あえて1つにまとめています。

備考

 上記の「TOCOL(IF(C3:E6="",NA(),B3:B6),2)」の部分ですが、この中の「IF(C3:E6="",NA(),B3:B6)」だけを実行すると次のようになります。

 この結果に対して「TOCOL(~,2)」とし(第2引数=2→エラーを無視)、N/Aエラーのセルを無視して氏名だけを縦1列に並べることができます。結果的に各氏名を、その資格の数だけ繰り返した1つの列が得られるというわけです。「TOCOL(IF(C3:E6="","",B3:B6),1)」でも良さそうですが(空文字列は空白ではないので)うまくいきません。