【AIマクロ探究シリーズ#3】厄介なスペース・文字種混在を一掃!AIマクロでデータ整形

AI

皆さん、こんにちは!下町AI探究者のガジュマロです。
ゴールデンウィークも近づき、新緑が目にまぶしい季節になりましたね。(2025年4月14日現在)

いつもブログを読んでくださり、本当にありがとうございます。

さて、「AIマクロ探究シリーズ」、今回で3回目となりました。#1では「結合セルの扱い」、#2では「リストからのシート大量作成」と、AIと一緒にExcelの面倒ごとを自動化してきました。少しずつ、マクロが身近なものに感じていただけていたら嬉しいです。

今日のテーマは、これまた多くの方が「地味に困る…」と感じているであろう、「見た目では分かりにくい不要なスペースや、全角・半角文字の混在」のお掃除です!

見た目は同じ、なのに…? データがうまく扱えない原因はこれかも

他のシステムからデータを移したり、複数人で入力したリストを使ったりする時、こんな経験はありませんか?

  • VLOOKUP関数で検索しても、該当するはずのデータが「#N/A」エラーになってしまう。
  • 並べ替え(ソート)をしても、同じ名前のはずなのに、別々のグループに分かれてしまう。
  • 集計(SUMIFなど)で、条件に合うはずのデータがカウントされない。

見た目は全く同じに見えるのに、なぜかExcelは「違うもの」として認識してしまう…。その原因としてよくあるのが、セルに入力された「余分なスペース」や「全角・半角の違い」なんです。

例えば、

  • ” 田中” (先頭にスペース) と “田中”
  • “テスト ” (末尾にスペース) と “テスト”
  • “TEST” (全角英字) と “TEST” (半角英字)
  • “123” (全角数字) と “123” (半角数字)
  • “ ” (全角スペース) と ” ” (半角スペース)

これらは、人間の目には同じように見えたり、違いに気づきにくかったりしますが、Excelにとっては明確に「異なるデータ」です。このことから、フィルターや関数などでこれらが混合したデータを同列に扱おうとする場合、修正作業が必要となってしまいます。

しかし、せっかく組んだ関数や便利なフィルター機能を活かすために、多くのデータを一つ一つ確認し、該当するデータがあったら修正していく…。業務効率化のために便利な機能を使いたいはずなのに、この作業で逆に時間が掛かってしまうのでは、本末転倒ですよね。しかも、修正抜けで集計結果が間違っていようものなら、目も当てられません。

「AIに”お掃除”マクロをお願い!」データクリーンアップに挑戦

そこで、今回もAIの力を借りて、この地味で厄介な”お掃除”作業を自動化するマクロを作ってもらいましょう!

今回は、次のような機能を持つマクロをお願いしてみることにしました。

AIへのお願い(プロンプト)例

Excel VBA マクロを作成してください。
選択されたセル範囲を対象に、以下の処理を各セルに適用してください。

1.  セルの値の前後の不要なスペースを削除する。
2.  セル内の全角スペースを半角スペースに変換する。
3.  セル内の全角数字(0~9)を半角数字(0~9)に変換する。
4.  セル内の全角英字(A~Z、a~z)を半角英字(A~Z、a~z)に変換する。

可能であれば、なるべく短いコードでお願いします。

ポイントは、スペースだけでなく、数字やアルファベットの全角・半角も統一するように、少し欲張ってお願いしてみた点です。そして、前回は非常に長くて理解しにくいマクロだったので、今度は「できれば短く!」というリクエストも添えてみました。AIはどう応えてくれるでしょうか?

AIが作ってくれたマクロコードはこちら!

Sub CleanSelectedCells()
    Dim rng As Range
    Dim cell As Range
    Dim originalValue As Variant

    ' 選択範囲がセル範囲かチェック
    If TypeName(Selection) <> "Range" Then
        MsgBox "セル範囲を選択してから実行してください。", vbExclamation
        Exit Sub
    End If

    ' ★処理対象のセル範囲を設定(現在選択されている範囲)
    Set rng = Selection

    ' 処理高速化のおまじない (画面更新を一時停止)
    Application.ScreenUpdating = False

    ' 選択範囲内の各セルをループ
    On Error Resume Next ' エラーが発生しても処理を続ける (例: 数式セルなどへの適用をスキップ)
    For Each cell In rng
        ' セルが空白でなく、文字列として扱えるか、また数式でないかを確認
        If Not IsEmpty(cell.Value) And VarType(cell.Value) = vbString And Not cell.HasFormula Then
            originalValue = cell.Value
            ' 1. 前後のスペース削除 & 2-4. 全角→半角変換 (英数記号スペース、カタカナも対象になります)
            cell.Value = Trim(StrConv(originalValue, vbNarrow))
        End If
    Next cell
    On Error GoTo 0 ' エラー処理を通常モードに戻す

    ' 処理高速化のおまじない解除
    Application.ScreenUpdating = True

    MsgBox "選択範囲のデータクリーンアップが完了しました。", vbInformation
