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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

4回答

1453閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2019/01/22 07:16

前提・実現したいこと

ある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等で完結しそうですが、
何か良いアイデアが有れば仰って頂けると幸いです。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

VBA

1Sub testip1() 2 3For r = 1 To 7 4 5a = Cells(r, 1).Value '値取得 6b = Split(a, "/") 'b(1):/以降 7c = Split(b(0), ".") 8 9 10k = ((c(0) * 256 + c(1)) * 256 + c(2)) * 256 + c(3) 11 12e = 2 ^ (32 - b(1)) 13 14j = k + e - 1 '上限 15 16Cells(r, 5).Value = k 17Cells(r, 6).Value = j 18 19Next 20 21End Sub

VBA

1Sub testip2() 2 3For m = 1 To 7 4p = Cells(m, 8).Value '入力値取得 5 6q = Split(p, ".") 7 8n = ((q(0) * 256 + q(1)) * 256 + q(2)) * 256 + q(3) '実際の値 9 10Cells(m, 10).Value = n 11Next 12 13For u = 1 To 7 14 15v = Cells(u, 10).Value 16 For t = 1 To 7 17 18 x2 = Cells(t, 5).Value 19 x3 = Cells(t, 6).Value 20 x4 = Cells(t, 2).Value 21 22 If v >= x2 And v <= x3 Then 23 Cells(u, 11).Value = x4 24 25 End If 26 Next t 27 28Next u 29 30End Sub![イメージ説明](bd95da9e61b58b7da2ddd019d60149da.png)

投稿2019/01/24 03:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 09:30

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2019/01/22 09:37

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

0

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

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

投稿2019/01/22 08:57

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/24 00:59

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

2019/01/24 02:29

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

退会済みユーザー

2019/01/24 03:05

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

0

ベストアンサー

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

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

VBA

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

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

投稿2019/01/22 08:16

編集2019/01/24 03:13
otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/24 01:31

改めて、今回の目的はA,B列のIP部署一覧から H列に一斉入力したIPがK列にどの部署か出力したいというものです。 A列IPアドレス B部署名     E下限10進数  F上限10進数       H入力値→貼り付け J列10進数 K列 該当部署名 113.32.0.0/13 q 1897922560 1898446847 113.52.65.133 113.34.38.128/25 w 1898063488 1898063615 114.153.2.222 113.40.162.0/24 e 1898488320 1898488575 113.34.134.155 113.52.64.0/18 r 1899249664 1899266047 114.122.206.212 113.64.0.0/11 t 1900019712 1902116863 115.122.99.88 114.120.0.0/13 y 1920466944 1920991231 222.122.99.89 114.153.0.0/17 u 1922629632 1922662399 113.40.162.77 ここからがVBA(2つに分けています)コメントなのでベタ書きで失礼します。 Sub testip1() 'EF列を算出するプログラム Dim k As Long Dim j As Long Dim n As Long For r = 1 To 7 a = Cells(r, 1).Value '値取得 b = Split(a, "/") 'b(1):/以降 c = Split(b(0), ".") k = ((c(0) * CLng(256) + c(1)) * CLng(256) + c(2)) * CLng(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() 'J列を出力、EF列と比較し、K列を出力 Dim n As Long For m = 1 To 7 p = Cells(m, 8).Value '入力値取得 q = Split(p, ".") n = ((q(0) * CLng(256) + q(1)) * CLng(256) + q(2)) * CLng(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(t, 11).Value = x4 'If Cells(u, 10) >= Cells(t, 5) And Cells(u, 10) <= Cells(t, 6) Then ' Cells(t, 11).Value = Cells(t, 2).Value End If Next t Next u End Sub このコードの問題点として、 ①254.254.254.254のように大きな数字だとk, nの部分で"オーバーフローが発生(6)"となる ②testip2()の2重For文が正しく出力されない(初心者なので些細なミスなのでしょうが・・・) が挙げられます。 よろしければ、他の回答者様含め、手助け宜しくお願い致します。
otn

2019/01/24 01:44 編集

私の書いた、 If d > 2 ^ 31 Then d = d - 2 ^ 31 とかが、オーバーフローを防ぐ操作ですが、何故削ったのでしょうか? 補足: dへの代入時には、Long範囲外なら自動的に浮動小数点数になるので、OK。(Long型で宣言しては駄目) Long範囲外かどうか調べて、範囲外なら、負の整数にして、範囲内に収める。
otn

2019/01/24 01:41

あ、正しくは if d>= 2^31 だ。
退会済みユーザー

退会済みユーザー

2019/01/24 01:55

すみません。 その辺りを削ったのが悪いと薄々思っていたのですが、 一旦値が扱える範囲を超えたdがなぜ後から-2^31で良いのか、 プログラム内部でどのようになっているか教えて頂けると助かります。
otn

2019/01/24 02:03 編集

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 02:57

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

2019/01/24 03:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問