いきなり答える備忘録

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

(Excel)Unicode麻雀牌の理牌

 Excelで、Unicodeによる麻雀牌が並んだ文字列を理牌(ソート)する例です。
 文字列を文字単位で並べ替える例の特殊ケースです。

  • SORTBY関数等を使ってUnicodeの麻雀牌を理牌できます。

手順

 画像では、B3セルに理牌の基準となる牌の並びが、さらにB7:B11の範囲に理牌の対象が入力されています。
 まずはC7セルに式を入力して、B7セルに対し基準に基づく理牌を行っています。

f:id:accs2014:20220407080840p:plain:w750

 C7セル

=CONCAT(LET(x,MID(B7,SEQUENCE(LEN(B7),,1,2),2),SORTBY(x,FIND(x,B3))))

 1文字(牌)ずつ分割したものをLET関数によりxと名付け、「FIND(x,B3)」によりB3セル内での位置を取得し、それをキーとしてSORTBY関数で並べ替えています。
 通常の英数カナなどと異なりMID関数やFIND関数を用いる際の文字位置が1,3,5……になるのと、MID関数で2文字ずつ取得するよう指定する必要があることがポイントです。SEQUENCEの戻り値の配列が必要以上に多くなります(MID関数で余分な空文字列ができる)が、最終的な結果に影響はないので対応を省略しています。


 ところで、式中の「B7」を「B7:B11」に変えればスピル(5つの結果が得られる)しそうですが、すべての関数がこの範囲全体に働いてしまうためうまくいきません。
 絶対参照(B3→B$3)とコピーで対応するのが簡単ですが、あえてこだわるなら次のような例が挙げられます。

f:id:accs2014:20220407080845p:plain:w750

 C7セル

=BYROW(B7:B11,
LAMBDA(a,CONCAT(LET(x,MID(a,SEQUENCE(LEN(a),,1,2),2),SORTBY(x,FIND(x,B3)))))
)

 BYROW/LAMBDA関数を使ってB7:B11に一旦aと名付けることで、LAMBDA関数内の式の実行単位を5つ(B7に対するもの、B8に対するもの……)に分割しています。LAMBDA関数内ではaをさらに1文字に分割してxと名付け、最初の例と同じ処理を実行しています。