【VBA】全角⇔半角を一括変換してデータを統一する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク

この記事でできること

  • VBAで全角文字を半角に一括変換できる(英数字・カタカナ)
  • 半角文字を全角に一括変換できる
  • 英数字だけ半角に変換し、カタカナは全角のまま残せる
  • 変換前後の比較レポートを別シートに出力して確認できる

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

どんな場面で使う?

全角半角の混在は、Excelでデータを扱ううえで最もよくあるトラブルの原因の1つ。以下のような場面でこの記事のマクロが役に立つ。

  • VLOOKUPやINDEX/MATCHで突合したら不一致が大量に出た。原因を調べたら全角ハイフンと半角ハイフンの違いだった、という経験がある人は多いはず
  • 複数人で入力した取引先マスタや商品マスタの表記がバラバラ。ある人は全角で「ABC」、別の人は半角で「ABC」と入力していて、集計がうまくいかない
  • CSVインポートしたデータの電話番号や郵便番号が全角になっている。外部システムから取り込んだデータは全角で入ってくることが多い
  • 住所データの番地部分を半角に統一したいが、カタカナ(マンション名など)は全角のまま残したい
  • 月次で届くデータを毎回手動で置換している。Ctrl+Hで1文字ずつ置換するのは非効率で、漏れも発生しやすい

どれも「全角半角の統一」という1つの処理で解決できる。手作業でやると漏れが出るが、VBAなら確実に全セルを処理してくれる。

完成イメージ(Before / After)

Before(全角半角が混在):

A B C
1 取引先コード 電話番号 住所
2 ABC-001 03-1234-5678 東京都渋谷区1-2-3
3 DEF-002 03-2345-6789 大阪府大阪市北区4-5
4 GHI-003 06-3456-7890 福岡県福岡市中央区6

After(半角に統一):

A B C
1 取引先コード 電話番号 住所
2 ABC-001 03-1234-5678 東京都渋谷区1-2-3
3 DEF-002 03-2345-6789 大阪府大阪市北区4-5
4 GHI-003 06-3456-7890 福岡県福岡市中央区6

全角の英数字・記号がすべて半角に統一される。VLOOKUPの不一致もなくなる。

取引先マスタの電話番号が全角と半角で混在していて、VLOOKUPで突合したら30件も不一致が出た。原因を調べたら全角ハイフンと半角ハイフンの違いだった。StrConvで一括変換するマクロを作ってからは、突合ミスがゼロになった。全角半角の表記揺れに悩んでいる人に、このマクロで同じ快適さを手に入れてほしい。

全角と半角の混在は、VBAで一括変換すればボタン1つで統一できる。

実行前の準備

バックアップを取る

全角半角変換はセルの値を直接書き換える操作。VBAで変換した内容はCtrl+Zで元に戻せない。 実行前に必ずファイルのコピーを別フォルダに保存しておく。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す
  2. VBE(Visual Basic Editor)が開く

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」
  2. 白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. Alt + F8 → マクロ名を選んで「実行」

ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。

コード(最小版)– 全角→半角に一括変換

まずはStrConv関数を使った最もシンプルなコード。指定範囲のセルをすべて全角→半角に変換する。最終行の取得には Cells(Rows.Count, 1).End(xlUp).Row を使う。詳しくは 最終行を正確に取得する方法 を参照。


'============================================================
' ■ 全角→半角に一括変換する(最小版)
'   → 指定範囲のセルの全角文字を半角に変換
'   → StrConv関数の vbNarrow を使用
'============================================================
Sub 全角を半角に変換する()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim c As Range
    Dim targetRange As Range

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- データがない場合は終了
    If lastRow < 2 Then
        MsgBox "データがありません。", vbExclamation
        Exit Sub
    End If

    '--- ★書き換えポイント:変換対象の範囲
    Set targetRange = ws.Range("A2:C" & lastRow)

    '--- 全角→半角に変換
    For Each c In targetRange
        If Not IsEmpty(c.Value) And Not c.HasFormula Then
            c.Value = StrConv(c.Value, vbNarrow)
        End If
    Next c

    MsgBox "全角→半角の変換が完了しました。"