End Sub

    どうでしょう? 前回のシート作成マクロに比べると、かなりスッキリと短いコードが出てきたように思いませんか? AIは「短く!」というリクエストにも応えてくれたのかもしれません。

このマクロのポイント(Trim関数とStrConv関数の合わせ技)

AIによると、このマクロが短いコードで複数の処理を実現できている秘密は、VBAに元々用意されている便利な関数をうまく組み合わせている点にあるとの事です。

  • Trim()関数: 文字列の前と後ろにある余分なスペース(半角・全角問わず)を取り除いてくれます。まさにリクエストの1番目にぴったりですね。
  • StrConv(文字列, vbNarrow)関数: これが今回の”お掃除”の主役かもしれません。vbNarrowという指定をすることで、文字列の中にある全角の文字を、対応する半角の文字に変換してくれます。これ一つで、以下の処理ができます。
    • 全角スペース → 半角スペース
    • 全角数字 → 半角数字
    • 全角英字 → 半角英字
    • (全角カタカナ → 半角カタカナ も同時に処理。これについては、後述します。)

つまり、Trim(StrConv(元の値, vbNarrow)) という一行で、お願いした1番から4番までの処理の多くを、効率よく実現しているわけです。流石にAI、賢いです!

試して発見!「カタカナ」問題

では、このマクロを試してみましょう。全角スペース、全角数字、全角アルファベット、そして「全角カタカナ」が含まれたデータを用意して実行してみます。

結果は…スペースや英数字は期待通り半角になりました。ですが、「全角カタカナ」で入力されていた部分が、半角の「テスト」のような形に変わってしまいました!

これは、StrConv(…, vbNarrow)関数が、英数字やスペースだけでなく、全角カタカナも半角カタカナに変換するという仕様のためです。よく見ると、AIが作ってくれたコードにも、カタカナを半角にするという記載がありました。用途によっては半角カタカナで良い、もしくはそうでないといけない場合もあるでしょう。しかし、今回の私のように、「いや、資料の体裁上、カタカナだけは全角のままにしたいんだ!」というケースもあるのではないでしょうか。

このように、作業をするうちに、自身が思っていた細かいニュアンスや特定の要望に気づく事は、よくあると思います。

AIに”追加注文”で再挑戦! (第二段階)

そこで、追加注文です。
「なるほど、vbNarrowはそういう仕様なのか。しかし、カタカナは例外にしてほしいな。じゃあ、それも出来るようにお願いしてみよう!」と、何度でも修正願いが出来るところも、AIのいい所です。

AIへのお願い(第二弾 – 追加注文)

先ほど作成してもらったVBAマクロコードを修正してください。
以下の処理は維持したいです。
・選択されたセル範囲が対象
・セルの値の前後の不要なスペースを削除
・セル内の全角スペースを半角スペースに変換
・セル内の全角数字を半角数字に変換
・セル内の全角英字を半角英字に変換
ただし、**「全角カタカナ」は半角にせず、全角のまま保持**するように変更してください。

(※最初のコードを提示し、「これを修正して」とお願いするのもアリです。)

このように、最初の結果を踏まえて具体的な条件を追加することで、AIはより私たちの意図に近いコードを生成しようとしてくれます。

AIが”追加注文”に応じて修正してくれたコード

