Excel VBA IPアドレス/CIDR形式のサブネットマスク文字列を、IPアドレス△IPアドレス形式のサブネットマスクに変換する(Part1)

Excel VBA IPアドレス/CIDR形式のサブネットマスク文字列を、IPアドレス△IPアドレス形式のサブネットマスクに変換するマクロです。

(例)”192.168.1.1/24″→”192.168.1.1 255.255.255.0″

Part1では、CIDR形式のサブネットマスク部分をIPアドレス形式のサブネットマスクに変換するマクロを紹介します。

(例)24→”255.255.255.0″

サブネットマスクの表記

サブネットマスクは以下の表のように表記されます。

CIDR表記 10進数表記
/1 128.0.0.0
/2 192.0.0.0
/3 224.0.0.0
/4 240.0.0.0
/5 248.0.0.0
/6 252.0.0.0
/7 254.0.0.0
/8 255.0.0.0
/9 255.128.0.0
/10 255.192.0.0
/11 255.224.0.0
/12 255.240.0.0
/13 255.248.0.0
/14 255.252.0.0
/15 255.254.0.0
/16 255.255.0.0
/17 255.255.128.0
/18 255.255.192.0
/19 255.255.224.0
/20 255.255.240.0
/21 255.255.248.0
/22 255.255.252.0
/23 255.255.254.0
/24 255.255.255.0
/25 255.255.255.128
/26 255.255.255.192
/27 255.255.255.224
/28 255.255.255.240
/29 255.255.255.248
/30 255.255.255.252
/31 255.255.255.254
/32 255.255.255.255

表を見ると、以下の2つの規則があるのが分かります。

(1)/1~/8までは、10進数表記のドット(.)で区切られた、第1部分のみ0以外の値が設定されています。

第2部分は、/9~/16まで。第3部分は/17~/24、第4部分は/18~/32となっています。

(2)各部分は128(2の7乗)→19212864)→22419232)→24022416)→248(2408)となっています。

これは、最初が128で、次はその半分の64を足し、その次はさらに半分の32を、その次はさらに半分の16、最後はさらに半分の8を足しています。

この規則をプログラムで書いていきます。

プログラム例

Function ConvertSubnetMask(ByVal lngCidrMask As Long) As String

    Dim lngMask1 As Long  ’IPアドレス形式のサブネットマスクの第1部分
    Dim lngMask2 As Long  ’IPアドレス形式のサブネットマスクの第2部分
    Dim lngMask3 As Long  ’IPアドレス形式のサブネットマスクの第3部分
    Dim lngMask4 As Long  ’IPアドレス形式のサブネットマスクの第4部分
    Dim i As Long

 

    ‘第1部分の計算
    If lngCidrMask < 1 Then
        lngMask1 = 0
    ElseIf lngCidrMask > 8 Then
        lngMask1 = 255
    Else
        lngMask1 = 0
        For i = 7 To 8 – lngCidrMask Step -1
            lngMask1 = lngMask1 + 2 ^ i
        Next i
    End If

 

    ‘第2部分の計算
    If lngCidrMask < 9 Then
        lngMask2 = 0
    ElseIf lngCidrMask > 16 Then
        lngMask2 = 255
    Else
        lngMask2 = 0
        For i = 7 To 16 – lngCidrMask Step -1
            lngMask2 = lngMask2 + 2 ^ i
        Next i
    End If

 

    ‘第3部分の計算
    If lngCidrMask < 17 Then
        lngMask3 = 0
    ElseIf lngCidrMask > 24 Then
        lngMask3 = 255
    Else
        lngMask3 = 0
        For i = 7 To 24 – lngCidrMask Step -1
            lngMask3 = lngMask3 + 2 ^ i
        Next i
    End If

 

‘第4部分の計算
    If lngCidrMask < 25 Then
        lngMask4 = 0
    ElseIf lngCidrMask > 32 Then
        lngMask4 = 255
    Else
        lngMask4 = 0
        For i = 7 To 32 – lngCidrMask Step -1
            lngMask4 = lngMask4 + 2 ^ i
        Next i
    End If

 

‘戻り値を設定する
ConvertSubnetMask = CStr(lngMask1) & “.” & CStr(lngMask2) & “.” & CStr(lngMask3) & “.” & CStr(lngMask4)

End Function

第1部分~第4部分はほぼ同じ処理をしています。

各部分に以下の処理があります。(Toのあとの数字が第1部分~第4部分ではそれぞれ異なります)

lngMask1 = 0
For i = 7 To 8 – lngCidrMask Step -1
    lngMask1 = lngMask1 + 2 ^ i
Next i

これは足していく数が、半分になる、つまり2^ iのiが1つ減る、ということになります。

最後に、第1部分~第4部分それぞれ求めた値をドット(.)で結合し、戻り値(ConvertSubnetMask)に設定しています。

ConvertSubnetMask = CStr(lngMask1) & “.” & CStr(lngMask2) & “.” & CStr(lngMask3) & “.” & CStr(lngMask4)

まとめ

CIDR形式のサブネットマスク部分をIPアドレス形式のサブネットマスクに変換するマクロは、まず規則性を見つけて、プログラムに書いていきました。

Part2では、今回作成した関数を利用して、IPアドレス/CIDR形式のサブネットマスク文字列を、IPアドレス△IPアドレス形式のサブネットマスクに変換するマクロを作成します。

以上、IPアドレス/CIDR形式のサブネットマスク文字列を、IPアドレス△IPアドレス形式のサブネットマスクに変換する(Part1)でした。