End Sub

書き換えポイント

変数・箇所 説明 初期値
Range("A2:C" & lastRow) 変換対象の範囲。列が多ければ "A2:F" などに変更 A〜C列
vbNarrow 変換方向。半角→全角なら vbWide に変更 全角→半角

コードの流れ

  1. ActiveSheet で現在のシートを取得
  2. Cells(Rows.Count, 1).End(xlUp).Row でA列の最終行を取得
  3. 変換対象の範囲を Range("A2:C" & lastRow) で指定
  4. For Each でセルを1つずつ処理
  5. 空セルと数式セルをスキップし、StrConv(値, vbNarrow) で全角→半角に変換
  6. 変換後の値をセルに書き戻す

このコードで特に重要なのは、Not IsEmpty(c.Value) And Not c.HasFormula の条件判定。空セルに StrConv を実行しても問題はないが、無駄な処理が増えるので効率が落ちる。数式セルは絶対にスキップすべきで、たとえば =A1&B1 のような数式に対して .Value = StrConv(...) を実行すると、数式が消えて値だけのセルになってしまう。これはCtrl+Zで元に戻せないので、取り返しがつかない。

また、StrConv の第2引数に vbNarrow を指定すると全角→半角、vbWide を指定すると半角→全角になる。この引数は組み合わせて使うこともできて、たとえば vbNarrow + vbUpperCase なら「全角→半角に変換しつつ、小文字→大文字にも変換」という処理が1回の呼び出しでできる。

StrConv関数の引数一覧

定数 説明
vbNarrow 8 全角→半角に変換
vbWide 4 半角→全角に変換
vbUpperCase 1 小文字→大文字に変換
vbLowerCase 2 大文字→小文字に変換
vbKatakana 16 ひらがな→カタカナに変換
vbHiragana 32 カタカナ→ひらがなに変換

コード(実務版)– 英数のみ半角変換 + 確認ダイアログ

実務では「英数字と記号は半角に統一したいけど、カタカナは全角のまま残したい」というケースが多い。この実務版では、英数字・記号だけを半角に変換し、カタカナは全角のままにする。

自分はこのコードを取引先マスタの整備に使っている。電話番号や取引先コードの英数字だけ半角に揃えるので、VLOOKUPの突合ミスがなくなった。確認ダイアログで変換対象の件数を表示してから実行するので安心感がある。

カタカナまで半角に変換してしまい、住所欄が半角カナだらけになったことがある。印刷したら読みにくくて上司にやり直しを指示された。英数字だけ半角にしたい場合は、このコードを使おう。


'============================================================
' ■ 英数字・記号のみ半角に変換する(実務版)
'   → カタカナは全角のまま残す
'   → 確認ダイアログ付き + 変換件数を表示
'   → エラー発生時も画面更新を復帰
'============================================================
Sub 英数のみ半角に変換する()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim c As Range
    Dim targetRange As Range
    Dim convertCount As Long
    Dim beforeVal As String
    Dim afterVal As String

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- データがない場合は終了
    If lastRow < 2 Then
        MsgBox "データがありません。", vbExclamation
        Exit Sub
    End If

    '--- ★書き換えポイント:変換対象の範囲
    Set targetRange = ws.Range("A2:C" & lastRow)

    '--- 確認ダイアログ
    If MsgBox(targetRange.Cells.Count & " セルを対象に" & vbCrLf & _
              "英数字・記号を半角に変換します。" & vbCrLf & _
              "(カタカナは全角のまま残します)" & vbCrLf & vbCrLf & _
              "実行しますか?", vbYesNo + vbQuestion) = vbNo Then
        Exit Sub
    End If

    '--- 画面更新を停止(高速化)
    Application.ScreenUpdating = False
    On Error GoTo ErrHandler

    convertCount = 0

    '--- 英数字・記号のみ半角に変換
    For Each c In targetRange
        If Not IsEmpty(c.Value) And Not c.HasFormula Then
            beforeVal = CStr(c.Value)
            afterVal = ConvertAlphanumToNarrow(beforeVal)
            If beforeVal <> afterVal Then
                c.Value = afterVal
                convertCount = convertCount + 1
            End If
        End If
    Next c

    '--- 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox convertCount & " セルを変換しました。", vbInformation
    Exit Sub

