• ベストアンサー

取得したIPアドレスの桁数を揃えたい

 Access2000のモジュールで取得したIPアドレスの数値が、頭にゼロが入っている(例:111.011.011.011)ものと入っていない(例:111.11.11.11)ものがあります。  整合を図る時のことを考えて、表示のルールを統一(後者に)したいのですが、中々良い案が出ず困っています。  クエリや関数、VBAなど色々試したのですが(桁数が全て同じであれば、MID関数・Format関数でできそうですが、ばらばらでそれができないのが難しくなっている原因です)  桁数を揃える良い案はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • proust
  • ベストアンサー率57% (62/108)
回答No.1

Access使ってないのではずしてるかもしれませんが ExcelのVBAだと以下のような感じでSplit()を使って できると思うので、Accessでもできないでしょうか。 Option Explicit Sub Main() Dim ary() As String Dim ip As String MsgBox Normalize("111.11.11.11") MsgBox Normalize("192.168.0.1") End Sub Function Normalize(ip As String) As String Dim octets() As String Dim r As String octets = Split(ip, ".") r = "" Dim i As Integer For i = 0 To UBound(octets) octets(i) = Format(Val(octets(i)), "##0") Next i Normalize = Join(octets, ".") End Function

221EG6
質問者

お礼

早速の回答ありがとうございます。頂いたプログラムで必要としていたものを十分求めることができました。 今回のIPアドレスは、他のAPIから取得したデータでテキスト型に変換されていますので、8進数ではないようです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • proust
  • ベストアンサー率57% (62/108)
回答No.3

あっ・・・ VBの仕様がわかってませんでした。 #2さんの説が正解です。 #1の方法の場合は、"0"が付く場合に&Oをつければ 多分つじつまは合うと思います。 でもAPIにあるならそっちを使ったほうがいいのでしょうね。 Function Normalize(ip As String) As String Dim octets() As String Dim r As String octets = Split(ip, ".") r = "" Dim i As Integer For i = 0 To UBound(octets) If InStr(octets(i), "0") = 1 Then octets(i) = "&O" & octets(i) End If octets(i) = Format(octets(i), "##0") Next i Normalize = Join(octets, ".") End Function

221EG6
質問者

お礼

AccessクエリでSplitがなぜか使えず困っていたのですが、頂いたプログラムで勉強になりました。Splitに加えUBoundやJoin関数は今後も色々と使えそうです。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mssine
  • ベストアンサー率24% (38/156)
回答No.2

頭に0がついてるのは、本当に10進数ですか? 普通(多分??)頭に0が付いた数値はunixやネットワークの世界では8進数と見なしちゃいます。。。 以下のコードを実行してみてください。 Declare Function inet_addr Lib "ws2_32" (ByVal ipaddress As String) As SOCKADDR_IN Type SOCKADDR_IN b1 As Byte b2 As Byte b3 As Byte b4 As Byte End Type Sub xxx() Dim IP As SOCKADDR_IN IP = inet_addr("195.123.011.02") MsgBox IP.b1 & "." & IP.b2 & "." & IP.b3 & "." & IP.b4 End Sub

221EG6
質問者

お礼

