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乗)→192(128+64)→224(192+32)→240(224+16)→248(240+8)となっています。
これは、最初が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)でした。