いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)改行を含む文字列のExcel方眼紙への転記

 Excelで、文字列を1文字ずつ各セルに分割し、所定の列数で折り返し、さらに改行を反映させる方法です。
 表題にはExcel方眼紙と記しましたが、要は原稿用紙のようなマス目への転記です。

  • WRAPROWS関数等を組み合わせることで文字列をExcel方眼紙に転記することができます。

手順

 まずは結果です。
 B3セルに転記元の文字列が入力されています。
 C6セルに関数式を入力し、文字列を1文字ずつ分割して幅9セルで折り返しています。さらに文字列中の改行もそのまま反映しています。

 C6セル

=LET(
x,TEXTSPLIT(TEXTJOIN("_",,MID(B3,SEQUENCE(LEN(B3)),1)),"_",CHAR(10),TRUE,,""),
y,WRAPROWS(TOCOL(EXPAND(x,,CEILING(COLUMNS(x),9),"")),9),
FILTER(y,BYROW(y,LAMBDA(z,CONCAT(z)))<>"")
)

 かなり長いです。LET関数を使い配列をx→y→FILTER(y,~)と段階的に加工して出力しています。
 まずxですが、これは文字列を1文字ずつ分割したものです。ただし単に横方向に分割するだけではなく、改行(CHAR(10))を基準にして縦方向への分割も行っています。
 次にyですが、xを幅9セルで折り返したものです。
 最後のFILTER関数は、yから「空文字列だけの行」を削除したもので、これが出力結果となります。
 注意点は次のとおりです。

  • 列方向の文字分割の目印として「_」を使っていますので、元の文字列に「_」が含まれる場合は式中の「_」を別の記号(文字列中で使われていないもの)に変更する必要があります。
  • 折り返しの基準となる列数「9」を入力している箇所が2つあります(3行目)が、LET関数を使っているので実際は変数として定義した方がよいでしょう。
  • 行頭に読点や句読点が来るケースでもそのまま出力されます。実用的にみて痛いところですが回避は困難です。


 以降は補足です。
 まずxだけを出力すると次のようになります。

 C6セル

=LET(
x,TEXTSPLIT(TEXTJOIN("_",,MID(B3,SEQUENCE(LEN(B3)),1)),"_",CHAR(10),TRUE,,""),
x
)

 MID/SEQUENCE関数を使い文字列を1文字ずつ分割し、TEXTJOIN関数を使い「_」を挿んで再度連結しています。
 そしてTEXTSPLIT関数により、「_」を横方向への分割の区切り文字とし、改行(CHAR(10))を縦方向への分割の区切り文字として分割しています。


 また、yを出力すると次のようになります。

 C6セル

=LET(
x,TEXTSPLIT(TEXTJOIN("_",,MID(B3,SEQUENCE(LEN(B3)),1)),"_",CHAR(10),TRUE,,""),
y,WRAPROWS(TOCOL(EXPAND(x,,CEILING(COLUMNS(x),9),"")),9),
y
)

 EXPAND関数とCEILING関数を使い、xの列数を9(折り返しの基準とする列数)の倍数に切り上げ(この例では27列に切り上げられています)、拡大した部分の列は空文字列で埋めています。
 そしてTOCOL関数とWRAPROWS関数により9列に並べ替えています。もとの文字列における行ごとの文字数の差により「空文字列だけの行」が発生しているのがわかります。


 最初の式の最後のFILTER関数の内部ではBYROW/LAMBDA関数とCONCAT関数を使い、yの各行ごとに文字を連結した配列を生成しています。この配列が空文字列でない行に対応するyの行を出力することにより「空文字列だけの行」を除いています。yを生成する段階でもうちょっとスマートにやればこの部分を省けるかもしれませんが……


 備考ですが、行列を右90度回転させれば縦書きになります。これは別途紹介したいと思います。