ご回答ありがとうございます。 今回のIPアドレスは、他のAPIから取得したデータでテキスト型に変換されてテーブルに入れていますので、8進数ではないようです。 頭に0の付いた数値がネットワークの世界で8進数と見なされることは勉強になりました。頂いたAPIも参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【Access2010】桁数バラバラの日付を統一

    添付画像のような日付データ(ピリオド区切り)があります。 データ(csvファイル)は原則毎日インポートしているので、日付の異なるデータが混在することはほとんどありませんが、まれに多忙・有休などで数日間インポートしなかった場合は混在してしまいます。 その場合は、csvファイルをコピーして桁数ごとにインポート→桁数ごとの更新クエリーを実行し数字8桁にする→更新クエリーで日付型にしています。  <例1:「***.*.*」の場合(日付更新用へ)>   桁数ごとの更新クエリー    → Left$([日付],4) & "0" & Mid$([日付],6,1) & "0" & Right([日付],1)  <例2:「***.**.**」の場合(日付更新用へ)>   桁数ごとの更新クエリー    → Left$([日付],4) & Mid$([日付],6,2) & Right([日付],2)  <共通>   日付型への更新クエリー    → Left$([日付更新用],4) & "/" & Mid$([日付更新用],5,2) & "/" & Right$([日付更新用],2) 実行すべき桁数ごとの更新クエリーを間違えるとインポート作業からやり直さなければならず、非常に面倒です。 桁数が違っても同じクエリーで数字8桁にする方法はありませんか?フィールド・クエリーの追加はいくらでも可能です。

  • Access2007 Mid関数

    数値項目を指定桁数から抜き出しをしたいのですが、今までAccess95で使えていたMid関数が使えなくなってしまいました。 下記のようにしているのですが、どう記述したらよいのでしょうか。 数値項目[YMD]に入っている"20080121"を"2008.01.21"と表示させたい場合、クエリーには =Mid([YMD],3,2) & "." & Mid([YMD],5,2) & "." & Mid([YMD],7,2) と記述しています。

  • 特定のセルの桁数を変更したい

    お世話になります。 VBAのマクロを作成していまして、 行毎に処理を行う過程で 特定の数値の入力されたセルだけ桁数を8桁にしたいのですが そのような関数や方法などありませんでしょうか? 自分の探し方が悪いのでしょうか? どうぞよろしくお願い致します。

  • Excel2010VBAの数値判定、桁数

    Excel2010VBAの数値判定で、例えば「TextBox1」で、西暦の年数が入ります。 「TextBox1」の桁数が4桁をチェックしたい場合(4桁しか入力してはいけない場合)どうすればよいでしょうか?ただし、1桁目の数値は0ではいけません。 例: 0123・・・× 2014・・・○ 回答よろしくお願いします。

  • アクセスのフォームで、桁数を指定したい。

    例)「1」の場合でも、3桁の設定で「001」としたい。 エクセルで言うところの書式設定でユーザー定義で桁数を指定できるように、アクセスのフォームで指定できないでしょうか? その数値を最終的にバーコード化したいのですが、その桁数が違ってしまって、表現したいバーコードが再現できないのです。 ちなみにテーブル、クエリでは書式の設定で(表面だけかも知れませんが)表示できています。 どなたかよろしくご教授のほどよろしくお願いします。

  • エクセル関数で桁数指定し数値を比較したいが

    エクセル関数で桁数指定などあるのでしょうか? 例えば 桁数を指定し一致した数値を取り出したいが・・どうすればよいでしょうか? 桁数は1桁~6桁です。 「例」123456の数字があります。 6桁全て一致したら○ 下5桁一致したら○ 下4桁一致したら○ 下3桁一致したら○ ・・・・と言う具合にエクセルで組みたいのです。よろしくお願いします。

  • 桁数の統一と不要な文字の削除の仕方

    桁数の統一と不要な文字の削除の仕方 数字の後に「-(ハイフン)1」や「-(ハイフン)2」が入力されている数字があり、 「-」以下の数字を表示させず、尚且つ数字の桁数(6桁)を統一する方法を探しています。 <例> 最初の数字       処理後 11111-1    →   011111 11111-2    →   011111 222222     →   222222 222222-1    →   222222 当初「-1」、「-2」を置換で削除した後、ユーザー定義を「000000」にしていました。 ただ、置換処理が手間な為、関数等で簡単に処理できればと考えています。 宜しくお願い致します。

  • IPアドレス第4オクテッドの数値を得る

    以下のようなIPアドレスがあると過程します。 <例> 172.20.0.10 172.20.0.11 以前こちらのサイトでIPアドレスの第2オクテッドの数値を得る方法を ご教授いただきました。 =IF(A1="","",REPLACE(REPLACE(A1,FIND(".",A1,FIND(".",A1)+1),99,""),1,FIND(".",A1),"")+0) この方法を応用して第4オクテッドのみを取得したいと考え、REPLACE関数、FIND関数の使い方を調べたのですが上記関数をどのようにしたらうまくいくのかわかりませんでした。 よろしくお願いします。

  • Excel IPアドレスを比較してセルを入替える

    以下のようなデータ   A列     B列 192.170.1.1 192.171.1.1 192.171.1.2 192.170.1.2 IPアドレスの第2オクテッドを比較し数値の小さいほうをが左にくるように VBAでクリック釦を作成したいのですがどのように記述すればよいでしょうか? 釦をクリックすると   A列     B列 192.170.1.1 192.171.1.1 192.170.1.2 192.171.1.2 のように該当のセルがA列・B列入れかえができる。 IPアドレスを取得する関数は ユーザー関数を使用してsplitn(範囲、第○オクテッド)で 第2オクテッドの数値は取得できます。 よろしくお願いします。

  • IF関数を使って値を算出したい2

    あるアクセルテーブルの列に、1~360の数値が入っています。 ※800件くらいある これをIF関数/Format関数等を使って、クエリーを活用し以下ルールで数字を変換したいのですが、 できますでしょうか。 (2種類を検討したい) ■1つ目 1~30・・・・1 31~60・・・2 61~90・・・3 91~120・・4 121~150・・5 151~180・・6 181~210・・7 211~240・・8 241~270・・9 271~300・・10 301~330・・・11 331以上~・・・12 ■2つ目 1~30・・・・1 31~60・・・2 61~90・・・3 91~120・・4 121~150・・5 151~180・・6 181~210・・7 211~240・・8 241~270・・9 271~300・・10 301~330・・・11 331~360・・・12 361以上~・・・13 ※テーブルからクエリーで算出する際のIF関数・式等には特にこだわらないです(クエリーで算出できればOK)。 お知恵をいただけるとたすかります。