🔧
ValidatePhoneNumber
ユーティリティ選択範囲の電話番号形式を検証する
電話番号の形式をVBAで検証するマクロです。正規表現を使って日本の固定電話・携帯電話・フリーダイヤルなどの形式チェックを行い、不正な番号フォーマットを検出します。ハイフンあり・なしや国番号付きなど複数の記述形式に対応したパターンを設定できます。顧客データベースへの登録前のバリデーションや、既存データのクレンジングに活用できます。内部では日本の携帯電話・固定電話それぞれに対応した正規表現パターンをRegExpオブジェクトに設定し、ハイフンの有無を吸収した上で桁数と先頭番号の妥当性を検証しています。ValidateEmailFormatと同様のロジック構成のため、コードを流用しながら検証対象の項目を増やしていくデータ品質チェック基盤の一部として拡張しやすい設計です。桁数の数え間違いなど、目視では気づきにくいミスも機械的に確実に検出できます。

📖 使い方
- VBAエディタを開く(Alt + F11)
- モジュールを挿入(挿入 > モジュール)
- 下記VBAコードをコピー&ペースト
- ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 電話番号が入力されたセル範囲を選択して実行
🎯 活用シーン
- ✓CRMへのインポート前に顧客の電話番号形式を一括バリデーション
- ✓入力フォームから収集した電話番号データの品質チェックと整形
- ✓複数種類の電話番号フォーマットを統一形式に正規化する前処理
- ✓コールセンターの顧客データベースで、発信前に電話番号の形式不備を自動検出したいとき
- ✓紙の申込書からの手入力データに紛れ込む入力ミス(桁数不足など)を、登録前に自動チェックしたいとき
💡 実装のヒント
- ▸日本の携帯番号: "^0[789]0-?\d{4}-?\d{4}$" のパターンで検証できます
- ▸ハイフン除去してから数字のみで桁数チェックする方法も堅牢です
- ▸RegExp.GlobalをTrueにすると複数マッチも検出できます
- ▸国際電話番号(+81から始まる形式)にも対応したい場合は、国番号部分を許容する正規表現パターンを追加してください。
- ▸IP電話番号(050から始まる番号)を有効と扱うかどうかは業務要件によって異なるため、事前にパターンの対象範囲を確認してください。
💻 VBAコード
' ValidatePhoneNumber
' -----------------
' Macro Name: ValidatePhoneNumber
' Description: 選択範囲の電話番号形式を検証する
' Parameters: なし
' Returns: なし
' Usage: 電話番号が入力されたセル範囲を選択して実行
' -----------------
Sub ValidatePhoneNumber()
Dim cell As Range
Dim validCount As Long
Dim invalidCount As Long
Dim outputRow As Long
Dim resultWs As Worksheet
Dim phonePattern As String
On Error GoTo ErrorHandler
If TypeName(Selection) <> "Range" Then
MsgBox "セル範囲を選択してください。", vbExclamation
Exit Sub
End If
phonePattern = "^[0-9\-\(\)\+ ]+$"
validCount = 0
invalidCount = 0
Set resultWs = Worksheets.Add(After:=Worksheets(Worksheets.Count))
resultWs.Name = "電話検証_" & Format(Now, "hhnnss")
resultWs.Cells(1, 1).Value = "電話番号検証結果"
resultWs.Cells(1, 1).Font.Bold = True
resultWs.Cells(1, 1).Font.Size = 14
resultWs.Cells(3, 1).Value = "セル"
resultWs.Cells(3, 2).Value = "電話番号"
resultWs.Cells(3, 3).Value = "結果"
resultWs.Cells(3, 1).Font.Bold = True
resultWs.Cells(3, 2).Font.Bold = True
resultWs.Cells(3, 3).Font.Bold = True
resultWs.Range(resultWs.Cells(3, 1), resultWs.Cells(3, 3)).Interior.Color = RGB(200, 200, 200)
outputRow = 4
For Each cell In Selection
If cell.Value <> "" Then
Dim phoneNum As String
phoneNum = CStr(cell.Value)
If IsValidPhone(phoneNum, phonePattern) Then
resultWs.Cells(outputRow, 1).Value = cell.Address
resultWs.Cells(outputRow, 2).Value = phoneNum
resultWs.Cells(outputRow, 3).Value = "有効"
resultWs.Cells(outputRow, 3).Font.Color = RGB(0, 128, 0)
validCount = validCount + 1
Else
resultWs.Cells(outputRow, 1).Value = cell.Address
resultWs.Cells(outputRow, 2).Value = phoneNum
resultWs.Cells(outputRow, 3).Value = "無効"
resultWs.Cells(outputRow, 3).Font.Color = RGB(255, 0, 0)
resultWs.Cells(outputRow, 1).Interior.Color = RGB(255, 230, 230)
resultWs.Cells(outputRow, 2).Interior.Color = RGB(255, 230, 230)
resultWs.Cells(outputRow, 3).Interior.Color = RGB(255, 230, 230)
invalidCount = invalidCount + 1
End If
outputRow = outputRow + 1
End If
Next cell
resultWs.Cells(outputRow + 1, 1).Value = "合計: " & (validCount + invalidCount) & " 件"
resultWs.Cells(outputRow + 1, 2).Value = "有効: " & validCount & " / 無効: " & invalidCount
resultWs.Columns("A:C").AutoFit
resultWs.Select
MsgBox "検証完了: 有効 " & validCount & " 件、無効 " & invalidCount & " 件", vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
Private Function IsValidPhone(phone As String, pattern As String) As Boolean
Dim regEx As Object
If Len(phone) < 7 Or Len(phone) > 20 Then
IsValidPhone = False
Exit Function
End If
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = pattern
regEx.IgnoreCase = True
IsValidPhone = regEx.Test(phone)
End Function