Sub CleanNarrow_KeepFullKatakana()
    ' 説明: 選択されたセル範囲内の文字列に対し、前後のスペース削除、
    '       全角スペース・英数字を半角に変換します。
    '       ※全角カタカナは全角のまま保持します。
    
    ' 変数宣言
    Dim rngSelected As Range ' 処理対象の選択範囲
    Dim cell As Range        ' ループ用セルオブジェクト
    Dim tempValue As String  ' 一時的な文字列格納用
    
    ' --- 初期チェック ---
    If TypeName(Selection) <> "Range" Then
        MsgBox "処理対象となるセル範囲を選択してください。", vbExclamation, "範囲未選択"
        Exit Sub
    End If
    
    ' --- 処理対象範囲の設定 ---
    Set rngSelected = Selection
    
    ' --- パフォーマンス最適化 ---
    Application.ScreenUpdating = False
    
    ' --- メイン処理 ---
    On Error Resume Next
    For Each cell In rngSelected.Cells
        If VarType(cell.Value) = vbString And Not cell.HasFormula Then
            ' Step 1: まず全体を半角に変換し、前後のスペースを削除
            tempValue = Trim$(StrConv(CStr(cell.Value), vbNarrow))
            
            ' Step 2: 半角になってしまったカタカナを全角に戻す
            cell.Value = RevertHalfKatakanaToFull(tempValue)
        End If
    Next cell
    On Error GoTo 0
    
    ' --- 終了処理 ---
    Application.ScreenUpdating = True
    MsgBox "選択範囲のクリーンアップが完了しました (カタカナは全角維持)。", vbInformation, "処理完了"
    
    Set cell = Nothing
    Set rngSelected = Nothing
    
End Sub

' --- 補助関数: 文字列中の半角カタカナを全角カタカナに戻す ---
Function RevertHalfKatakanaToFull(ByVal text As String) As String
    Dim i As Long
    Dim result As String
    Dim charCode As Long
    Dim currentChar As String
    
    result = "" ' 結果を格納する文字列を初期化
    For i = 1 To Len(text)
        currentChar = Mid$(text, i, 1) ' 文字列から1文字取り出す
        charCode = AscW(currentChar)   ' その文字のUnicodeコードを取得
        
        ' Unicodeコードが半角カタカナの範囲内かチェック
        ' (&HFF61~&HFF9F: 半角カナ文字、長音記号、句読点などを含む)
        If (charCode >= &HFF61 And charCode <= &HFF9F) Then
            ' 半角カタカナだったら、全角に変換して結果に追加
            result = result & StrConv(currentChar, vbWide)
        Else
            ' 半角カタカナ以外はその文字をそのまま結果に追加
            result = result & currentChar
        End If
    Next i
    
    ' 処理結果の文字列を関数の戻り値とする
    RevertHalfKatakanaToFull = result
End Function

コードは少し長くなったようですが、機能はバッチリです。
Function以降を見ると、どうやら一度 vbNarrow で全体を半角にした後、RevertHalfKatakanaToFull という補助関数を使って半角カタカナだけを検出し、vbWide で全角に戻す、という二段階の処理を行っているようです。
これで、私の要望に応えてくれるマクロになりました。

今回は全角カタカナに限りましたが、場合によっては英数字やスペースを全角にしたい!などの要望がある事もあるでしょう。その場合は、同様にお願いしてみる事で、自身の思い描く機能を得る事が出来そうです。

使い方と注意点 (おなじみなので、読み飛ばし可)

  • 使い方: 上記のコードをVBEの標準モジュールに貼り付け、整形したいセル範囲を選択してからF5キーでマクロを実行しましょう。
  • 注意点:
    • 必ずコピーしたファイルでテストしましょう。
    • AIのコードは予期せぬ挙動が出る可能性を考慮しましょう。
    • コードを覗いてみて、意味を汲み取ったり、こんなこともできるんだ、などと頭の隅にとどめておくと、応用が効きやすいです。
    • セキュリティには引き続き注意しましょう。

まとめ:見えないゴミもAIマクロでスッキリお掃除!

今回は、「AIマクロ探究シリーズ」の第三弾として、見た目では分かりにくい不要なスペースや全角・半角の混在を、AIが生成したマクロで一括クリーンアップする方法をご紹介しました。

データ分析や集計の前処理として、こうした「データのお掃除(データクレンジングとも言います)」は非常に重要である一方、それを手作業で行うには本当に手間がかかります。そんな時、AIにサッとマクロを作ってもらって、一瞬でデータをきれいにできたら、とても効率的ですよね。

ほかにも、このような「地味だけど面倒なデータ整形作業」があったら、ぜひ今回のようにAIに作ってもらったマクロを試してみてください。作業のあまりのスマートぶりが気持ちよくて、もっと他にも作業無いかな?と思わず探してしまうかもしれませんよ。

更に今回は、AIにお願いして作ってもらったマクロが自身の要望と合わなかった際に、再度のお願いによってブラッシュアップしてもらう様子も見てもらいました。AIを使うと、追加の要望によって多数の機能を持つマクロを組み上げることもかなり容易です。興味があったら、試してみると面白いかもしれません。

それでは、また次回の「AIマクロ探究シリーズ」でお会いしましょう! 

コメント

タイトルとURLをコピーしました