Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3133 / 13644 ツリー ←次へ | 前へ→

【63993】IPアドレス範囲の計算 miyake 10/1/9(土) 1:05 質問[未読]
【63995】Re:IPアドレス範囲の計算 Yuki 10/1/9(土) 11:07 発言[未読]
【63997】Re:IPアドレス範囲の計算 Yuki 10/1/9(土) 11:27 発言[未読]
【64019】Re:IPアドレス範囲の計算 Yuki 10/1/10(日) 8:16 発言[未読]
【64028】Re:IPアドレス範囲の計算 miyake 10/1/10(日) 19:06 お礼[未読]
【64031】Re:IPアドレス範囲の計算 Yuki 10/1/10(日) 22:07 発言[未読]
【64036】Re:IPアドレス範囲の計算 miyake 10/1/11(月) 23:01 お礼[未読]

【63993】IPアドレス範囲の計算
質問  miyake  - 10/1/9(土) 1:05 -

引用なし
パスワード
   IPアドレスの範囲を求めるプログラムを考えています。
IPアドレスに、一定の範囲の個数を足した場合の、IPアドレスの範囲を求めたいのですが。

例えば、A1に基となるIPアドレス、B1に範囲として加える個数、C1にその結果として範囲の最後のIPアドレスを求めたい場合、どのようなプログラムにしたらいいのでしょうか。

(例)
基となるIPアドレス    個数    結果
61.245.0.0    32768    61.245.127.255
202.12.5.0    256    202.12.5.255

上記のような場合で、結果を求めたいのです。
どなたかご教示願います。

【63995】Re:IPアドレス範囲の計算
発言  Yuki  - 10/1/9(土) 11:07 -

引用なし
パスワード
   ▼miyake さん:
>IPアドレスの範囲を求めるプログラムを考えています。
>IPアドレスに、一定の範囲の個数を足した場合の、IPアドレスの範囲を求めたいのですが。
>
>例えば、A1に基となるIPアドレス、B1に範囲として加える個数、C1にその結果として範囲の最後のIPアドレスを求めたい場合、どのようなプログラムにしたらいいのでしょうか。
>
>(例)
>基となるIPアドレス    個数    結果
>61.245.0.0    32768    61.245.127.255
>202.12.5.0    256    202.12.5.255
>
>上記のような場合で、結果を求めたいのです。

こんな感じでいいと思います。

Sub TEST()
  Dim IP(1, 1) As Variant
  Dim i    As Long
  
  IP(0, 0) = "61.245.0.0"
  IP(0, 1) = 32768
  IP(1, 0) = "2.12.5.0"
  IP(1, 1) = 256
  
  For i = 0 To 1
    Debug.Print IpAddrCaluc(CStr(IP(i, 0)), CLng(IP(i, 1)))
  Next
End Sub

Function IpAddrCaluc(IpAddr As String, num As Long) As String
  Dim v    As Variant
  Dim i    As Long
  Dim j    As Long
  Dim h    As String
  Dim hD   As String
 
  For j = 0 To 1
    h = ""
    v = Split(IpAddr, ".")
    For i = 0 To UBound(v)
      hD = Hex(v(i))
      If Len(hD) = 1 Then hD = "0" & hD
      h = h & hD
    Next
    h = Format(Hex(CLng("&H" & h) + num - 1), "00000000")
    If Len(h) = 7 Then h = "0" & h
    ReDim v(3)
    For i = 0 To 3
      v(i) = CLng(" &H" & Mid(h, i * 2 + 1, 2))
    Next
    h = Join(v, ".")
    IpAddrCaluc = h
  Next
End Function

【63997】Re:IPアドレス範囲の計算
発言  Yuki  - 10/1/9(土) 11:27 -

引用なし
パスワード
   >▼miyake さん
チョット訂正です。要りませんの行を削除して下さい。
>
>Function IpAddrCaluc(IpAddr As String, num As Long) As String
>  Dim v    As Variant
>  Dim i    As Long
>  Dim j    As Long   要りません
>  Dim h    As String
>  Dim hD   As String
> 
>  For j = 0 To 1 要りません

>    h = ""
>    v = Split(IpAddr, ".")
>    For i = 0 To UBound(v)
>      hD = Hex(v(i))
>      If Len(hD) = 1 Then hD = "0" & hD
>      h = h & hD
>    Next
>    h = Format(Hex(CLng("&H" & h) + num - 1), "00000000")
>    If Len(h) = 7 Then h = "0" & h
>    ReDim v(3)
>    For i = 0 To 3
>      v(i) = CLng(" &H" & Mid(h, i * 2 + 1, 2))
>    Next
>    h = Join(v, ".")
>    IpAddrCaluc = h
>  Next    要りません
>End Function

