コピペで使えるVBA!IPアドレスのサブネットマスクとCIDRを変換するコード

VBA

VBAマクロでサブネットマスクからSIDR表記に変換するコードを紹介します。

コードをコピーすればすぐに使えます。

コピペ前提なので短さを優先してコードを書きました。

サンプルでは1行だけですが複数行でも対応しています。

変換

SM→CIDR

セルB1を選択してマクロを実行

A B C D E
1 192.168.10.1 255.255.255.0

実行後

A B C D E
1 192.168.10.1 24

Sub SMからCIDR変換()
    選択範囲 = Range(Cells(Selection(1).Row, Selection(1).Column), Cells(Selection(Selection.Count).Row + 1, Selection(Selection.Count).Column))
    Selection.ClearContents
    For R = 1 To UBound(選択範囲, 1) - 1
        二進数SM = ""
        For Each 十進数 In Split(選択範囲(R, 1), ".")
            二進数 = ""
            余り = ""
            Do Until 十進数 < 2
                余り = 十進数 Mod 2
                十進数 = Int(十進数 / 2)
                二進数 = 余り & 二進数
            Loop
            二進数 = Format(十進数 & 二進数, "00000000")
            二進数SM = 二進数SM & 二進数
        Next
        Cells(Selection(1).Row + R - 1, Selection(1).Column) = InStr(二進数SM & "0", "0") - 1
    Next
End Sub

CIDR→SM

セルB1を選択してマクロを実行

A B C D E
1 192.168.10.1 24

実行後

A B C D E
1 192.168.10.1 255.255.255.0

Sub CIDRからSM変換()
    選択範囲 = Range(Cells(Selection(1).Row, Selection(1).Column), Cells(Selection(Selection.Count).Row + 1, Selection(Selection.Count).Column))
    Selection.ClearContents
    For R = 1 To UBound(選択範囲, 1) - 1
        二進数 = ""
        For i = 1 To 32
            If i <= 選択範囲(R, 1) Then 二進数 = 二進数 & "1"
            If i > 選択範囲(R, 1) Then 二進数 = 二進数 & "0"
        Next
        For i = 32 To 0 Step -1
            If i Mod 8 = 0 Then
                If i = 32 Then 十進数SM = ""
                If i < 32 Then 十進数SM = "." & 十進数 & 十進数SM
                If i = 0 Then Exit For
                十進数 = 0
                累乗 = 1
            Else
                累乗 = 累乗 * 2
            End If
            If Mid(二進数, i, 1) = 1 Then 十進数 = 十進数 + 累乗
        Next
        Cells(Selection(1).Row + R - 1, Selection(1).Column) = Mid(十進数SM, 2)
    Next
End Sub

右のセルへ入力

SM→CIDR

セルB1を選択してマクロを実行

A B C D E
1 192.168.10.1 255.255.255.0

実行後

A B C D E
1 192.168.10.1 255.255.255.0 24

Sub SMからCIDR変換右のセルへ入力()
    選択範囲 = Range(Cells(Selection(1).Row, Selection(1).Column), Cells(Selection(Selection.Count).Row + 1, Selection(Selection.Count).Column))
    For R = 1 To UBound(選択範囲, 1) - 1
        二進数SM = ""
        For Each 十進数 In Split(選択範囲(R, 1), ".")
            二進数 = ""
            余り = ""
            Do Until 十進数 < 2
                余り = 十進数 Mod 2
                十進数 = Int(十進数 / 2)
                二進数 = 余り & 二進数
            Loop
            二進数 = Format(十進数 & 二進数, "00000000")
            二進数SM = 二進数SM & 二進数
        Next
        Cells(Selection(1).Row + R - 1, Selection(1).Column + 1) = InStr(二進数SM & "0", "0") - 1
    Next
End Sub

CIDR→SM

セルB1を選択してマクロを実行

A B C D E
1 192.168.10.1 24

実行後

A B C D E
1 192.168.10.1 24 255.255.255.0

Sub CIDRからSM変換右のセルへ入力()
    選択範囲 = Range(Cells(Selection(1).Row, Selection(1).Column), Cells(Selection(Selection.Count).Row + 1, Selection(Selection.Count).Column))
    For R = 1 To UBound(選択範囲, 1) - 1
        二進数 = ""
        For i = 1 To 32
            If i <= 選択範囲(R, 1) Then 二進数 = 二進数 & "1"
            If i > 選択範囲(R, 1) Then 二進数 = 二進数 & "0"
        Next
        For i = 32 To 0 Step -1
            If i Mod 8 = 0 Then
                If i = 32 Then 十進数SM = ""
                If i < 32 Then 十進数SM = "." & 十進数 & 十進数SM
                If i = 0 Then Exit For
                十進数 = 0
                累乗 = 1
            Else
                累乗 = 累乗 * 2
            End If
            If Mid(二進数, i, 1) = 1 Then 十進数 = 十進数 + 累乗
        Next
        Cells(Selection(1).Row + R - 1, Selection(1).Column + 1) = Mid(十進数SM, 2)
    Next
End Sub

コメント

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