[作って]データを整形する数式


【2025年9月】

外部から送られてきたデータに「半角と全角の混在」や「セル内改行」などが含まれていた場合、そのまま処理できない場合があります。そうしたデータを整形するのって、実務では頻繁に起こります。そんなときにマクロを活用しているという声が多いので、それをAIに作ってもらう検証をしました。詳しくは、下記のページをご覧ください。

[作って]データを整形するマクロ

さて、今回は、そうした整形処理を数式でやってみようと。さっそくAIに作ってもらいましょう。

ケース1:半角と全角の混在

Sheet1のセル範囲A2:A5にデータが入力されています。データは「ABC-100」のような形式ですが、"英字", "記号", "数値"の一部が全角で入力されているものがあります。それら「半角と全角が混在」されているデータを、すべて半角に統一して同じ行のB列に代入する数式を作って。
=TEXTJOIN("",,UNICHAR(MID(CODE(A2),1,1)-IF(OR(AND(CODE(A2)>=65281,CODE(A2)<=65374),CODE(A2)=12288),65248,0)))

ただし、Excel標準関数のみでは全角→半角変換は直接できません。
上記は1文字目のみの例です。
複数文字を一括で変換したい場合、以下のように各文字ごとに処理するカスタム関数(LAMBDA)を使います。
Excel 365 でLAMBDAが使える場合、名前付き関数として以下を登録し、B2に

=TOHALFWIDTH(A2)

と入力してください。

LAMBDA定義例(名前: TOHALFWIDTH):
=LAMBDA(txt,
  TEXTJOIN("",
    ,
    MAP(MID(txt,SEQUENCE(LEN(txt)),1),
      LAMBDA(c,
        LET(
          code, CODE(c),
          UNICHAR(
            IF(
              code=12288, 32,
              IF(AND(code>=65281,code<=65374), code-65248, code)
            )
          )
        )
      )
    )
  )
)

この方法でA2:A5の全角英数字・記号・スペースを半角に統一できます。
な、なんか…いきなり、どうしたのでしょうか。
ただし、Excel標準関数のみでは全角→半角変換は直接できません

サービス問題だったのに。もっと、違う言い方をするべきだったのかな?

セルA1に「ABC-100」のようなデータが入力されています。このデータを「ABC-100」のように、"英字", "記号", "数値"のすべてを半角にする数式を作って。
'Sheet1' の A1:B5 を調べ、1 つの数式を確認して 選択したセル に挿入します:

=REGEXREPLACE($A$2:$A$5,"[A-Za-z0-9-]",LAMBDA(x,UNICHAR(CODE(x)-65248)))

全角の英数字や記号を半角に統一して、データの表記ゆれを解消します。

今度は正規表現ですか。だったら

全角のカタカナや英数字を、半角に変換するワークシート関数を教えて。
Excel標準のワークシート関数のみで「全角カタカナや英数字」を
すべて半角に変換する関数はありません。
(以下、LAMBDA関数の話なので略)

同じプロンプトで、ChatGPTに聞いてみます。

ASC 関数(半角に変換)
=ASC(A1)

A1 に全角のカタカナ・英数字・記号などが入っていると、それを半角に変換します。

対応例:
「ABC」 → 「ABC」
「アイウ」 → 「アイウ」

注意点
ASC 関数は日本語環境の Excel でのみ動作します(日本語IMEが有効な環境)。
全角の 漢字 や ひらがな は変換できません。
半角カナに変換されるため、見た目や用途に注意が必要です(例:「アイウ」→「アイウ」)。

GoogleのGeminiに聞いてみます。

Excelで全角のカタカナや英数字を半角に変換するには、ASC関数を使います。

Claudeに聞いてみます。

Excelで全角文字を半角に変換するワークシート関数は ASC関数 です。

もう一度、Copilotに聞いてみます。

Excel標準のワークシート関数のみでは「全角カタカナや英数字」をすべて半角に変換する
関数はありませんが、Excel 365 以降でLAMBDA関数とMAP関数を使えば、下記のような
カスタム関数(名前付き関数)で対応できます。
(以下、LAMBDA関数の話なので略)
Excelの、ASC関数について教えて。
ASC関数は、Excelの日本語環境で使える関数で、全角(全幅)文字を半角(半幅)文字に
変換します。主に全角の英数字やカタカナ、記号などを半角に変換する際に使います。

=ASC(A2)

A2セルに「ABC-100」と入力されている場合、この式は「ABC-100」と半角に変換します。

アンジャッシュの"すれ違いコント"を見ているようです。もう、この件は終わりにします。

ケース2:半角スペースと全角スペースの変換

Sheet1のセルA1に、「Bill Gates」のように姓と名の間が半角スペースで区切られたデータがあります。このデータの"半角スペース"だけを"全角スペース"に変換する数式を作って。
=SUBSTITUTE(A1, " ", " ")

こっちは予想どおりです。もしかすると、ASC関数って日本語環境でしか使えないので、AIは誤解していたのかな?なんか疲れたので、先にいきます。

ケース3:セル内改行

Sheet3に、セル内改行されているセルがあります。セル内改行の前と後ろに分割する数式を作って。
以下の数式を使って、セル内改行の「前」と「後ろ」に分割できます。

改行前(例:B2セルに入力)
=IFERROR(INDEX(TEXTSPLIT(A2,CHAR(10)),1,1),"")

改行後(例:C2セルに入力)
=IFERROR(INDEX(TEXTSPLIT(A2,CHAR(10)),1,2),"")

もしかして、嫌がらせをされているのでしょうか。俺、なんかした?AIの中で、VBA担当と数式担当が変わったのかな。1つの数式でやってもらいましょう。

Sheet3に、セル内改行されているセルがあります。セル内改行の前と後ろに分割する、1つの数式を作って。

数式担当は、お忙しいようです。答えてくれるまで続けます。

=TEXTSPLIT(A2,CHAR(10))

ですよね。なんで最初は、TEXTSPLIT関数の結果を、わざわざINDEX関数で分割したのでしょう。もし"前だけ"とか"後ろだけ"っていうなら分かるけど。それに、今度のにはIFERROR関数がありません。さっきと違って、エラーは想定していないのでしょうか。なんか、うるさい客だから「はいはい、これでいいんでしょ」って言われた感が否めないです。

ケース4:結合セル

これは、そもそも数式だけで行うのは難しいです。でも、一応聞いてみます。

Sheet4のセル範囲A2:A4はセル結合されています。セル内の文字を、別の列で3行に分割する数式を作って。なお、分割した3つのセルには、すべて結合セルと同じ文字列を表示してください。
=$A$2

この数式を、分割先の3行(例:B2:B4)すべてに入力してください。すべて「田中」と表示されます。

ああ、やっぱりそうだ、間違いない。私、AIの数式担当に嫌われているんだ。覚えはないけど、たぶん何か気に障るようなことを言ったんでしょうね。すみませんでした、今後は気をつけますので許してください。あの、もうけっこうです。自分でやりますから。お手数を煩わせて申し訳ありません。

まとめ

たぶん私が悪いんでしょうけど、今回は数式担当様の機嫌が良くなかったようです。いずれにしても、VBAでは、こちらのやりたいことを察してくれるのに対して、数式を作ってもらうのは、なかなかに大変だということです。少し間を空けて、また検証してみます。そうだ、今度は何か手土産を持って行こうw お酒好きかな?