365・LibreOfficeなどに関するメモ2022-04-05(Excel)カッコが整合しているかチェックするExcelExcelで文字列中のカッコの開きと閉じが整合しているか、関数を使って判定してみます。判定対象のカッコは1種類のみとします。使用する機会はあまりなさそうですが、LAMBDA関数のちょっとした使用例です。SCAN/LAMBDA関数を使って開きカッコと閉じカッコが整合しているかチェックできます。画像ではB列に判定対象の文字列が記録されています。C3セルに式を入力し、B3セルの文字列内のカッコが整合しているかどうか判定しています。そもそもカッコの整合をどう判定するかですが、次のような手順で可能です。カウンタ(数値)の初期値を0とします。文字列を先頭から1文字ずつ調べていき、開きカッコならカウンタに1を加え、閉じカッコならカウンタから1を差し引きます。カウンタが最初から最後までマイナスにならず、かつ最後に0であればカッコは整合します。なければ整合しません。多数のセルを使えば比較的単純な関数のみで判定を実現できますが、これを1つの式に集約したのがC3セルの式です。C3セル=LET(x,SCAN(0,MID(B3,SEQUENCE(LEN(B3)),1),LAMBDA(a,b,a+SWITCH(b,"(",1,")",-1,0))),IF(AND(MIN(x)=0,INDEX(x,ROWS(x))=0),"〇","×"))式が長いので折り返してみました。キモとなるのは2段目のSCAN関数の部分です。この中でカウンタの初期値0をaとし、さらにMID/SEQUENCE関数を使って文字列を1文字ずつ分割したものをbとしています。「a+SWITCH(b,"(",1,")",-1,0)」により、まずbの1文字目が開きカッコならカウンタに1を加え、閉じカッコなら1を減らし、それ以外の文字なら何も足しません。この加減算の結果は次の加減算(bの2文字目を使った加減算)におけるaとして渡されるとともにSCAN関数による出力(配列)の1要素となります。これが最後のb(bの最後の文字)まで繰り返されるので、最終的にカウンタの推移を配列として得ることができます。あとはLET関数によりこの配列をxと名付け、「xの最小値が0(一度もマイナスにならない)で、かつ最後の値が0」なら〇を、そうでなければ×を表示しています。イメージしにくいかもしれませんので、次の画像では、上記画像の最後の例(文字列)についてSCAN関数の部分のみ適用した結果を示しています。C3セル=SCAN(0,MID(B3,SEQUENCE(LEN(B3)),1),LAMBDA(a,b,a+SWITCH(b,"(",1,")",-1,0)))繰り返しになりますがLAMBDA関数内の「a+SWITCH(b,"(",1,")",-1,0)」という計算が配列bの各要素(つまり文字列内の各文字)について繰り返される、という働きがわかれば理解しやすいと思います。この判定問題は複数種のカッコ(例えば通常の丸カッコと波カッコの併用)の整合判定に拡張されます。このとき異種のカッコの交錯を考慮する必要があり、例えば「({)}」は×となりますので新たな判定方法を用いる必要があります。いつか追記するかもしれませんが、興味のある方はチャレンジしてみると面白いかもしれません。次の記事では本記事の内容を基本として、カッコ内の文字列をすべて取得する例を紹介しています。365はデスクトップ版、LibreOfficeは記事作成時の安定バージョンを用いた結果を示しています。サイトポリシー等についてはこちらをご覧ください。(1)検索スポンサーリンク引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。