プロが教えるわが家の防犯対策術!

普通は桁数をそろえますが、
xxx.xxx.xxx.11
xxx.xxx.xxx.101
をちゃんと昇順にソートしようとすれば何かいい方法ありますか?

A 回答 (5件)

一般論ですが、以下の方法があります。



 ・桁数が3桁に満たないものは頭に0をつけて3桁にしてから比較する
  (比較後、0をとる)
 ・文字列としてではなく、数値として比較する

例えばPerlでしたら、splitを使ってIPアドレスを
区切ってから、各桁を順に比較していけばよいですね。

この回答への補足

早速ありがとうございました。
エクセルでございます…

補足日時:2003/07/31 13:47
    • good
    • 0

どういう環境下で実施したいのか不明ですが、


xxx.xxx.xxx.が同値であると仮定して、
使用しているOSがWindowsNT/XPだと仮定すると。
コマンドプロンプトで、sortコマンドが使えます。

例えば、A.txt というファイルに
xxx.xxx.xxx.101
xxx.xxx.xxx.11
というデータが入ってた場合、
コマンドプロンプトで、

sort /R < A.txt

と入れると、昇順にソートされます。

要件に合わなければご容赦を・・。

この回答への補足

早速ありがとうございました。
エクセルの表という環境でございます…
でも、プロンプトのTIP一つ学習しました。

補足日時:2003/07/31 13:49
    • good
    • 0

エクセルですよね。



数値が3つなら簡単ですが、4つなのでちょいと手間がかかります。
方法は、各数値を3桁(000.000.000.000)形式に整え直すしかないと思います。

関数を使い一度に直す方法もありますが、
「区切り位置」を使い4つの数値に分解する方法を考えてみました。

1.ipアドレス列(A列とします)の右に4列挿入します。
2.ipアドレス列をコピーし、B列に貼り付けます。
3.B列を選び、メニューバー「データ」-「区切り位置」をクリックします。
4.「元データの形式」は上の「カンマや…」を選び「次へ」を押します。
5.「区切り文字」を「その他」にし、右にある資格の中に「.」(ピリオド)を入力します。「完了」を押します。
6.B~E列にピリオドで区切られていた数値が入ります。
7.AとB列の間に列を挿入します。
8.=TEXT(C1,"000")&"."&TEXT(D1,"000")&"."&TEXT(E1,"000")&"."&TEXT(F1,"000") と入力します。
9.コピーし、貼り付け先範囲を選び、貼り付けます。
10.B列で並び替えます。

この回答への補足

エクセルです。
非表示列のワークエリアとしてもうけましょか。
何百台となるとなかなか処理が重たくなりそうなのは
避けたいというのもあったのですが…。
もう少し研究してみます。

補足日時:2003/07/31 13:50
    • good
    • 2

ユーザー定義関数を使用する方法です。



ExcelということですがVerが不明なので、一応97から対応するようにSplit関数を
使っていません。

使用方法は、A1にIPアドレスがあるとして =IpAdd(A1) と入力すると3桁ずつの
IPアドレスが表示されます。 

コードの設定方法:

Alt + F11 を押し、メニューから[挿入]->[標準モジュール]で開いたウインドウに
下記コードを貼り付けます。

Function IpAdd(Ip As String) As String
  Dim StrIp As String
  Dim s As String
  If IsEmpty(Ip) Then
    IpAdd = ""
    Exit Function
  End If
  StrIp = Mid("00" & Ip, InStr(Ip, ".") - 1, 4)
  s = Right(Ip, Len(Ip) - InStr(Ip, "."))
  StrIp = StrIp & Mid("00" & s, InStr(s, ".") - 1, 4)
  s = Right(s, Len(s) - InStr(s, "."))
  StrIp = StrIp & Mid("00" & s, InStr(s, ".") - 1, 4)
  s = Right(s, Len(s) - InStr(s, "."))
  StrIp = StrIp & Right("00" & s, 3)
  IpAdd = StrIp
End Function
    • good
    • 3
この回答へのお礼

ありがとうございました。
ばっちりでございます!

お礼日時:2003/07/31 22:50

#3です。


VB使ったja7awuさんがベターかと思いますが、
関数だけで求める方法です。
(でも、ピリオド位置を求めるセルが3列必要でしたし、やはり式がなが~くなります)

B列~E列まで利用します。
B1:=FIND(".",A1,1)
C1:=FIND(".",A1,B1+1)
D1:=FIND(".",A1,C1+1)
E1=TEXT(MID(A1,1,B1-1),"000")&"."&TEXT(MID(A1,B1+1,C1-B1-1),"000")&"."&TEXT(MID(A1,C1+1,D1-C1-1),"000")&"."&TEXT(MID(A1,D1+1,3),"000")
それぞれ、=以下を貼り付けてください。

以下は#3、#4、この方法で使えますが、
整形ができたら、整形結果が入った列を選び、コピー、形式を選んで貼り付け-値 を行うと、式が消えるので、必要ない列を削除すればすっきりします。
    • good
    • 2
この回答へのお礼

ありがとうございました。
まだ前々述の方も試せてないですが、
マクロ使わない方法も欲しいので検討してみたいと思います。

お礼日時:2003/07/31 22:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!