ErrHandler:
    Application.ScreenUpdating = True
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbExclamation
End Sub

'============================================================
' ■ 英数字・記号のみ半角に変換する関数(補助)
'   → 全角英数字・記号を半角に変換
'   → カタカナ・ひらがな・漢字はそのまま残す
'============================================================
Private Function ConvertAlphanumToNarrow(ByVal text As String) As String
    Dim i As Long
    Dim char As String
    Dim result As String
    Dim converted As String

    result = ""

    For i = 1 To Len(text)
        char = Mid(text, i, 1)
        converted = StrConv(char, vbNarrow)

        '--- 変換後の文字が半角カナになる場合は変換しない(元の全角カナを維持)
        If IsKatakana(char) Then
            result = result & char
        Else
            result = result & converted
        End If
    Next i

    ConvertAlphanumToNarrow = result
End Function

'============================================================
' ■ カタカナ判定関数(補助)
'   → 全角カタカナかどうかを判定
'   → U+30A0〜U+30FF(カタカナブロック)
'============================================================
Private Function IsKatakana(ByVal char As String) As Boolean
    Dim code As Long
    code = AscW(char)
    '--- 全角カタカナの範囲: U+30A0〜U+30FF
    '    長音記号「ー」(U+30FC) もこの範囲に含まれる
    IsKatakana = (code >= &H30A0 And code <= &H30FF)
End Function

書き換えポイント

変数・箇所 説明 初期値
Range("A2:C" & lastRow) 変換対象の範囲 A〜C列
ConvertAlphanumToNarrow 変換関数。全角→半角の方向を変えたい場合は関数内を修正 英数のみ半角

コードの流れ

  1. データ存在チェック: 最終行が2未満ならデータなしで終了
  2. 確認ダイアログ: 対象セル数と変換内容を表示し、「いいえ」なら中止
  3. 画面更新を停止: ScreenUpdating = False でちらつきを防止
  4. エラーハンドリング: On Error GoTo ErrHandler でエラー時も画面更新を復帰
  5. セルをループ: 空セルと数式セルをスキップし、ConvertAlphanumToNarrow で英数字のみ半角に変換
  6. カタカナ判定: IsKatakana 関数で全角カタカナを判定し、カタカナは変換しない
  7. 変換件数カウント: 変換前後で値が変わったセルだけカウント
  8. 画面更新を再開: ScreenUpdating = True

IsKatakana 関数はUnicodeのカタカナブロック(U+30A0〜U+30FF)で判定している。長音記号「ー」もこの範囲に含まれるため、全角のまま維持される。

この実務版の核心は ConvertAlphanumToNarrow 関数にある。StrConvの vbNarrow をそのまま使うとカタカナまで半角になってしまうため、1文字ずつ取り出して「カタカナかどうか」を判定し、カタカナなら元のまま、それ以外なら半角に変換するという処理をしている。1文字ずつ処理するぶん最小版より遅くなるが、実務で「英数字だけ半角にしたい」というニーズは非常に多いので、この処理コストは十分に見合う。なお、処理速度が気になるほどデータが多い場合は、配列に一括読み込みしてから処理する方法もある。

応用:変換前後の比較レポートを出力する

変換した内容を後から確認したいときは、変換前後の値を別シートに記録しておくと安心。上司への報告やダブルチェックにも使える。

