VBA、多くの職場でちょっとした自動化・効率化に用いられているかと思います。
事務からプログラムまで非常に幅広い業種の方に使われているExcel。
インストールできるアプリケーションが制限されている環境でもExcelは使える場合も多く
これひとつで簡単なプログラム環境が構築できるというのは大きな強みですね。
反面、VBAはデフォルトではあまり使える機能がなく
拡張機能は職場の制約で使えない、ということもしばしば。
どうしても車輪の再発明が必要になってしまうことがあります。
今回はよく使っているIPアドレスの変換関数を公開したいと思います
・・・といってもごく簡単な内容ですが
きっとお役に立つこともあるかと思い公開します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
'セグメントを含むIPアドレスの文字列(xxx.xxx.xxx.xxx/yy形式)を渡すと '対応するネットワークアドレスを返却します '(例)192.168.50.131/25を渡すと192.168.50.128/25を返します Function GetNetworkAddress(ip As String) As String Dim segs() As String Dim ipSplit() As String Dim mask As String ipSplit = Split(ip, "/") mask = ipSplit(1) segs = Split(ipSplit(0), ".") If mask < 8 Then segs(0) = segs(0) And (2 ^ 8 - (2 ^ (8 - mask) - 1) - 1) segs(1) = 0 segs(2) = 0 segs(3) = 0 ElseIf mask < 16 Then segs(0) = segs(0) segs(1) = segs(1) And (2 ^ 8 - (2 ^ (16 - mask) - 1) - 1) segs(2) = 0 segs(3) = 0 ElseIf mask < 24 Then segs(0) = segs(0) segs(1) = segs(1) segs(2) = segs(2) And (2 ^ 8 - (2 ^ (24 - mask) - 1) - 1) segs(3) = 0 Else segs(0) = segs(0) segs(1) = segs(1) segs(2) = segs(2) segs(3) = segs(3) And (2 ^ 8 - (2 ^ (32 - mask) - 1) - 1) End If GetNetworkAddress = segs(0) + "." + segs(1) + "." + segs(2) + "." + segs(3) + "/" + mask End Function 'セグメントを含むIPアドレスの文字列(xxx.xxx.xxx.xxx/yy形式)を渡すと '対応するブロードキャストアドレスを返却します '(例)192.168.10.1/20を渡すと192.168.15.255/20を返します Function GetBroadcastAddress(ip As String) As ipAddr Dim segs() As String Dim masks() As String Dim mask As String masks = split(ip, "/") mask = masks(1) segs = split(masks(0), ".") 'VBAには32bitのunsignedがない・・・ If mask < 8 Then segs(0) = segs(0) Or (2 ^ (8 - mask) - 1) segs(1) = 255 segs(2) = 255 segs(3) = 255 ElseIf mask < 16 Then segs(0) = segs(0) segs(1) = segs(1) Or (2 ^ (16 - mask) - 1) segs(2) = 255 segs(3) = 255 ElseIf mask < 24 Then segs(0) = segs(0) segs(1) = segs(1) segs(2) = segs(2) Or (2 ^ (24 - mask) - 1) segs(3) = 255 Else segs(0) = segs(0) segs(1) = segs(1) segs(2) = segs(2) segs(3) = segs(3) Or (2 ^ (32 - mask) - 1) End If GetBroadcastAddress= segs(0) + "." + segs(1) + "." + segs(2) + "." + segs(3) + "/" + mask End Function '※GetBroadcastAddressにバグがあったため修正しました(2020/2/12) |
ビット反転がなかったり
32bitのunsigned型がなかったり
ArrayListをウォッチするとおかしくなるなど(!)
開発言語としては課題も多いVBA(VBE)ですが
GUIを作ったり大がかりなシステムを作ったりしない限りは
有用なツールであるとは思います。
対抗勢力となるGASがでてきたことで、ワンチャン新VBAの登場も・・・あるかもしれません・・・!