使用公式分隔 IP 地址的八位字节
Separate octets of IP address using formulas
我想使用公式分离 IP 地址的八位字节。
我已经尝试了一些类似替代和查找的方法,但无法解决这个问题。
我想要实现的示例,仅从 Cell A1
和 Cell B1
开始:
10.17.9.192 | 192.168.0.1
10 | 192
17 | 168
9 | 0
192 | 1
这是你需要的四个公式
A2:=LEFT(A1,FIND(".",A1)-1)
A3:=MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-FIND(".",A1)-1)
A4:=MID(A1,FIND(".",A1,FIND(".",A1)+1)+1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)-(FIND(".",A1,FIND(".",A1)+1)+1))
A5:=MID(A1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)+1,LEN(A1)-FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1))
FIND 函数有第三个参数,名为 start。所以要找到第二个小数点,你找到一个小数点,但你从第一个小数点加一开始。会是这样
=FIND(".",A1,4)
你从 4 开始,因为你的第一个小数点在位置 3。但你不知道,所以你必须计算“4”。
=FIND(".",A1,FIND(".",A1)+1)
现在要得到 4,我们找到第一个小数点并加 1。找到第二个小数点也不错。但是要找到第三个,你必须去另一个层次。第四是另一个层次。难以阅读和维护。
为了使它更容易一些,您可以使用辅助列。
A2 =LEFT(A1,C2-1)
C2 =FIND(".",A1)
A3 =MID(A1,C2+1,C3-C2-1)
C3 =FIND(".",A1,C2+1)
A4 =MID(A1,C3+1,C4-C3-1)
C4 =FIND(".",A1,C3+1)
A5 =MID(A1,C4+1,LEN(A1)-C4-1)
这样您就可以在 C 中进行查找并在 A 中引用这些数字。
如果您不喜欢辅助列,而我也不喜欢,您可以编写一个像这样的 UDF
Public Function FINDi(find_text As String, within_text As String, Optional instance As Long) As Long
Dim lReturn As Long
Dim i As Long
Const lFINDFIRST As Long = 0
If instance = lFINDFIRST Then
lReturn = InStr(1, within_text, find_text)
ElseIf instance < lFINDFIRST Then 'negative numbers finds last
lReturn = InStrRev(within_text, find_text)
Else
lReturn = 0
For i = 1 To instance
lReturn = InStr(lReturn + 1, within_text, find_text)
Next i
End If
FINDi = lReturn
End Function
这给了你这样的公式
A2 =LEFT(A1,findi(".",A1)-1)
A3 =MID(A1,findi(".",A1)+1,findi(".",A1,2)-findi(".",A1,1)-1)
A4 =MID(A1,findi(".",A1,2)+1,findi(".",A1,3)-findi(".",A1,2)-1)
A5 =MID(A1,findi(".",A1,3)+1,LEN(A1)-findi(".",A1,3)-1)
不如辅助列干净,但自包含并且绝对优于内置的 FIND。
您可以编写的另一个 UDF 重复了 VBA 的拆分函数的功能。
Public Function SplitString(ByVal sInput As String, ByVal sDelim As String, ByVal lWhich As Long) As String
SplitString = Split(sInput, sDelim)(lWhich - 1)
End Function
那个公式看起来像
A2 =SplitString($A,".",ROW()-1)
A3 =SplitString($A,".",ROW()-1)
A4 =SplitString($A,".",ROW()-1)
A5 =SplitString($A,".",ROW()-1)
这是经典的一种公式解决方案:
=TRIM(MID(SUBSTITUTE(A,".",REPT(" ",999)),(ROW()-1)*999-998,999))
"."
- 是分隔符。
(ROW()-1)
- 给出分隔文本中的第 n 个项目。
更多信息请访问 EXCELFOX
As shown in question, row 1 are the IP addresses (IPv4), starting from A1.
| A | B
--+-------------+-------------
1 | 10.17.9.192 | 192.168.0.1
2 | 10 | 192
3 | 17 | 168
4 | 9 | 0
5 | 192 | 1
解决方案
- 第 1 部分(单元格 A2):
=VALUE( LEFT(SUBSTITUTE(A1, ".", " "), 3 ))
- 第二部分(单元格 A3):
=VALUE( MID(SUBSTITUTE(A1, ".", " "), 8, 5 ))
- 第三部分(单元格 A4):
=VALUE( MID(SUBSTITUTE(A1, ".", " "), 15, 7))
- 第四部分(单元格 A5):
=VALUE(RIGHT(SUBSTITUTE(A1, ".", " "), 3 ))
填写右边的公式。
注意:如果您想要文本格式的结果,您可以使用 TRIM(...)
而不是 VALUE(...)
。
奖励:获取格式化 IP 地址的单一公式
我们可以通过下面的公式得到一个格式的IP地址 001.002.003.004
= TEXT( LEFT(SUBSTITUTE(A1, ".", " "), 3 ), "000") & "."
& TEXT( MID(SUBSTITUTE(A1, ".", " "), 8, 5 ), "000") & "."
& TEXT( MID(SUBSTITUTE(A1, ".", " "), 15, 7), "000") & "."
& TEXT(RIGHT(SUBSTITUTE(A1, ".", " "), 3 ), "000")
说明
通过 SUBSTITUTE
将点 .
与 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 包含且仅包含第二部分。
- 字符15-21包含且仅包含第三部分。
- 最右3个字符包含且只包含第四部分
我想使用公式分离 IP 地址的八位字节。
我已经尝试了一些类似替代和查找的方法,但无法解决这个问题。
我想要实现的示例,仅从 Cell A1
和 Cell B1
开始:
10.17.9.192 | 192.168.0.1
10 | 192
17 | 168
9 | 0
192 | 1
这是你需要的四个公式
A2:=LEFT(A1,FIND(".",A1)-1)
A3:=MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-FIND(".",A1)-1)
A4:=MID(A1,FIND(".",A1,FIND(".",A1)+1)+1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)-(FIND(".",A1,FIND(".",A1)+1)+1))
A5:=MID(A1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)+1,LEN(A1)-FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1))
FIND 函数有第三个参数,名为 start。所以要找到第二个小数点,你找到一个小数点,但你从第一个小数点加一开始。会是这样
=FIND(".",A1,4)
你从 4 开始,因为你的第一个小数点在位置 3。但你不知道,所以你必须计算“4”。
=FIND(".",A1,FIND(".",A1)+1)
现在要得到 4,我们找到第一个小数点并加 1。找到第二个小数点也不错。但是要找到第三个,你必须去另一个层次。第四是另一个层次。难以阅读和维护。
为了使它更容易一些,您可以使用辅助列。
A2 =LEFT(A1,C2-1)
C2 =FIND(".",A1)
A3 =MID(A1,C2+1,C3-C2-1)
C3 =FIND(".",A1,C2+1)
A4 =MID(A1,C3+1,C4-C3-1)
C4 =FIND(".",A1,C3+1)
A5 =MID(A1,C4+1,LEN(A1)-C4-1)
这样您就可以在 C 中进行查找并在 A 中引用这些数字。
如果您不喜欢辅助列,而我也不喜欢,您可以编写一个像这样的 UDF
Public Function FINDi(find_text As String, within_text As String, Optional instance As Long) As Long
Dim lReturn As Long
Dim i As Long
Const lFINDFIRST As Long = 0
If instance = lFINDFIRST Then
lReturn = InStr(1, within_text, find_text)
ElseIf instance < lFINDFIRST Then 'negative numbers finds last
lReturn = InStrRev(within_text, find_text)
Else
lReturn = 0
For i = 1 To instance
lReturn = InStr(lReturn + 1, within_text, find_text)
Next i
End If
FINDi = lReturn
End Function
这给了你这样的公式
A2 =LEFT(A1,findi(".",A1)-1)
A3 =MID(A1,findi(".",A1)+1,findi(".",A1,2)-findi(".",A1,1)-1)
A4 =MID(A1,findi(".",A1,2)+1,findi(".",A1,3)-findi(".",A1,2)-1)
A5 =MID(A1,findi(".",A1,3)+1,LEN(A1)-findi(".",A1,3)-1)
不如辅助列干净,但自包含并且绝对优于内置的 FIND。
您可以编写的另一个 UDF 重复了 VBA 的拆分函数的功能。
Public Function SplitString(ByVal sInput As String, ByVal sDelim As String, ByVal lWhich As Long) As String
SplitString = Split(sInput, sDelim)(lWhich - 1)
End Function
那个公式看起来像
A2 =SplitString($A,".",ROW()-1)
A3 =SplitString($A,".",ROW()-1)
A4 =SplitString($A,".",ROW()-1)
A5 =SplitString($A,".",ROW()-1)
这是经典的一种公式解决方案:
=TRIM(MID(SUBSTITUTE(A,".",REPT(" ",999)),(ROW()-1)*999-998,999))
"."
- 是分隔符。
(ROW()-1)
- 给出分隔文本中的第 n 个项目。
更多信息请访问 EXCELFOX
As shown in question, row 1 are the IP addresses (IPv4), starting from A1.
| A | B
--+-------------+-------------
1 | 10.17.9.192 | 192.168.0.1
2 | 10 | 192
3 | 17 | 168
4 | 9 | 0
5 | 192 | 1
解决方案
- 第 1 部分(单元格 A2):
=VALUE( LEFT(SUBSTITUTE(A1, ".", " "), 3 ))
- 第二部分(单元格 A3):
=VALUE( MID(SUBSTITUTE(A1, ".", " "), 8, 5 ))
- 第三部分(单元格 A4):
=VALUE( MID(SUBSTITUTE(A1, ".", " "), 15, 7))
- 第四部分(单元格 A5):
=VALUE(RIGHT(SUBSTITUTE(A1, ".", " "), 3 ))
填写右边的公式。
注意:如果您想要文本格式的结果,您可以使用 TRIM(...)
而不是 VALUE(...)
。
奖励:获取格式化 IP 地址的单一公式
我们可以通过下面的公式得到一个格式的IP地址 001.002.003.004
= TEXT( LEFT(SUBSTITUTE(A1, ".", " "), 3 ), "000") & "."
& TEXT( MID(SUBSTITUTE(A1, ".", " "), 8, 5 ), "000") & "."
& TEXT( MID(SUBSTITUTE(A1, ".", " "), 15, 7), "000") & "."
& TEXT(RIGHT(SUBSTITUTE(A1, ".", " "), 3 ), "000")
说明
通过 SUBSTITUTE
将点 .
与 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 包含且仅包含第二部分。
- 字符15-21包含且仅包含第三部分。
- 最右3个字符包含且只包含第四部分