私は現在、多数のIPアドレス(数千のアドレス)を扱っています。
ただし、IPアドレスを含む列を並べ替えると、直感的でわかりやすい方法で並べ替えられません。
たとえば、次のようにIPアドレスを入力したとします。
そして昇順にソートすると、次のようになります。
たとえば、17.255.253.65というIPアドレスが昇順でソートされたときに after 1.128.96.254および before 103.236.162.56と表示されるようにセルをフォーマットする方法はありますか。 ?
そうでなければ、私がこの究極の目的を達成するための別の方法はありますか?
ご存知かもしれませんが、あなたのIPアドレスは数字ではなくテキストとして扱われます。これらはテキストとしてソートされています。つまり、 "162"で始まるアドレスは "20"で始まるアドレスの前になります。 (文字 "1"が文字 "2"の前に来るためです。
あなたはこの答えで提供された公式を使うことができます: https://stackoverflow.com/a/31615838/4424957 はIPアドレスをその部分に分割します。
IPアドレスが列Aにある場合は、以下に示すように列B-Eを追加します。
式を入力してください
=VALUE(TRIM(MID(SUBSTITUTE($A2,".",REPT(" ",999)),(B$1)*999-998,999)))
セルB2で、各IPアドレスの4つの部分を取得するためにすべての行の列B-Eにそれをコピーします。次に示すように、全範囲を列BからEまで(この順序で)並べ替えます。
あなたがヘルパーコラム(B-E)を見たくないなら、あなたはそれらを隠すことができます。
これは、同じ問題を解決するために少し前に書いた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
簡単な例:
結果
式
[並べ替え]列で並べ替えて非表示にすることができます。
これはあなたのテーブルの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アドレスの適切なフォーマットを仮定します。
これは、オクテットを適切なソートを可能にする3桁のフィールドに変換する類似のライナーです。
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)))
数式やVBAを使用したくない場合は、Power Queryを使用してください。 (Excel 2016では、Get&Transform、Excel 2010または2013では、PowerQueryアドインをインストールしてください。).
質問に示されているように、列Mは、M2から始まるIPアドレス(IPv4)です。
みんなの答えから良い点を取得することで、ここに私の解決策があります。必要なヘルパー列は1つだけです。 IPv4アドレスを012.198.043.009
形式にフォーマットするを試みてから、ソートします:
12.198.43.9
から12 198 43 9
へ、次に012.198.043.009
へ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")
列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===
そして、TEXT(..., "000")
で各部分を抽出してフォーマットします。
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でしか機能しないので、他のオペレーティングシステムを使用しているのであれば運が悪くなります。
アルファソート用の埋め込み形式の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")