概要
「文字と数字がぐちゃっと混ざっている中から、“英字だけ”抜き出したい」
「A1b-23Z から AbZ だけ取りたい」
「品番やIDの中の “アルファベットだけ” を分離して使いたい」
こういうときに使えるのが、
FILTER 関数 × MID × SEQUENCE を組み合わせた「英字だけ抽出」テクニックです。
考え方はシンプルで、
- 文字列を1文字ずつにバラす(MID+SEQUENCE)
- それが英字かどうか判定する
- 英字だけを FILTER でふるいにかける
- 必要なら TEXTJOIN で再度 1 本の文字列にする
という流れを、1 本の数式の中で一気にやります。
FILTER 関数の基本
FILTER の書式
=FILTER(配列, 条件配列, [該当なしのとき])
配列
絞り込みの対象。たとえば { "A"; "1"; "b"; "-" } のような縦のリスト。
条件配列
TRUE(残す) / FALSE(捨てる) の条件。
配列と同じ長さで、「どの要素を残すか」を指定します。
[該当なしのとき]
条件を満たすものが 1 つもないときに返す値(なくてもOK)。
今回やりたいのは
- 配列:1文字ずつにバラした文字たち
- 条件配列:それぞれが「英字かどうか」の判定結果
この 2 つを使って「英字だけ残す」FILTER を作ります。
英字だけ抽出の基本形(FILTER+MID+SEQUENCE)
英字だけを「縦のリスト」として取り出す
例として、A2 に次の文字列が入っているとします。
A2:A1b-23Z
この中から、
- 「A」「b」「Z」だけを取り出して
- 縦に並べる(A3:A5 に A, b, Z と出るイメージ)
ようにしたいとします。
そのときの式例(B2セルなど):
=FILTER(
MID(A2, SEQUENCE(LEN(A2)), 1),
(CODE(UPPER(MID(A2, SEQUENCE(LEN(A2)), 1)))>=65)*
(CODE(UPPER(MID(A2, SEQUENCE(LEN(A2)), 1)))<=90)
)
1 行に詰めるとこうなります。
=FILTER(MID(A2,SEQUENCE(LEN(A2)),1),(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))>=65)*(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))<=90))
動き方をかみ砕きます。
SEQUENCE(LEN(A2))
A2 の文字数ぶんの連番(1,2,3,…)を作ります。MID(A2, SEQUENCE(LEN(A2)), 1)
A2 の中身を 1 文字ずつバラした配列を作ります。
例:{"A";"1";"b";"-";"2";"3";"Z"}UPPER(その1文字)
小文字も含めて一旦大文字にしてしまいます(a~z も A~Z にするため)。CODE(…)
「文字コード」を取得します。
アルファベット(A~Z)はコード 65~90 の範囲に収まるので、
それで「英字かどうか」を判定できます。(CODE>=65)*(CODE<=90)
「65以上 かつ 90以下」のとき TRUE(=1) になる条件配列。
そうでなければ FALSE(=0) になります。FILTER(1文字配列, 条件配列)
条件が TRUE の文字だけを抜き出します → 結果{"A";"b";"Z"}
このようにして、「英字だけを縦方向に取り出す」ことができます。
英字だけを 1 本の文字列として取り出す
縦に並んだ {"A";"b";"Z"} を、"AbZ" のように 1 本の文字列にしたいことも多いです。
その場合は、FILTER で抜き出した配列を TEXTJOIN でつなぎます。
A2:A1b-23Z
から "AbZ" を作る式:
=TEXTJOIN(
"",
TRUE,
FILTER(
MID(A2, SEQUENCE(LEN(A2)), 1),
(CODE(UPPER(MID(A2, SEQUENCE(LEN(A2)), 1)))>=65)*
(CODE(UPPER(MID(A2, SEQUENCE(LEN(A2)), 1)))<=90)
)
)
1 行にすると:
=TEXTJOIN("",TRUE,FILTER(MID(A2,SEQUENCE(LEN(A2)),1),(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))>=65)*(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))<=90)))
これで、英字だけをつなぎ直した文字列 "AbZ" が得られます。
どこが「英字かどうか」のポイントか
今回のキモは、この部分です。
CODE(UPPER(その1文字))>=65
CODE(UPPER(その1文字))<=90
アルファベットは、
- 大文字 A~Z のコードが 65~90
なので、
- まず UPPER で強制的に大文字にする(a→A, z→Z にする)
- そのコードが 65~90 の範囲なら英字だ、とみなす
というロジックになっています。
日本語・数字・記号はこの範囲に入らないので、
条件が FALSE になり、FILTER で落とされます。
「英字だけ抽出」の判定の核はここだと意識しておくと、
他の条件(数字だけ、記号だけ、など)にも応用しやすくなります。
例題
問題1
A2 に「A1b-23Z」という文字列が入っています。
この中から、英字だけを縦に抽出して
「A」「b」「Z」と並べて表示したいです。
FILTER と MID、SEQUENCE を使った式を書いてください。
=FILTER(MID(A2,SEQUENCE(LEN(A2)),1),(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))>=65)*(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))<=90))
問題2
A2 に「品番-AB12-3xZ」という文字列が入っています。
この中から英字だけを抜き出して「ABxZ」という 1 本の文字列として表示したいです。
TEXTJOIN と FILTER を組み合わせた式を書いてください。
=TEXTJOIN("",TRUE,FILTER(MID(A2,SEQUENCE(LEN(A2)),1),(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))>=65)*(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))<=90)))
問題3
A2 に「ID2026-Excel-01」という文字列が入っています。
この中から英字だけを抽出し、「IDExcel」と表示したいです。
FILTER+MID+SEQUENCE+TEXTJOIN を使った式を書いてください。
=TEXTJOIN("",TRUE,FILTER(MID(A2,SEQUENCE(LEN(A2)),1),(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))>=65)*(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))<=90)))
問題4
A2 に「Room101A」という文字列が入っています。
この中から英字だけを抽出し、「RoomA」という文字列を返したいです。
FILTER と TEXTJOIN を使った式を書いてください。
=TEXTJOIN("",TRUE,FILTER(MID(A2,SEQUENCE(LEN(A2)),1),(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))>=65)*(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))<=90)))
問題5
A2 に「123-xyz-789-AB」という文字列が入っています。
この中から英字だけを抽出し、「xyzAB」という文字列として表示したいです。
FILTER を使った英字抽出の標準的な式を書いてください。
=TEXTJOIN("",TRUE,FILTER(MID(A2,SEQUENCE(LEN(A2)),1),(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))>=65)*(CODE(UPPER(MID(A2,SEQUENCE(LEN(A2)),1)))<=90)))
FILTER × MID × SEQUENCE の型は、一度覚えると応用範囲が非常に広いです。
- 英字だけ
- 数字だけ
- 特定の記号だけ
- 条件に合う文字だけ
を“動的にふるいにかけて”取り出せるようになるので、
文字列処理のレベルが一段上がります。
まずは、この「英字だけ抽出」の式をそのまま真似して、
自分のシートで動かしてみてください。
そこから少しずつ条件部分をいじっていくと、理解がグッと深まります。