【64019】Re:IPアドレス範囲の計算
発言  Yuki  - 10/1/10(日) 8:16 -

引用なし
パスワード
   ▼miyake さん
訂正です。
0.0.0.0のように最初が0だとエラーになるのを
改善しました。
Function IpAddrCaluc(IpAddr As String, num As Long) As String
  Dim v    As Variant
  Dim i    As Long
  Dim j    As Long
  Dim h    As String
  Dim hD   As String

  v = Split(IpAddr, ".")
  For i = 0 To UBound(v)
    hD = Right("00" & Hex(v(i)), 2)
    h = h & hD
  Next
  h = Right("00000000" & Hex(CLng("&H" & h) + num - 1), 8)
  ReDim v(3)
  For i = 0 To 3
    v(i) = CLng(" &H" & Mid(h, i * 2 + 1, 2))
  Next
  h = Join(v, ".")
  IpAddrCaluc = h
End Function

【64028】Re:IPアドレス範囲の計算
お礼  miyake  - 10/1/10(日) 19:06 -

引用なし
パスワード
   ありがとうございます。
どのように処理したらよいのか悩んでいたのが、このコードで解消できました。
なお、もう一つご教示願いたいのですが、このコードによりIPアドレスの範囲を求めることができ、CC(カントリーコード)の一覧表を作りました。この表を基に、あるIPアドレスのCCを求めるには、どのようにしたらいいのでしょうか。

(例)
一覧表(CCとIPアドレスの範囲が入っています)
CC    IP_start    IP_stop
CN    58.60.0.0    58.63.255.255
TH    58.64.0.0    58.64.127.255
HK    58.64.128.0    58.64.255.255
SG    58.65.0.0    58.65.31.255
JP    58.65.32.0    58.65.63.255

〜IPのCCを調べる表〜
IP    CC
58.61.100.100    
58.65.20.100    
58.65.1.1    
58.64.200.200    
58.64.100.100    

上記、IPアドレスを一覧表の範囲からどのレンジに入るのか検索し、マッチしたら、対応するCCを求めたいのですが。
よろしくお願いいたします。

【64031】Re:IPアドレス範囲の計算
発言  Yuki  - 10/1/10(日) 22:07 -

引用なし
パスワード
   ▼miyake さん:
こんにちは。

>なお、もう一つご教示願いたいのですが、このコードによりIPアドレスの範囲を求めることができ、
>CC(カントリーコード)の一覧表を作りました。
>この表を基に、あるIPアドレスのCCを求めるには、どのようにしたらいいのでしょうか。

WorkSheets(1)のA1から   一覧表(CCとIPアドレスの範囲が入っています)
WorkSheets(2)のA1から   〜IPのCCを調べる表〜

総当りではこんな感じです。
今は範囲内でチェックしていますが、範囲が順番に並んでいますから
最初のIP_startの値だけ調べるだけでいいですね。

Sub IpAddrCheck()
  Dim v    As Variant
  Dim v1   As Variant
  Dim v2   As Variant
  Dim v3   As Variant
  Dim i    As Long
  Dim j    As Long
  Dim x    As Long
  Dim h    As String
  Dim hD   As String

  v1 = Worksheets(1).Range("A1").CurrentRegion.Resize(, 3).Value
  For i = 2 To UBound(v1)
    For j = 2 To 3
      h = ""
      v = Split(v1(i, j), ".")
      For x = 0 To UBound(v)
        hD = Right("00" & Hex(v(x)), 2)
        h = h & hD
      Next
      v1(i, j) = CLng("&H" & h)
    Next
  Next
  v2 = Worksheets(2).Range("A1").CurrentRegion.Resize(, 1).Value
  ReDim v3(1 To UBound(v2) - 1, 1 To 1)
  For i = 2 To UBound(v2)
    h = ""
    v = Split(v2(i, 1), ".")
    For x = 0 To UBound(v)
      hD = Right("00" & Hex(v(x)), 2)
      h = h & hD
    Next
    v2(i, 1) = CLng("&H" & h)
  Next
  For i = 2 To UBound(v2)
    For j = 2 To UBound(v1)
      If v1(j, 2) <= v2(i, 1) And v1(j, 3) >= v2(i, 1) Then
        v3(i - 1, 1) = v1(j, 1)
        Exit For
      End If
    Next
  Next
  With Worksheets(2)
    .Range("B2").Resize(UBound(v3)).Value = v3
  End With
End Sub

【64036】Re:IPアドレス範囲の計算
お礼  miyake  - 10/1/11(月) 23:01 -

引用なし
パスワード
   問題が解決し、やりたかった作業が、素早く効率よくできるようになりました。
ありがとうございました。
また、分からないことがありましたら、よろしくお願いいたします。

3133 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free