目次
TOCOL関数で配列や範囲を列に変換する簡単な方法です。
Excelには、列から行へ、あるいはその逆方向へのデータ転置機能がかなり以前から備わっています。 しかし、セルの範囲を1つの列に変換するのは、厄介な作業でした。 それがようやく変わりました。 Microsoftは、TOCOLという新しい関数を導入し、瞬時に配列から列への変換を行うことができます。 以下、この新しい関数が簡単に解決できるタスクのリストです。
エクセルTOCOL関数
ExcelのTOCOL関数は、セルの配列や範囲を1つの列に変換するものです。
この関数は3つの引数を取りますが、必要なのは最初の1つだけです。
TOCOL(配列、[無視]、[scan_by_column])どこで
アレイ (必須) - 列に変換するための配列または範囲。
無視 (オプション) - 空白または/およびエラーを無視するかどうかを定義します。 これらの値のいずれかを指定することができます。
- 0または省略(デフォルト) - すべての値を保持する
- 1 - ブランクを無視する
- 2 - エラーを無視する
- 3 - 空白やエラーを無視する
スキャンバイカラム (オプション) - アレイを水平方向にスキャンするか、垂直方向にスキャンするかを決定します。
- FALSE または省略(デフォルト) - 配列を左から右へ一行ずつスキャンします。
- TRUE - 配列を上から下へ列単位で走査します。
ヒント
- 配列を1行に変換するには、TOROW関数を使用します。
- 列から配列への変換を逆に行うには、列でラップするWRAPCOLS関数か、行でラップするWRAPROWS関数を使用します。
- 配列を水平から垂直に、またはその逆に、行から列に変換する場合は、TRANSPOSE 関数を使用します。
TOCOLの稼働率
TOCOLは新機能で、Excel for Microsoft 365(Windows版、Mac版)、Web版Excelでサポートされています。
範囲を列に変換する基本的なTOCOL式
最も単純な形のTOCOL式は、たった一つの引数 - を必要とします。 勢揃い 例えば、3列4行の2次元配列を1列に配置する場合、以下の式となります。
=TOCOL(A2:C5)
数式は1つのセル(この例ではE2)にのみ入力され、自動的に下のセルにこぼれる。 Excelでいえば、その結果をこぼれ落ちた範囲と呼ぶ。
この処方の仕組み
技術的には,まず範囲A2:C5が2次元配列に変換されます. セミコロンで区切られた行とカンマで区切られた列に注目してください.
{"Apple","Banana","Cherry";1,0,3;4,#N/A,6;7,8,9}
TOCOL関数は,配列を左から右に走査し,1次元の縦配列に変換する.
{"Apple";"Banana";"Cherry";1;0;3;4;#N/A;6;7;8;9}
結果はセルE2に置かれ、そこから下のセルに流出する。
エクセルでTOCOL関数を使う方法 - 計算式例
TOCOL関数がどのような機能を持ち、どのような作業を行うことができるかを理解するために、いくつかの計算式の例を見てみよう。
空白やエラーを無視して配列をカラムに変換する
前の例でお気づきのように、デフォルトのTOCOL式は、空白セルやエラーも含めてソース配列のすべての値を保持します。
その結果,空のセルは 0 で表されることになり,特に元の配列が 0 の場合は非常に混乱します. 解決策としては,次のようにします. スキップフロント この場合、第2引数に1を指定します。
=tocol(a2:c5, 1)
への エラー無視 の場合、第2引数に2を設定します。
=tocol(a2:c5, 2)
両方を除外すること。 空白とエラー には3を使用します。 目をつぶる の議論になります。
=tocol(a2:c5, 3)
アレイを水平または垂直にスキャン
デフォルトでは scan_by_column(スキャンバイカラム 引数(FALSE または省略)を指定すると、TOCOL 関数は配列を行ごとに水平方向に走査します。 列ごとに値を処理するには、この引数を TRUE または 1 に設定します。 たとえば、次のようになります。
=tocol(a2:c5, ,true)
どちらの場合も、返される配列のサイズは同じですが、値の並び方が異なることに注意してください。
複数の範囲を1つの列にまとめる
もし、連続しない複数の範囲を扱うのであれば、まずVSTACK関数を用いて縦方向に範囲を結合して1つの配列にし、次にTOCOLを用いて結合した配列を列方向に変換することができます。
最初の範囲をA2:C4、2番目の範囲をA8:C9とすると、式は次のような形になります。
=tocol(vstack(a2:c4,a8:c9))です。
この式は、下図のE列に示すように、結合された配列を左から右へ水平に読み込むというデフォルトの動作を示しています。
値を上から下へ垂直に読むには、TOCOLの第3引数をTRUEに設定する。
=tocol(vstack(a2:c4, a8:c9), ,true)
この場合,式はまず両方の配列のA列の値を返し,次にB列の値を返す,という順序になっていることに注意してください. これは,TOCOLが元の個々の範囲ではなく,積み重ねた1つの配列をスキャンしているためです.
ビジネスロジックで、元の範囲を垂直方向ではなく水平方向に積み重ねる必要がある場合は、VSTACKの代わりにHSTACK関数を使用してください。
後続の各配列を前の配列の右側に追加し、結合した配列を水平方向に読み出すには、以下の式となります。
=tocol(hstack(a2:c4,a8:c10))です。
前の配列の右側に後続の各配列を追加し、結合した配列を縦に走査するには、次の式になります。
=tocol(hstack(a2:c4, a8:c10), ,true)
複数列の範囲から一意な値を抽出する
ExcelのUNIQUE関数は、1列や1行のユニーク値を簡単に見つけることができ、ユニーク行を返すこともできますが、複数列の配列からユニーク値を取り出すことはできません。 その解決策は、TOCOL関数と一緒に使用することです。
例えば、A2:C7の範囲から異なる(distinct)値をすべて抽出する場合、以下のような式になります。
=unique(tocol(a2:c7))です。
さらに、上記の数式をSORT関数でくくることで、返された配列をアルファベット順に並べることができます。
=sort(unique(tocol(a2:c7)))
Excel 365 - 2010で範囲を列に変換する方法
TOCOL関数がサポートされていないExcelのバージョンでは、セル範囲を列に変換する方法がいくつかあります。 これらの解決策はかなり厄介ですが、いずれにせよ動作します。
範囲を行単位で読み取る場合。
INDEX( レンジ , quotient(row(a1)-1, columns(). レンジ ))+1, mod(行(a1)-1, 列( レンジ ))+1)範囲を列単位で読み取る場合。
INDEX( レンジ , mod(row(a1)-1, rows()) レンジ ))+1, quotient(row(a1)-1, rows( レンジ ))+1)サンプルデータセットの場合、計算式は以下の通りである。
範囲をスキャンするには 左から右へ :
=index($a$2:$c$5, quotient(行(a1)-1, columns($a$2:$c$5))+1, mod(行(a1)-1, columns($a$2:$c$5))+1)
この式は、TOCOL関数の第3引数をFALSEとするか省略したものと同じである。
=TOCOL(A2:C5)
範囲をスキャンするには たてよこ :
=index($a$2:$c$5, mod(row(a1)-1, rows($a$2:$c$5))+1, quotient(row(a1)-1, rows($a$2:$c$5))+1)
この式は、第3引数をTRUEに設定したTOCOL関数と同等である。
=tocol(a2:c5, ,true)
TOCOLとは異なり、代替数式は結果を表示させたい各セルに入力する必要があります。 この例では、数式はセルE2(行ごと)、G2(列ごと)に入り、13行目にコピーされます。
数式が必要以上に多くの行にコピーされると、「余分な」セルに #REF! エラーが表示されます。 これを防ぐには、次のように IFERROR 関数で数式をネストします。
=iferror(index($a$2:$c$5, quotient(row(a1)-1, columns($a$2:$c$5))+1, mod(row(a1)-1, columns($a$2:$c$5))+1), "")
数式を正しくコピーするために、絶対セル参照($A$2:$C$5)を使って範囲をロックしていることに注意してください。 代わりに、名前付きの範囲を使用することができます。
これらの計算式の仕組み
以下は、セルを行ごとに並べる最初の計算式の詳細な内訳です。
=index($a$2:$c$5, quotient(行(a1)-1, columns($a$2:$c$5))+1, mod(行(a1)-1, columns($a$2:$c$5))+1)
INDEX関数を使って、範囲内の相対的な行と列の番号に基づいて、あるセルの値を返すというものです。
があります。 行番号 はこの組み合わせで計算されます。
quotient(row(a1)-1, columns($a$2:$c$5))+1
QUOTIENT関数は、除算の整数部分を返します。
について 分子 この場合、ROW(A1)-1 を使用すると、E2(数式が入力された最初のセル)の0からE13(数式が入力された最後のセル)の11までの通し番号が返されます。
があります。 分母 brough by COLUMNS($A$2:$C$5)) は一定で、範囲内の列の数に等しくなります(この例では3)。
ここで、QUOTIENTの結果を最初の3セル(E2:E4)で確認すると、0になることがわかります(除算の整数部が0だから)。 1を足すと行番号が1になります。
次の3セル(E5:E5)については、QUOTIENTは1を返し、+1操作で行番号2を返す。 といった具合になる。
つまり、この数式では、1,1,1,2,2,3,3,4,4,・・・というような繰り返しの数列が作成され、範囲内の列の数だけ各数値が繰り返されることになります。
を計算すること。 列番号 の場合、MOD機能で適切な数列を構築します。
mod(row(a1)-1, columns($a$2:$c$5))+1
範囲(A2:C5)には3つの列があるので、順序は1,2,3,1,2,3,...としなければなりません。
MOD関数は、除算後の余りを返します。
E2において、MOD(ROW(A1)-1、COLUMNS($A$2:$C$5))+1)
になる
MOD(1-1, 3)+1)
となり、1が返されます。
E3では、MOD(ROW(A2)-1、COLUMNS($A$2:$C$5))+1)。
になる
MOD(2-1, 3)+1)
となり、2が返されます。
行番号と列番号が確立されているので、INDEXは必要な値を問題なく取得することができます。
E2では、INDEX($A$2:$C$5, 1, 1)は、参照する範囲の1行1列目、すなわちセルA2の値を返します。
E3では、INDEX($A$2:$C$5, 1, 2)は1行2列目、つまりセルB2からの値を返しています。
などなど。
列ごとに範囲をスキャンする2つ目の数式も同じように動作しますが、行番号を得るためにMODを、列番号を得るためにQUOTIENTを使用する点が異なります。
TOCOL機能が動作しない
TOCOL関数がエラーを投げる場合、最も可能性が高いのは、これらの理由のうちの1つです。
お使いのExcelでは、TOCOLはサポートされていません。
NAME?エラーが発生した場合、まず確認するのは関数名の正しいスペルです。 名前が正しいのにエラーが続く場合は、その関数はお使いのExcelのバージョンで使用できません。 この場合、TOCOLの代替品を使用することを検討してください。
アレイが大きすぎる
NUMエラーは、配列が列に収まらないことを示します。 典型的なケースは、列全体または行を参照する場合です。
空のセルが少ない
SPILLエラーが発生した場合、数式が入力されている列に、結果が入るだけの空白セルがあるかどうかを確認します。 見た目に空白セルがある場合は、スペースなどの印字されない文字が入っていないかどうかを確認します。 詳しくは、「Excelの#SPILLエラーを修正する方法」をご覧ください。
以上、Excel 365のTOCOL関数と旧バージョンの代替案を使って、2次元配列を1列に変換する方法でした。 読んでいただきありがとうございました!来週も当ブログをよろしくお願いします。
練習用ワークブック
Excel TOCOL関数 - 計算式の例 (.xlsx ファイル)