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
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)
Voici la solution classique à une formule:
=TRIM(MID(SUBSTITUTE(A$1,".",REPT(" ",999)),(ROW()-1)*999-998,999))
"."
- est le délimiteur.(ROW()-1)
- donne le nième élément en texte délimité.
Plus d'infos sur EXCELFOX
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
=VALUE( LEFT(SUBSTITUTE(A1, ".", " "), 3 ))
=VALUE( MID(SUBSTITUTE(A1, ".", " "), 8, 5 ))
=VALUE( MID(SUBSTITUTE(A1, ".", " "), 15, 7))
=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.
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")
En SUBSTITUTE
ing 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===