web-dev-qa-db-ja.com

ExcelでIPアドレスを含むセルを正しく並替えるにはどうすればよいですか。

私は現在、多数のIPアドレス(数千のアドレス)を扱っています。

ただし、IPアドレスを含む列を並べ替えると、直感的でわかりやすい方法で並べ替えられません。

たとえば、次のようにIPアドレスを入力したとします。

enter image description here

そして昇順にソートすると、次のようになります。

enter image description here

たとえば、17.255.253.65というIPアドレスが昇順でソートされたときに after 1.128.96.254および before 103.236.162.56と表示されるようにセルをフォーマットする方法はありますか。 ?

そうでなければ、私がこの究極の目的を達成するための別の方法はありますか?

34
Monomeeth

ご存知かもしれませんが、あなたのIPアドレスは数字ではなくテキストとして扱われます。これらはテキストとしてソートされています。つまり、 "162"で始まるアドレスは "20"で始まるアドレスの前になります。 (文字 "1"が文字 "2"の前に来るためです。

あなたはこの答えで提供された公式を使うことができます: https://stackoverflow.com/a/31615838/4424957 はIPアドレスをその部分に分割します。

IPアドレスが列Aにある場合は、以下に示すように列B-Eを追加します。

enter image description here

式を入力してください

=VALUE(TRIM(MID(SUBSTITUTE($A2,".",REPT(" ",999)),(B$1)*999-998,999)))

セルB2で、各IPアドレスの4つの部分を取得するためにすべての行の列B-Eにそれをコピーします。次に示すように、全範囲を列BからEまで(この順序で)並べ替えます。

enter image description here

あなたがヘルパーコラム(B-E)を見たくないなら、あなたはそれらを隠すことができます。

42
Blackwood

最も簡単な3つのステップ解決策私があなたに提案できるのは、、、、

  1. IPアドレス列を選択し、列にテキストを適用コマンドをクリックします。

  2. 隣の列にこの式を書く

    = CONCATENATE(B3、 "。"、C3、 "。"、D3、 "。"、E3)

  3. 最後に昇順で並べ替えます。

スクリーンショットを確認してください。

enter image description here

注意:

は元のIPアドレスです(列A)。

テキストを列に適用した後に緑(列BからE)。

が適用された後の連結&ソート(列F).

もともとIPアドレスはテキストデータであり、Excelでは数値に変換するためのセル形式は使用できません。

これがお役に立てば幸いです。

10
Rajesh S

これは、同じ問題を解決するために少し前に書いたVBA関数です。正しくソートされるIPv4アドレスのパディングバージョンを生成します。

Function SortAddress(Address As String)                     '   format address as XXX.XXX.XXX.XXX to permit sorting

Dim FirstByte As Integer, LastByte As Integer, I As Integer

SortAddress = ""
FirstByte = 1

For I = 0 To 2                                          '   process the first three bytes

    LastByte = InStr(FirstByte, Address, ".")           '   find the dot
                                                        '   append the byte as 3 digits followed by dot
    SortAddress = SortAddress & Format(Mid(Address, FirstByte, LastByte - FirstByte), "000\.")

    FirstByte = LastByte + 1                            '   shift the start pointer

Next I

SortAddress = SortAddress & Format(Mid(Address, FirstByte), "000") ' process the last byte

End Function

簡単な例:

結果

Result

Formulas

[並べ替え]列で並べ替えて非表示にすることができます。

9
grahamj42

これはあなたのテーブルの1列だけを取り、基数10の番号付けにIPv4アドレスを変換する答えです。

データを "M"列に入れているので、これはセルM2から始まります(M1がラベルです)。コードとしてそれをカプセル化することは1つのひどい混乱を与えるので、私はblockquoteを使いました:

= INT(LEFT(M2、FIND( "。"、M2) - 1))* 256 ^ 3 + INT(MID(M2、FIND( "。"、M2)+ 1、FIND( "。"、M2、FIND) ( "。"、M2)+ 1) - FIND( "。"、M2)-1))* 256 ^ 2 + INT(MID(M2、FIND( "。"、M2、FIND( "。"、M2)) + 1)+ 1、FIND( "。"、M2、FIND( "。"、M2、FIND( "。"、M2)+ 1)+ 1) - FIND( "。"、M2、FIND( "。" 、M2)+ 1) - 1))* 256 + INT(RIGHT(M2、LEN(M2) - FIND( "。"、M2、FIND( "。"、M2、FIND( "。"、M2)+ 1) )+ 1)))

