如何在Excel中使包含IP地址的单元格正确排序?


34

我目前正在处理大量IP地址(其中有数千个)。

但是,当我对包含IP地址的列进行排序时,它们的排列方式不是直观或易于遵循的。

例如,如果我输入IP地址,如下所示:

在此处输入图片说明

然后,如果我按升序排序,则会得到以下信息:

在此处输入图片说明

我是否有办法格式化单元格,例如,以升序排序时,IP地址17.255.253.65出现 1.128.96.254 之后和103.236.162.56 之前

如果不是,我还有另一种方法可以实现这一最终目标吗?


3
排序不受单元格格式的影响。
Blackwood

1
很有意思-我很确定单元格的格式在某些情况下会影响排序,并认为这可能就是其中之一。感谢您的澄清!
Monomeeth

1
如果其中任何一项需要处理IPv6地址,布鲁斯都会为您提供帮助!
Criggie's

Answers:


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地址的四个部分。现在按如下所示按B到E列对整个范围进行排序:

在此处输入图片说明

如果您不想看到帮助器列(BE),则可以隐藏它们。


12
与其将其拆分为四列,不如将其“连接”成first*256^3+second*256^2+third*256+fourth一列更好?
罗斯兰

特别是由于IPv4地址实际上只是32位数字。显示IP地址的四个4位数字方式仅是为了人类可读。
凯特(Kat)

@Kat我同意这是可行的,它只需要一个助手列而不是四个。但是那一列中的公式会很长,因此我选择使用四列(无论如何我都可能将其隐藏)。
Blackwood '18

10

我可以建议您最简单的3个步骤解决方案,

  1. 选择“ IP地址列”,将“ 文本应用于列”命令。

  2. 在相邻的列中写下此公式

    = CONCATENATE(B3,“。”,C3,“。”,D3,“。”,E3)

  3. 最后按升序排序。

检查屏幕截图。

在此处输入图片说明

注意:

红色是原始IP地址(在A列中)。

将文本应用于列(列B至E)后为绿色

应用连接和排序(列F)后为黑色

原因很简单,最初的IP地址是文本数据,而Excel不接受任何单元格格式将其转换为数字。

希望这对您有所帮助。


4
太可怕了 您永远都不想混合来自不同行的数据。
MaxW

@MaxW,我没有完全明白你想说的!
Rajesh S

2
他的意思是您应该在排序中包括原始列A,因此iP地址在每一行上都是相同的。
Bandersnatch

1
不,我没做错,OP需求是以自然顺序对IP地址进行排序,(数字),而RED中的A列未排序。F列的IP地址已排序为BLACK。
Rajesh S

1
+1这是页面上最简单的解决方案。@RajeshS可能会在您的答案中将“已调整”一词更改为“相邻”-我以为您的意思是Text To Column那里的一列。@MaxW,该布局仅用于演示。如果要对原始IP进行排序,则只需忽略第2步。应将接受的答案中的大量“ VALUE(TRIM(MID(SUBSTITUTE)”公式替换为“文本到列”),其余的答案与此基本相同。
mcalex18年

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地址将解析为与原始IP地址不同的地址(因为某些白痴选择将其解释为八进制)。因此,仅将它们用于排序,不要将其视为正确的IP。
CodesInChaos

如果您要退出vba,为什么不只让vba进行排序
Richard Tingle

1
@RichardTingle 1.这(还有一点点工作)2.我可能想在不同的时刻以几种不同的方式对列表进行排序
grahamj42

7

这是一个答案,该答案仅占表的1列,并将IPv4地址转换为以10为底的编号。

由于您将数据放在“ M”列中,因此此数据从单元格M2(标签为M1)开始。将其封装为代码会带来一团糟,所以我使用了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. 排序每列Asc。从左到右。
  5. 选择以前拆分的列,右键单击并删除,关闭并加载。

3

是一个类似的单行代码,它将八位位组转换为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)))

3
为了使排序有效,您还需要在第一个八位位组前加零。
Blackwood

2

如图所示,列M是从M2开始的IP地址(IPv4)。

通过从每个人的答案中获得好处,这是我的解决方案。只需要1个辅助列。我们尝试将IPv4地址012.198.043.009格式化为format,然后对其进行排序:

  • 12.198.43.912 198 43 9,然后到012.198.043.009

  1. 012.198.043.009通过输入N2IPv4地址格式化为格式,然后向下填充:

    = 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列排序


讲解

通过用6个空格SUBSTITUTE加上点,我们得到以下内容,以便可以正确提取它们:.

                   |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包含并且仅包含第二部分。
  • 字符15-21包含并且仅包含第三部分。
  • 最右边的3个字符包含且仅包含第四部分。

然后,通过提取并格式化每个部分TEXT(..., "000")


2

如果您在Windows中使用的是最新版本的Excel,则可以使用以下公式来计算IP地址的32位十进制值。

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

然后,您可以使用派生的十进制值进行排序。[@ipbase]用有效IP4地址的单元格位置代替。

“ FILTERXML”功能仅在Windows中有效,因此,如果您使用的是其他操作系统,则很不走运。


0

我还有一个内衬,可以为您提供带填充格式的IP(000.000.000.000)用于alpha排序。

= 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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.