web-dev-qa-db-fra.com

Séparez les octets de l'adresse IP à l'aide de formules

Je souhaite séparer les octets d'une adresse IP à l'aide de formules.

J'ai essayé des choses comme remplacer et trouver mais je n'arrive pas à comprendre.

Exemple de ce que je veux réaliser, en commençant uniquement par Cell A1 et Cell B1:

10.17.9.192 | 192.168.0.1
10          | 192
17          | 168
9           | 0
192         | 1
7
Luke Wolfenden

Voici quatre formules dont vous avez besoin

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

La fonction FIND a un troisième argument nommé start . Donc, pour trouver le deuxième point décimal, vous TROUVEZ un point décimal, mais vous commencez là où le premier point décimal est plus un. Ce serait comme ça

=FIND(".",A1,4)

Vous commencez par 4 car votre première virgule est en position 3. Mais vous ne le savez pas, vous devez donc calculer le «4».

=FIND(".",A1,FIND(".",A1)+1)

Maintenant, pour obtenir 4, nous trouvons la première décimale et ajoutons 1. Ce n'est pas si mal de trouver la seconde. Mais pour trouver le troisième, il faut passer à un autre niveau. Et le quatrième est encore un autre niveau. C'est difficile à lire et difficile à maintenir.

Pour faciliter les choses, vous pouvez utiliser des colonnes auxiliaires.

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)

De cette façon, vous faites votre recherche en C et vous vous référez à ces chiffres en A.

Si vous n'aimez pas les colonnes d'assistance, et moi pas, vous pouvez écrire un fichier UDF comme

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

et cela vous donne des formules comme celle-ci

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)

Pas aussi propre que la colonne d'assistance, mais autonome et nettement meilleur que le FIND intégré.

Un autre fichier UDF que vous pourriez écrire duplique le travail de la fonction de division de 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

Cette formule ressemble à

A2        =SplitString($A$1,".",ROW()-1)
A3        =SplitString($A$1,".",ROW()-1)
A4        =SplitString($A$1,".",ROW()-1)
A5        =SplitString($A$1,".",ROW()-1)
8
Dick Kusleika

Voici la solution classique à une formule:

=TRIM(MID(SUBSTITUTE(A$1,".",REPT(" ",999)),(ROW()-1)*999-998,999))

 enter image description here

"." - est le délimiteur.
(ROW()-1) - donne le nième élément en texte délimité.

Plus d'infos sur EXCELFOX

15
zx8754

Comme indiqué dans la question, rangée 1 sont les adresses IP (IPv4), en commençant par A1.

  |      A      |      B
--+-------------+-------------
1 | 10.17.9.192 | 192.168.0.1
2 | 10          | 192
3 | 17          | 168
4 | 9           | 0
5 | 192         | 1

Solution

  • 1ère partie (cellule A2): =VALUE( LEFT(SUBSTITUTE(A1, ".", " "), 3 )) 
  • 2ème partie (cellule A3): =VALUE( MID(SUBSTITUTE(A1, ".", " "), 8, 5 ))
  • 3ème partie (cellule A4): =VALUE( MID(SUBSTITUTE(A1, ".", " "), 15, 7))
  • 4ème partie (cellule A5): =VALUE(RIGHT(SUBSTITUTE(A1, ".", " "), 3 ))

Remplissez les formules à droite.

Remarque: vous pouvez utiliser TRIM(...) au lieu de VALUE(...) si vous souhaitez que le résultat soit au format texte.


Bonus: formule unique pour obtenir une adresse IP formatée

Nous pouvons obtenir un adresse IP formatée 001.002.003.004 par la formule suivante.

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

Explication

En SUBSTITUTEing le point . avec 6 espaces, on obtient:

                   |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===
  • Le caractère 1-3 contient et ne contient que la première partie.
  • Le caractère 8-12 contient et ne contient que la deuxième partie.
  • Le caractère 15-21 contient et ne contient que la troisième partie.
  • Les 3 caractères les plus à droite contiennent et ne contiennent que la quatrième partie.
1
wilson