最も読みやすい式ではありませんが、コピーしてセルに貼り付けることができます(N2または最初のIPアドレスと同じ行にあるものが望ましい)。式の中の誤り訂正が人間の構文解析にとってさらに悪いものにするので、それはIPアドレスの適切なフォーマットを仮定します。

6
RudyB

これは、オクテットを適切なソートを可能にする3桁のフィールドに変換する類似のライナーです。

10.1.0.1510001000015になります。

=LEFT(B85, FIND(".", B85) - 1) * 1000000000
+ MID(B85, FIND("x", SUBSTITUTE(B85, ".", "x", 1)) + 1, FIND("x", SUBSTITUTE(B85, ".", "x", 2)) - FIND(".", B85) - 1) * 1000000
+ MID(B85, FIND("x", SUBSTITUTE(B85, ".", "x", 2)) + 1, FIND("x", SUBSTITUTE(B85, ".", "x", 3)) - FIND("x", SUBSTITUTE(B85, ".", "x", 2)) - 1) * 1000
+ RIGHT(B85, LEN(B85) - FIND("x", SUBSTITUTE(B85, ".", "x", 3)))
3
user856853

数式やVBAを使用したくない場合は、Power Queryを使用してください。 (Excel 2016では、Get&Transform、Excel 2010または2013では、PowerQueryアドインをインストールしてください。).

  1. テーブルをPowerQueryエディタに移動します。
  2. 「列の複製」を右クリックして列を複製します
  3. [ホーム]タブの[列を分割] [区切り文字が1回出現する]を選択します。
  4. 各列をソートします。左から右へ。
  5. 前に分割した列を選択し、右クリックして削除し、閉じてロードします。
3
click here

質問に示されているように、列Mは、M2から始まるIPアドレス(IPv4)です。

みんなの答えから良い点を取得することで、ここに私の解決策があります。必要なヘルパー列は1つだけです。 IPv4アドレスを012.198.043.009形式にフォーマットするを試みてから、ソートします:

  • 12.198.43.9から12 198 43 9へ、次に012.198.043.009

  1. IPv4アドレスのフォーマットに入力して012.198.043.009フォーマットにN2を入力し、下に入力します。

    = TEXT( LEFT(SUBSTITUTE(M2, ".", "      "), 3    ), "000") & "."
    & TEXT(  MID(SUBSTITUTE(M2, ".", "      "), 8, 5 ), "000") & "."
    & TEXT(  MID(SUBSTITUTE(M2, ".", "      "), 15, 7), "000") & "."
    & TEXT(RIGHT(SUBSTITUTE(M2, ".", "      "), 3    ), "000")
    
  2. 列Nで並べ替え


説明

ドットをSUBSTITUTEingする.6個のスペースを使用すると、次のようになり、正しく抽出できるようになります。

                   |123456789|123546789|123456789|
1.1.1.1         ->  1      1      1      1
11.11.11.11     ->  11      11      11      11
111.111.111.111 ->  111      111      111      111
                    =1=    ==2==  ===3===
  • 文字1〜3には、最初の部分のみが含まれます。
  • 文字8-12には、2番目の部分のみが含まれます。
  • 文字15-21には、3番目の部分のみが含まれています。
  • 右端の3文字には、4番目の部分のみが含まれています。

そして、TEXT(..., "000")で各部分を抽出してフォーマットします。

2
wilson

Windowsで最新バージョンのExcelを使用している場合は、次の式を使用してIPアドレスの32ビット10進数値を計算できます。

=SUMPRODUCT(FILTERXML("<I><o v="""&SUBSTITUTE([@ipbase],".","""/><o v=""")&"""/></I>","//o/@v"),{16777216;65536;256;1})

その後、派生10進値を使用してソートできます。 [@ipbase]を有効なIP4アドレスのセル位置に置き換えます。

"FILTERXML"関数はWindowsでしか機能しないので、他のオペレーティングシステムを使用しているのであれば運が悪くなります。

2
Cory

アルファソート用の埋め込み形式のIP(000.000.000.000)を提供するワンライナーもあります。

= TEXT(MID(A1,1,FIND(".",A1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-1-FIND(".",A1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1,FIND(".",A1)+1)+1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)-1-FIND(".",A1,FIND(".",A1)+1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)+1,LEN(A1)),"000")
0
John Homer