いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)IPアドレスをソートする

 Excel、IPv4アドレスを昇順/降順で並べ替える方法についてです。具体的には第1オクテットを第1のキー、第2オクテットを第2のキー……として並べ替えます。
 「区切り位置」メニューを使って4列に分割する方法が普通ですが、ここでは関数で並べ替える例を試してみます。

  • SORT関数とTEXTBEFORE/TEXTAFTER関数等を併用してIPアドレスを並べ替えることができます。

手順

 画像ではB列にIPアドレスが並んでいます。
 単純にソートしてもオクテットごとの区切りが考慮されないのでおかしな結果にしかなりませんが、D3セルに関数式を入力して適切なソート結果を得ています。

 D3セル

=LET(n,SEQUENCE(1,4),
x,HSTACK(B3:B14,VALUE(TEXTBEFORE(TEXTAFTER("."&B3:B14&".",".",n),".",1))),
INDEX(SORT(x,n+1),,1)
)

 まず「.」を基準にしてそれぞれの文字列を区切りますが、TEXTSPLIT関数を使おうとすると(第1引数に配列を与えたときに)最初のオクテットしか返ってきません
 そこでTEXTBEFORE/TEXTAFTERで代用しています。「"."&B3:B14&"."」により文字列の前後に「.」を加えておき、さらに「SEQUENCE(1,4)」をnと定義することで、「n(1~4)番目の『.』の後にある文字列のうち最初の『.』より前の部分」つまり各オクテットをそれぞれ取得しています。また、ソートの際には各オクテットを数値とみなす必要があるので、値をすべてVALUE関数で数値に変換しています。
 次にHSTACK関数を使ってこの行列とB3:B14の配列を横並びにした計5列の行列を生成してxと名付けています(この行列の内容については下記参照)。
 あとはSORT関数を使ってxを2~5列目をキーとして昇順でソートし(n={1,2,3,4}なのでn+1={2,3,4,5}になります)、INDEX関数で1列目だけを取得しています。
 なお、オクテットの数は4つで固定ですので、nを定義せず直接「{1,2,3,4}」「{2,3,4,5}」と記した方が簡単かもしれません。
 また、SORT関数の第2引数に配列を与えることで複数のキーを指定しているところがちょっとしたポイントとなっています。これについては次の記事でも紹介しています。

www.officeisyours.com


 また、降順にする場合は次のようにします。

 D3セル

=LET(n,SEQUENCE(1,4),
x,HSTACK(B3:B14,VALUE(TEXTBEFORE(TEXTAFTER("."&B3:B14&".",".",n),".",1))),
INDEX(SORT(x,n+1,{-1,-1,-1,-1}),,1)
)

 SORT関数の第3引数(昇順/降順)として「{-1,-1,-1,-1}」を与えています。
 これは第2引数で指定した4つの列すべてについて降順(-1)でソートするという意味です。


 なお、上記式中のxだけを表示すると次のようになります。

 D3セル

=LET(n,SEQUENCE(1,4),
x,HSTACK(B3:B14,VALUE(TEXTBEFORE(TEXTAFTER("."&B3:B14&".",".",n),".",1))),
x
)

 最初と2番目の例では(式の3行目で)2~5列目を基準にしてソートし、1列目だけを表示させています。
 備考ですが、2~5列目の内容と「{2^32;2^24;2^8;1}」の行列積をとればIPアドレスを0~32^4-1の値に換算でき、SORTBY関数でソートできINDEX関数もいらなくなります。ただし式の長さも特に変わらないので、この記事ではB13:B14とくっつけて処理しています。