【ExcelVBA】文字列がIPアドレス形式か正規表現で判定する方法

スポンサーリンク




趣味のプログラム

ExcelVBAでネットワーク系の処理を自動化するときに必ず発生するのが、IPアドレスの判定です。

  • ExcelVBAで文字列がIPアドレスの形式か確認したい
  • 複数のIPアドレスを同時に判定したい
こんな方に向けて、IPアドレスの判定方法を説明します。
スポンサーリンク

IPアドレスの判定方法

IPアドレスの判定には正規表現を使います。
正規表現とは文字の条件を指定できる表現方法です。

例えばしりとりで「き」がお題で、すべての単語から「き」で始まるものを探したいとき、

で検索すると「きりん」や「ひこうき」などが一致します。

最初の文字が「き」の単語を探したい場合はこうします。

^き

「^」は正規表現で最初の文字を表す文字になります。

下に書いた特殊な表現を行う文字の事をメタ文字と言います。
^ $ ? * + . | { } \ [ ] ( )

 

この正規表現を使うとIPアドレスは、

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

になり、

1~255.1~255.1~255.1~255

を表します。
これだとなぜそうなるのか、分からないので次の項目で説明していきます。

 

正規表現の説明

第1オクテット

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

第一オクテットの数字から開始させたいので、先ほど説明した開始を表す「^」を入れます。
次に赤色で表した

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

は、

1~255

になります。

IPアドレスは1~255ですが1桁から3桁まであって1つにまとめるのが難しいので5つパターンを用意します。
  • [1-9]    ・・1から9
  • [1-9][0-9]  ・・10から99
  • 1[0-9][0-9] ・・100から199
  • 2[0-4][0-9] ・・200から249
  • 25[0-5]   ・・250から255
数字の範囲を指定したいときは、[]の中に範囲を○-○で書きます。

次に5つのパターンを「 | 」で繋ぎます。

[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]

「 | 」はORを表すメタ文字なので5つのパターンのどれかに一致すればいいので、
これで1~255を表すことができます。

ドット

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

ドットはメタ文字でそのままだと任意の1文字として扱われるのでバックスラッシュで打ち消します。

\.

.

です。

IPアドレスで使うドットはたまたまメタ文字のドットと同じだったのでこのような処理が必要になります。
記号を使う時は注意しましょう。

 

第2オクテット〜第3オクテット

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

 

赤色の{}は直前の文字を数字分だけ繰り返すメタ文字です。

直前の文字は()で囲まれている部分なので1~255.です。

なので1~255.を3回繰り返して

1~255.1~255.1~255.

になります。
 

第4オクテット

第4オクテットは最後にドットが付かないので改めて1~255.を指定します。

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

 

1~255.1~255.1~255.1~255

これでIPアドレスの形は完成です。

最後は第4オクテットの数字で終了させたいので最後の文字を表すメタ文字「$」を記載します。

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

 

スポンサーリンク

ExcelVBAで判定するプログラム

IPアドレスの正規表現を使って実際に判定してみます。

Sub IPアドレス判定()
    '判定するIPアドレス4つを配列として「IPリスト」へ格納
    IPリスト = Array("192.168.10.1", "192.168.10.0", "192.168.10.255", "192.168.10.256")
    Set RE = CreateObject("VBScript.RegExp")
    'ここにIPアドレスの正規表現を記載
    RE.Pattern = "^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"
    RE.Global = True
    '配列から1つずつ取り出して変数「IP」へ格納
    For Each IP In IPリスト
        '正規表現に一致した場合は「1」を返す。それ以外は「0」を返す。
        Set 結果 = RE.Execute(IP)
        '結果が「1」かどうか確認する。
        If 結果.Count > 0 Then
            '「1」の場合。「IPアドレス表記です。」を画面に出力
            Debug.Print IP & "はIPアドレス表記です。"
        Else
            '「0」の場合。「IPアドレス表記ではありません。」を画面に出力
            Debug.Print IP & "はIPアドレス表記ではありません。"
        End If
    Next
End Sub

試しに4つのテスト用IPアドレスを正規表現で判定していきます。

  • 192.168.10.1
  • 192.168.10.0
  • 192.168.10.255
  • 192.168.10.256

 

出力された結果

192.168.10.1はIPアドレス表記です。
192.168.10.0はIPアドレス表記ではありません。
192.168.10.255はIPアドレス表記です。
192.168.10.256はIPアドレス表記ではありません。

1つ目と3つ目は正規表現の「1~255.1~255.1~255.1~255」を全て満たしています。

2つ目の192.168.10.0は最後が0なので、正規表現の1~255と一致していません。
最後が0なのはネットワークアドレスとしては存在しますが、今回はIPアドレスの判定なのでIPアドレスとしては認識しません。

4つ目も192.168.10.256は最後が256なので、正規表現の1~255と一致していません。IPアドレスは最大255までなので256はあり得ません。

 

VBAはどうやって覚える?

プログラムのコードが読めないと、参考にしているコードの理解や自分でプログラムを書くときに時間がかかってしまいます。
そんな時は基礎から学ぶと応用もできるようになり自分の作りたいプログラムがスムーズに作れるようになります。

無料でやるならネット上の学習サイトを参考にするといいです。
こちらはVBAの基礎から説明している無料のWEBサイトになります。

>>基礎から学べるWEBサイトを見てみる


過去にネットでの学習でつまずいた方には専門書をオススメします。
本なら基礎から学べる事はもちろん、読者視点で分かりやすい解説になっています。
一人で集中してコツコツ進めたい方は書籍を試してください。



本を読んでもわからない所が多すぎたり、誰かに質問したい場合はオンラインスクールを見てみましょう。
カウンセリングから目的に応じた学習プランと教材を提供してくれるので、プログラミングの敷居がとても低くなります。
誰かに相談できるのは心強いです。

>>オンラインスクールを無料体験で始める


まとめ

今回は正規表現を使い文字列がIPアドレスを判定しました。
判定したいIPアドレスを配列に入れて繰り返す事で、一度に複数のIPアドレスをチェックする事ができます。
この記事で紹介した正規表現ではネットワークアドレスやサブネットマスクは判定できないので、アレンジして使ってみてください。

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