- ベストアンサー
取得したIPアドレスの桁数を揃えたい
Access2000のモジュールで取得したIPアドレスの数値が、頭にゼロが入っている(例:111.011.011.011)ものと入っていない(例:111.11.11.11)ものがあります。 整合を図る時のことを考えて、表示のルールを統一(後者に)したいのですが、中々良い案が出ず困っています。 クエリや関数、VBAなど色々試したのですが(桁数が全て同じであれば、MID関数・Format関数でできそうですが、ばらばらでそれができないのが難しくなっている原因です) 桁数を揃える良い案はないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (2)
- proust
- ベストアンサー率57% (62/108)
あっ・・・ 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
お礼
AccessクエリでSplitがなぜか使えず困っていたのですが、頂いたプログラムで勉強になりました。Splitに加えUBoundやJoin関数は今後も色々と使えそうです。ありがとうございました。
- mssine
- ベストアンサー率24% (38/156)
頭に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
お礼
ご回答ありがとうございます。 今回のIPアドレスは、他のAPIから取得したデータでテキスト型に変換されてテーブルに入れていますので、8進数ではないようです。 頭に0の付いた数値がネットワークの世界で8進数と見なされることは勉強になりました。頂いたAPIも参考になりました。
お礼
早速の回答ありがとうございます。頂いたプログラムで必要としていたものを十分求めることができました。 今回のIPアドレスは、他のAPIから取得したデータでテキスト型に変換されていますので、8進数ではないようです。