Excelでメールアドレスと電話番号の正当性をチェックする方法

メールアドレスや電話番号の形式が正しいかどうかを判定するサンプルアプリをご紹介します。このアプリは、Excelシート上で動作し、指定された範囲のメールアドレスと電話番号をチェックし、形式が誤っている場合は「×」を表示します。以下に、サンプルアプリの使い方や利点、そしてコードの概要を詳しく説明します。

サンプルアプリの使い方

Excelシート上に配置された「メールアドレス・電話番号チェック」ボタンをクリックします。
C列のメールアドレスの形式が誤っている場合は、右隣に「×」マークが付きます。
E列の電話番号形式が間違っている場合も、メールアドレスと同様に右隣に「×」マークが表示されます。正しい電話番号形式の場合は、固定電話番号か携帯電話番号かが判別され、右隣に表示されます。

アプリの利用メリット

サンプルアプリを使用するメリットとしては次の点が上げられます。

形式の厳密な判定:
正規表現検索機能を使用しているため、メールアドレスと電話番号の形式を厳密に判定します。
一括処理:
Excelシート上で一括してデータを処理できるため、大量の情報を手軽にチェックできます。
電話番号の詳細情報表示:
正しい電話番号の場合、固定電話番号か携帯電話番号かを判別して表示します。

正規表現検索機能について

今回のサンプルアプリでは、正規表現検索機能を利用して正当性を判断させています。
正規表現検索機能は、形式の厳密な判定に利用されています。正規表現を使用することで、特定のパターンに一致するかどうかを高度に判定できます。このアプローチにより、信頼性の高いデータ検証が可能となります。

メールアドレス正当性検証パターン
サンプルアプリコードの75行目:
 「 ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$ 」
この正規表現パターンは、メールアドレスの形式を検証するためのものです。以下に、正規表現パターンの要素を解説します

  1. ^: 行の先頭を示します。パターンが行の先頭から始まる必要があります。
  2. [a-zA-Z0-9._%+-]+: 最初の部分は、メールアドレスのローカルパート(@マークの前の部分)を表しています。ここでは、英字(大文字と小文字)、数字、および一部の特殊文字(ピリオド、アンダースコア、パーセント、プラス、ハイフン)が1回以上繰り返されることを示しています。
  3. @: ローカルパートとドメインパートを区切るための@マークです。
  4. [a-zA-Z0-9.-]+: ドメインパート(@マークの後の部分)を表しています。ここでも、英字(大文字と小文字)、数字、および一部の特殊文字(ピリオド、ハイフン)が1回以上繰り返されることを示しています。
  5. .: ドメインパートとトップレベルドメイン(TLD)を区切るピリオドです。
  6. [a-zA-Z]{2,}: トップレベルドメイン(TLD)を表しています。ここでは、英字(大文字と小文字)が2回以上繰り返されることを示しています。
  7. $: 行の末尾を示します。パターンが行の末尾で終わる必要があります。

総合的に、この正規表現パターンは、メールアドレスが一般的な形式に合致しているかどうかを確認するのに役立ちます。

固定電話正当性検証パターン
サンプルアプリコードの99行目:「 ^0(?!70|80|90)\d{1,4}-\d{1,4}-\d{4}$ 」
この正規表現パターンは、固定電話番号の形式を検証するためのものです。以下に、正規表現パターンの要素を解説します

  1. ^: 行の先頭を示します。パターンが行の先頭から始まる必要があります。
  2. 0: 固定電話番号が0から始まることを示します。
  3. (?!70|80|90): 否定先読み(negative lookahead)です。この部分は、70、80、90で始まる番号を許可しないようにします。つまり、70、80、90のいずれかで始まる場合にはマッチしないようになります。
  4. \d{1,4}: 数字(0から9までのいずれか)が1から4回繰り返されることを示します。これは市外局番の部分を表しています。
  5. -: ハイフンが続きます。
  6. \d{1,4}: もう一度、1から4回の数字の繰り返しです。これは市内局番を表しています。
  7. -: もう一度ハイフンが続きます。
  8. \d{4}: 最後に、4回の数字の繰り返しです。これは電話番号の最後の部分を表しています。
  9. $: 行の末尾を示します。パターンが行の末尾で終わる必要があります。

総合すると、この正規表現は、0から始まり、70、80、90で始まる番号を除外して、市外局番、市内局番、および電話番号がそれぞれ1から4桁、1から4桁、4桁である場合にマッチします。例えば、「0123-45-6789」はマッチしますが、「080-1234-5678」や「01234-5678-9012」はマッチしません。

携帯電話正当性検証パターン
サンプルアプリコードの111行目:「^0[789]0-[0-9]{4}-[0-9]{4}$」
この正規表現パターンは、携帯電話番号の形式を検証するためのものです。以下に、正規表現パターンの要素を解説します

  1. ^: 行の先頭を示します。パターンが行の先頭から始まる必要があります。
  2. 0: 携帯電話番号が0から始まることを示します。
  3. [789]: 文字クラスです。この部分は、次に続く1桁が7または8または9であることを示しています。つまり、携帯電話番号の先頭の数字が7、8、または9である必要があります。
  4. 0-: ハイフンが続きます。
  5. [0-9]{4}: 数字(0から9までのいずれか)が4回繰り返されることを示します。これは携帯電話番号の中間部分(市外局番相当)を表しています。
  6. -: もう一度ハイフンが続きます。
  7. [0-9]{4}: 最後に、数字が4回繰り返されることを示します。これは携帯電話番号の最後の部分を表しています。
  8. $: 行の末尾を示します。パターンが行の末尾で終わる必要があります。