全角半角変換と セルの文字列を一括置換する方法 を組み合わせれば、表記揺れをより徹底的に解消できる。


'============================================================
' ■ 変換前後の比較レポートを出力する(応用)
'   → 変換前・変換後の値を「変換レポート」シートに記録
'   → 英数のみ半角変換 + レポート出力
'   → エラー発生時も画面更新を復帰
'============================================================
Sub 変換レポート付きで半角変換する()
    Dim ws As Worksheet
    Dim reportWs As Worksheet
    Dim lastRow As Long
    Dim c As Range
    Dim targetRange As Range
    Dim convertCount As Long
    Dim reportRow As Long
    Dim beforeVal As String
    Dim afterVal As String

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- データがない場合は終了
    If lastRow < 2 Then
        MsgBox "データがありません。", vbExclamation
        Exit Sub
    End If

    '--- 確認ダイアログ
    If MsgBox("英数字を半角に変換し、変換レポートを出力します。" & vbCrLf & _
              "(既存の「変換レポート」シートは上書きされます)" & vbCrLf & vbCrLf & _
              "実行しますか?", vbYesNo + vbQuestion) = vbNo Then
        Exit Sub
    End If

    Application.ScreenUpdating = False
    On Error GoTo ErrHandler

    '--- レポートシートの作成(既存の場合は削除して再作成)
    On Error Resume Next
    Application.DisplayAlerts = False
    ws.Parent.Sheets("変換レポート").Delete
    Application.DisplayAlerts = True
    On Error GoTo ErrHandler

    Set reportWs = ws.Parent.Sheets.Add(After:=ws)
    reportWs.Name = "変換レポート"

    '--- レポートのヘッダー
    reportWs.Range("A1").Value = "セル位置"
    reportWs.Range("B1").Value = "変換前"
    reportWs.Range("C1").Value = "変換後"
    reportWs.Range("A1:C1").Font.Bold = True

    '--- ★書き換えポイント:変換対象の範囲
    Set targetRange = ws.Range("A2:C" & lastRow)

    convertCount = 0
    reportRow = 2

    '--- 英数字・記号のみ半角に変換 + レポート記録
    For Each c In targetRange
        If Not IsEmpty(c.Value) And Not c.HasFormula Then
            beforeVal = CStr(c.Value)
            afterVal = ConvertAlphanumToNarrow(beforeVal)
            If beforeVal <> afterVal Then
                '--- レポートに記録
                reportWs.Cells(reportRow, 1).Value = c.Address(False, False)
                reportWs.Cells(reportRow, 2).Value = beforeVal
                reportWs.Cells(reportRow, 3).Value = afterVal
                reportRow = reportRow + 1

                '--- セルの値を更新
                c.Value = afterVal
                convertCount = convertCount + 1
            End If
        End If
    Next c

    '--- レポートシートの列幅を自動調整
    reportWs.Columns("A:C").AutoFit

    Application.ScreenUpdating = True

    '--- 結果表示
    If convertCount > 0 Then
        reportWs.Activate
        MsgBox convertCount & " セルを変換しました。" & vbCrLf & _
               "「変換レポート」シートで詳細を確認できます。", vbInformation
    Else
        '--- 変換がなければレポートシートを削除
        Application.DisplayAlerts = False
        reportWs.Delete
        Application.DisplayAlerts = True
        MsgBox "変換対象のセルはありませんでした。", vbInformation
    End If
    Exit Sub

ErrHandler:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbExclamation
End Sub

書き換えポイント

変数・箇所 説明 初期値
Range("A2:C" & lastRow) 変換対象の範囲 A〜C列
"変換レポート" レポートシートの名前 変換レポート

この応用版では、実務版と同じ ConvertAlphanumToNarrow 関数と IsKatakana 関数を使う。実務版のコードと一緒に同じ標準モジュールに貼り付けること。

よくある落とし穴5選

