質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

IPアドレスから場所、セグメントを自動補完したい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 746
退会済みユーザー

退会済みユーザー

前提・実現したいこと

あるIPアドレスを入力すると、IPアドレスの一覧表(Prefix表記)から、該当する表記を出力するテーブルorプログラムを作成したいです。

例)
一覧表
10.222.2.32/28 本社
10.222.22.0/24 支社


入力
10.222.2.34
10.222.255.254
10.222.22.254

出力
本社
(N/A)
支社

全て/24だとExcelのvlookup等で完結しそうですが、
何か良いアイデアが有れば仰って頂けると幸いです。

触ったことが有る程度なのが上記のタグの言語です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

VBAで書くしかないんじゃないでしょうか。

各ネットワークアドレスに対して、IPアドレス32ビット整数値の下限と上限をあらかじめ算出しておき、各IPアドレスを32ビット整数値に変換して、さっきの上限下限の間にあるかどうかを順番に調べる。

a = "10.222.2.32/28"
b = Split(a, "/")
c = Split(b(0), ".")
d = ((c(0) * 256 + c(1)) * 256 + c(2)) * 256 + c(3)
If d > 2 ^ 31 Then d = d - 2 ^ 31
e = 2 ^ (32 - b(1))
f = 2 ^ 32 - e
If f > 2 ^ 31 Then f = f - 2 ^ 31
下限 = d And f
上限 = 下限 + e - 1

追記

回答の方にも追記しておきますが、下限を求めるときにビット演算は不要で、そのまま d が下限になるのでした。ということで、Longの範囲に収めるための if ~ の行2つと、変数 f は不要です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/24 10:59 編集

    Longは数値符号付き32ビット数なので、扱える範囲は、-2^31 ~ 2^31-1 です。
    IPアドレスを単純に数値に直すと、0 ~ 2^32-1 になるので、半分で折り返します。

    理解しやすいように小さい数字で考えます。
    1バイト符号付きの場合、-128 ~ 127 が表現できます。
    0~255の数字を、上記に収めるように、128~255の部分を、-128~-1に移動させます。
    127から128にまたぐあたりで大小関係がおかしくなりますが、IPアドレスの場合、2^31をまたぐサブネットはないので大丈夫です。

    キャンセル

  • 2019/01/24 11:57

    理解できました。ありがとうございます。
    変数宣言をしないとLongの範囲を超えると浮動小数点型になり、if d>= 2^31無しでもカバーできることも確認できました。

    キャンセル

  • 2019/01/24 12:10

    そうか、ネットワークアドレスの方は、ビット演算(And)無しでできましたね。
    むりやりLong範囲に収める必要はないのか。

    キャンセル

0

teratailyh さんが一番分かるツールで作られるのが「良い」と思います.
入力がどこからどういう形式で来て、出力はどういう形式でどこに行くのか等まで投げられては, なにが「良い」のか分からないと思います.

一覧がデータベースにあって入力はCSVファイルで出力は標準出力なコマンドと, JavaのGUIを設計して一覧を一覧テキスト欄に入力しておき入力テキスト欄にIPアドレスを入力すると出力テキスト欄に表示されるのと, 一覧が入ったマスターEXCELファイルが別にあり今開いているEXCELシートを入力として新しいEXCELシートを生成して結果を書き込むのと...等で, どれが「良いアイデア」なのか判断は出来ないのではないでしょうか.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/24 09:59

    どの言語で何ができて何ができないか、初心者なので判別がつきませんでした。
    せめてもう少し具体的に書くように心がけます。

    キャンセル

  • 2019/01/24 11:29

    otnさんへの回答のコメントの最初のほう, 「改めて」から「ここまで」の部分が質問に入っていたら...と思いました.

    キャンセル

  • 2019/01/24 12:05

    仰る通り、初めの質問が分かりづらかったです、すみません。

    キャンセル

0

愚直に自前変換かな

10.222.22.0/24    支社A
10.222.22.128/25  支社B

が、あった場合

10.222.22.129

は、ネットマスクの設定で、支社AかBどちらになるか、変わります。
結局、

10.222.22.129/24
10.222.22.129/25

って、なるので、otnさんの回答にあるvbaを使うか、見栄え気にしないなら、

セルごとに、DEC2BINをして、4オクテット結合したあとに、マスク分をLEFTして、vlookupとか。イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/22 18:37

    がんばればセル分けないでできるけど。そこまで、がんばるもんでもないでしょう。
    それなら、vba使った方が楽だと思います。

    キャンセル

0

改めて、今回の目的はA,B列のIP部署一覧から H列に一斉入力したIPがK列にどの部署か出力したいというものでした。
A列IPアドレス B部署名データ     E下限10進数  F上限10進数       H入力値→貼り付け J列10進数探索 K列 該当部署名

Sub testip1()

For r = 1 To 7

a = Cells(r, 1).Value '値取得
b = Split(a, "/") 'b(1):/以降
c = Split(b(0), ".")


k = ((c(0) * 256 + c(1)) * 256 + c(2)) * 256 + c(3)

e = 2 ^ (32 - b(1))

j = k + e - 1 '上限

Cells(r, 5).Value = k
Cells(r, 6).Value = j

Next

End Sub
Sub testip2()

For m = 1 To 7
p = Cells(m, 8).Value '入力値取得

q = Split(p, ".")

n = ((q(0) * 256 + q(1)) * 256 + q(2)) * 256 + q(3) '実際の値

Cells(m, 10).Value = n
Next

For u = 1 To 7

v = Cells(u, 10).Value
 For t = 1 To 7

 x2 = Cells(t, 5).Value
 x3 = Cells(t, 6).Value
 x4 = Cells(t, 2).Value

    If v >= x2 And v <= x3 Then
     Cells(u, 11).Value = x4

   End If
 Next t

Next u

End Sub![イメージ説明](bd95da9e61b58b7da2ddd019d60149da.png)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る