IPアドレスを含むExcelのセルを取得して適切に並べ替えるにはどうすればよいですか?


34

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

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

たとえば、次のようにIPアドレスを入力した場合:

ここに画像の説明を入力してください

そして、昇順で並べ替えると、これが得られます:

ここに画像の説明を入力してください

たとえば、昇順で並べ替えたときに、IPアドレスが17.255.253.65が1.128.96.254の後、 103.236.162.56の前に表示されるようにセルをフォーマットする方法はありますか?

そうでない場合、この究極の目的を達成する別の方法はありますか?


3
並べ替えはセルの書式設定の影響を受けません。
ブラックウッド

1
それは興味深いです-セルのフォーマットがいくつかのケースでソートに影響することはかなり確信しており、おそらくこれがそれらの1つであると考えました。説明をありがとう!
Monomeeth

1
ブルースは、IPv6アドレスを処理する必要がある場合に役立ちます!
クリギー

回答:


42

気付いたかもしれませんが、IPアドレスは数字ではなくテキストとして扱われます。テキストとしてソートされているため、「162」で始まるアドレスは「20」で始まるアドレスよりも前になります。(文字「1」が文字「2」の前に来るためです。

この回答で提供されている式:https : //stackoverflow.com/a/31615838/4424957を使用して、IPアドレスをその部分に分割できます。

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

ここに画像の説明を入力してください

数式を入力してください

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

セルB2ですべての行の列BEにコピーして、各IPアドレスの4つの部分を取得します。次に、以下のように範囲全体を列BからEで(この順序で)ソートします。

ここに画像の説明を入力してください

ヘルパー列(BE)を表示したくない場合は、非表示にすることができます。


12
4列に分割する代わりにfirst*256^3+second*256^2+third*256+fourth、1列のようにバイトを「連結」する方が良いでしょうか?
ルスラン

特にIPv4アドレスは実際には32ビットの数字にすぎないためです。IPアドレスを表示する4つの4ビット数の方法は、人間が読みやすいようにするためのものです。
カット

@Kat私はそれがうまくいくことに同意し、4つではなく1つのヘルパー列のみを必要とします。しかし、その1つの列の数式はかなり長いため、4つの列を使用することにしました(いずれにせよ、おそらくそれらを非表示にします)。
ブラックウッド

10

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

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

  2. 隣接する列にこの式を書きます

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

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

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

ここに画像の説明を入力してください

注意:

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

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

は、連結と並べ替えを適用した後です(列F)。

理由は、元々IPアドレスが非常に単純なため、Excelは数値に変換するセル形式を受け入れないためです。

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


4
このひどい。異なる行のデータを混同することは決してありません。
MaxW

@MaxW 、、あなたが言いたいことを正確に得ていません!!
ラジェシュS

2
彼は、元の列Aをソートに含める必要があるため、iPアドレスは各行で同じになることを意味します。
バンダースナッチ

1
いいえ、私は何も間違っていませんでした。OPの要求は、IPアドレスを自然な順序でソートすることでした(番号)。REDの列Aはソートされていません。列Fは、黒でソートされたIPアドレスです。
ラジェッシュS

1
+1これは、ページ上で最も簡単なソリューションです。@RajeshSは、あなたの答えで「調整済み」という単語を「隣接する」に変更するかもしれませんText To Column。@MaxW、レイアウトはデモンストレーション用です。元のIPを並べ替える場合は、手順2を無視してください。受け入れられた回答の大規模な「VALUE(TRIM(MID(SUBSTITUTE)」式は「テキストから列」に置き換えられ、残りの回答は基本的にこれと同じです。
mcalex

9

これは、同じ問題を解決するために少し前に書いた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

簡単な例:

結果

結果

フォーミュラ

フォーミュラ

「ソート可能」列でソートして非表示にできます。


4
ソート可能なIPアドレスは元のアドレスとは異なるアドレスとして解析されることに注意してください(一部の馬鹿は8進数として解釈することを選択したため)。したがって、ソートにのみ使用し、適切なIPとしては扱わないでください。
CodesInChaos

vbaを取り出す場合、なぜvbaに並べ替えを行わせないのか
リチャードティングル

1
私は異なった瞬間に、いくつかの異なる方法でリストをソートしたい場合があります@RichardTingle 1.の(少し)、より多くの作業2.
grahamj42

7

テーブルの1列のみを取得し、IPv4アドレスを10進数に変換する回答を次に示します。

列「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アドレスの適切なフォーマットを前提としています。


3

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

  1. テーブルをPowerQueryエディターに取り込みます。
  2. 「列の複製」を右クリックして列を複製します
  3. 「ホーム」タブの区切り文字による「列の分割」。「区切り文字の各オカレンス」を選択します
  4. 各列を昇順に並べ替えます。左から右へ。
  5. 以前に分割した列を選択し、右クリックして削除し、閉じてロードします。

3

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

10.1.0.15になり10001000015ます。

=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
ソートを機能させるには、最初のオクテットに先行ゼロを埋め込むことも必要です。
ブラックウッド

2

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

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

  • 12.198.43.912 198 43 9へ、その後、012.198.043.009

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

    = 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で並べ替え


説明

SUBSTITUTEドットをINGの. 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

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でのみ機能するため、別のオペレーティングシステムを使用している場合は運が悪い。


0

また、アルファソート用の埋め込み形式の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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.