1. カタカナまで半角に変換してしまった

StrConv(値, vbNarrow) はカタカナも半角カナに変換する。住所や氏名のカタカナまで半角になると読みにくい。英数字だけ半角にしたい場合は実務版コードを使う。

2. 数式セルまで変換してしまった

数式セルに対して .Value = StrConv(...) を実行すると、数式が壊れて値だけのセルになる。c.HasFormula で数式セルをスキップするのが安全。

3. 変換後にCtrl+Zで元に戻せない

VBAで変更した内容はExcelの「元に戻す」機能(Ctrl+Z)では戻せない。必ず実行前にバックアップを取る。 応用版の変換レポートを使えば、変換前の値を記録しておける。

4. 全角スペースと半角スペースの違いに気づかない

vbNarrow は全角スペースも半角スペースに変換する。これは便利だが、意図的に全角スペースを使っている箇所(氏名の姓と名の間など)も半角スペースになってしまう。

5. 大量データでマクロが遅い

1万行を超えるデータだと、セル1つずつの処理に時間がかかることがある。ScreenUpdating = False で画面のちらつきを抑えるだけでも改善する。さらに高速化したい場合は マクロを高速化する方法 を参照。

6. 全角ハイフン「-」と長音記号「ー」の見分けがつかない

全角ハイフン「-」(U+FF0D)と長音記号「ー」(U+30FC)は見た目がほぼ同じだが、Unicodeのコードが異なる。vbNarrow で変換すると全角ハイフンは半角ハイフン「-」に変換されるが、長音記号はカタカナブロックに属するため変換されない。住所データなどで「渋谷区1ー2ー3」のように長音記号が混入していると、半角変換しても「渋谷区1ー2ー3」のように長音記号だけ残ってしまう。こうした特殊なケースは文字列を一括置換する方法(記事034)で個別に対処するのが確実。

FAQ

Q: 半角→全角に変換したい場合は?

A: 最小版コードの vbNarrowvbWide に変更する。

Q: 特定の列だけ変換したい

A: Set targetRange = ws.Range("B2:B" & lastRow) のように対象列を変更する。

Q: カタカナを半角→全角に変換したい

A: StrConv(値, vbWide) で半角カナも全角カタカナに変換できる。ただし英数字も全角になるので注意。

Q: 変換後にVLOOKUPが一致するようになる?

A: 全角半角が原因の不一致は解消される。前後のスペースや表記揺れ(「株式会社」と「(株)」など)は別途 セルの文字列を一括置換する方法 で対応する。

Q: ボタンに割り当てて実行したい

A: 方法は マクロをボタン1つで実行する方法 を参照。

まとめ

  • StrConv(値, vbNarrow) で全角→半角、vbWide で半角→全角に変換できる
  • 英数字だけ半角にしたい場合は、1文字ずつカタカナ判定して変換する
  • 数式セルはスキップし、値セルのみ変換する
  • 変換はCtrl+Zで戻せないので、実行前にバックアップを取る
  • 変換レポートを出力すれば、何がどう変わったか後から確認できる

全角半角の混在は、データ集計やVLOOKUPの突合で「原因不明の不一致」を引き起こす最大の原因の1つ。手作業でCtrl+Hの置換を繰り返すのは非効率だし、必ず漏れが出る。この記事のマクロを使えば、ボタン1つで全セルを確実に変換できるので、データ整備の最初のステップとして定番にしてほしい。変換レポートを出力しておけば、上司への報告やダブルチェックにも使える。表記揺れの解消は、文字列を一括置換する方法(記事034)正規表現でパターンマッチする方法(記事066)と組み合わせると、さらに徹底できる。

次にやりたくなること

もっとカスタマイズしたい場合

「住所データのカタカナだけ全角に統一したい」「取引先コードの英数字だけ半角に揃えたい」など、データに応じた細かい調整が必要な場合は、ココナラで相談してみてください。

コメント

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