総合すると、この正規表現は、0から始まり、次に続く1桁が7、8、または9であり、ハイフンで区切られた4桁の数字と4桁の数字で構成される携帯電話番号の形式にマッチします。例えば、「090-1234-5678」はマッチしますが、「070-234-56789」や「0123-4567-8901」はマッチしません。

コード処理の流れ

処理の流れは下記の内容に沿って行われます。

  1. Excelの指定範囲の既存データを削除します。
  2. メールアドレスと電話番号のチェックを行う対象範囲を指定します。
  3. メールアドレスの形式判定には「MailJudg関数を、電話番号の形式判定には「TelJudg」関数を使用します。
  4. メールアドレスや電話番号形式が誤っている場合は「×」を、電話番号形式が正しい場合は電話番号の形式に応じて「固定」または「携帯」を表示します。

サンプルアプリのコード   アプリの作成手順はこちら

以下は、Excel VBAで動作するサンプルアプリのコードです。
適切なシート名や範囲を指定し、必要に応じてコードを調整してご利用ください。

'VBAコード内で未宣言の変数の使用を禁止するOption Explicitステートメント
Option Explicit

'Judgというグローバル変数を文字列型として宣言しています。
'この変数は、電話番号が固定電話か携帯電話かを示すために使用されます。
Public Judg As String

'JudgStartサブルーチンの開始
Sub JudgStart()

    'Shというワークシートオブジェクトを宣言し、ThisWorkbookから"Sheet1"を取得します。
    Dim Sh As Worksheet
    Set Sh = ThisWorkbook.Sheets("Sheet1")

    'ワークシート上の範囲"D5:D14"および"F5:F14"の既存データをクリアします。
    Sh.Range("D5:D14").ClearContents
    Sh.Range("F5:F14").ClearContents

    'Tarという範囲オブジェクトを宣言し、"C5:E14"の範囲を指定します。
    'これがJudgStartサブルーチンの対象範囲です。
    Dim Tar As Range
    Set Tar = Sh.Range("C5:E14")

    'Tar内の各セルに対して繰り返し処理を行います。
    Dim Cell As Range
    For Each Cell In Tar

        'セルが3列目(C列)であるかを判定します。メールアドレスの列であることを示します。
        If Cell.Column = 3 Then

            'MailJudg関数でメールアドレスの正当性を検証し、
            '誤っていれば対応するメールアドレスの右側のセルに"×"を記入します。
            If Not MailJudg(Cell.Value) Then
                Cell.Offset(0, 1).Value = "×" 
            End If

        'セルが5列目(E列)であるかを判定します。電話番号の列であることを示します。
        ElseIf Cell.Column = 5 Then

            'TelJudg関数で電話番号の正当性を検証し、
            '誤っていれば対応する電話番号の右側のセルに"×"を記入し、
            '正しい場合はJudgの値をセルに記入します。
            If Not TelJudg(Cell.Value) Then
                Cell.Offset(0, 1).Value = "×"
            Else
                Cell.Offset(0, 1).Value = Judg
            End If

        End If

    '対象範囲内のすべてのセルに対する処理が終了し、次の行に進みます。
    Next Cell

    'メッセージボックスを表示して、メールアドレスと電話番号の検証が完了したことを
    'ユーザーに知らせます。
    MsgBox "メールアドレスと電話番号の検証が完了しました。", vbInformation

'JudgStartサブルーチンの終了。
End Sub


'MailJudg関数の開始。メールアドレスの正当性を判定する関数です。
Function MailJudg(ByVal MailAd As String) As Boolean

    '正規表現オブジェクトを作成します。これにより、メールアドレスのパターンを検証します。
    Dim Reg As Object
    Set Reg = CreateObject("VBScript.RegExp")

    '正規表現のグローバルフラグをTrueに設定します。
    'Global プロパティが True の場合、正規表現は対象文字列全体を検索し、
    'マッチする全ての箇所を返します。
    Reg.Global = True

    '正規表現パターンを指定し、メールアドレスの形式を検証するためのパターンを設定します。
    Reg.Pattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"

    '指定されたメールアドレスが正しい形式であるかどうかをTestメソッドで判定し、
    'その結果を返します。
    MailJudg = Reg.Test(MailAd)

'MailJudg関数の終了。    
End Function


'TelJudg関数の開始。電話番号の正当性を判定する関数です。
Function TelJudg(ByVal TelNumber As String) As Boolean

    '正規表現オブジェクトを作成します。これにより、電話番号のパターンを検証します。
    Dim Reg As Object
    Set Reg = CreateObject("VBScript.RegExp")

    '正規表現のグローバルフラグをTrueに設定します。
    'Global プロパティが True の場合、正規表現は対象文字列全体を検索し、
    'マッチする全ての箇所を返します。
    Reg.Global = True
        
    '正規表現パターンを指定し、電話番号が固定電話の形式であるかどうかを検証し、
    'その結果をTelJudgに格納します。
    Reg.Pattern = "^0(?!70|80|90)\d{1,4}-\d{1,4}-\d{4}$"
    TelJudg = Reg.Test(TelNumber)

    '固定電話である場合はJudgに"固定"を格納します。
    If TelJudg = True Then
     Judg = "固定"

    '以下、固定電話でなかった場合の処理 
    Else

     '新しい正規表現パターンを指定し、電話番号が携帯電話の形式であるかどうかを検証し、
     'その結果をTelJudgに格納します。
     Reg.Pattern = "^0[789]0-[0-9]{4}-[0-9]{4}$"
     TelJudg = Reg.Test(TelNumber)

     '携帯電話である場合はJudgに"携帯"を格納します。
     '携帯電話の形式でもない場合は、Judgに値が格納されません。
     If TelJudg = True Then
      Judg = "携帯"
     End If

    'TelJudg関数の終了    
    End If
       
End Function