Отдельные октеты IP-адреса с использованием формул

Я хочу отделить октеты IP-адреса с помощью формул.

Я пробовал некоторые вещи, такие как substitute & find, но не могу понять это.

пример того, что я хочу достичь, только начиная с ячейки A1 и сотовый B1:

10.17.9.192 | 192.168.0.1
10          | 192
17          | 168
9           | 0
192         | 1

3 ответов


вот четыре формулы, которые вам нужны

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 имеет третий аргумент с именем старт. Итак, чтобы найти вторую десятичную точку, вы находите десятичную точку, но начинаете с первой десятичной точки плюс один. Было бы вот так!--9-->

=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)

не так чисто, как вспомогательная колонка, но автономно и определенно лучше, чем встроенная находка.

другой 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))

enter image description here

"." - это разделитель.
(ROW()-1) - дает N-й элемент в тексте с разделителями.

более подробная информация EXCELFOX


как показано в вопрос, строка 1 являются IP-адресами (IPv4), начиная с A1.

решение

  • войдите в A2:=VALUE( LEFT(SUBSTITUTE(A1, ".", " "), 3 )), который является 1-й частью
  • войдите в A3:=VALUE( MID(SUBSTITUTE(A1, ".", " "), 8, 5 )) - 2-е части
  • войдите в A4:=VALUE( MID(SUBSTITUTE(A1, ".", " "), 15, 7)), который является 3-й частью
  • войдите в A5:=VALUE(RIGHT(SUBSTITUTE(A1, ".", " "), 3 )), который является 4-й частью

заполните формулы право.

Примечание: Вы можете использовать TRIM вместо VALUE если вы хотите результат в текстовом формате.


объяснение

By SUBSTITUTEing точка . С 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-адрес 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")