Je travaille actuellement avec une grande liste d'adresses IP (des milliers).
Cependant, lorsque je trie la colonne contenant les adresses IP, leur tri n'est pas intuitif ou facile à suivre.
Par exemple, si je saisis les adresses IP comme suit:
Et puis si je trie par ordre croissant, j'obtiens ceci:
Est-il possible pour moi de formater les cellules de sorte que, par exemple, une adresse IP de 17.255.253.65 apparaisse après 1.128.96.254 et avant 103.236.162.56 lorsqu’il est trié par ordre croissant ?
Sinon, y a-t-il un autre moyen pour moi d'atteindre ce but ultime?
Comme vous l'avez peut-être compris, vos adresses IP sont traitées sous forme de texte et non de chiffres. Ils sont triés sous forme de texte, ce qui signifie que les adresses commençant par "162" viendront avant celles commençant par "20". (parce que le caractère "1" vient avant le caractère "2".
Vous pouvez utiliser la formule fournie dans cette réponse: https://stackoverflow.com/a/31615838/4424957 pour scinder l'adresse IP en ses parties.
Si vos adresses IP figurent dans les colonnes A, ajoutez les colonnes B à E comme indiqué ci-dessous.
Entrez la formule
=VALUE(TRIM(MID(SUBSTITUTE($A2,".",REPT(" ",999)),(B$1)*999-998,999)))
dans la cellule B2 et copiez-le dans les colonnes B-E de toutes les lignes pour obtenir les quatre parties de chaque adresse IP. Maintenant, triez l’ensemble des colonnes B à E (dans cet ordre) comme indiqué ci-dessous:
Si vous ne voulez pas voir les colonnes d'assistance (B-E), vous pouvez les masquer.
_ {Le plus simple, Solution en 3 étapes, je peux vous suggérer, ,} _
Sélectionnez la colonne d'adresse IP, appliquez Texte à la colonne commande.
Dans la colonne adjacente, écrivez cette formule
= CONCATENER (B3, ".", C3, ".", D3, ".", E3)
Enfin, triez par ordre croissant.
Vérifiez la capture d'écran.
NB:
Rouge est l'adresse IP d'origine (dans la colonne A).
Vert après application du texte à la colonne (colonnes B à E).
Noir après concaténation et tri appliqués (colonne F).
_ {La raison en est très simple à l'origine, l'adresse IP est du texte et Excel ne permet à aucun format de cellule de le transformer en nombre.
J'espère que cela vous aidera.
Voici une fonction VBA que j'ai écrite il y a quelque temps pour résoudre le même problème. Il génère une version complétée d'une adresse IPv4 qui trie correctement.
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
Exemple simple:
Résultat
Formules
Vous pouvez trier par la colonne 'Triable' et le cacher.
Voici une réponse qui ne prend qu'une colonne de votre tableau et convertit l'adresse IPv4 en numérotation de base 10.
Puisque vous mettez vos données dans la colonne "M", cela commence dans la cellule M2 (M1 étant l'étiquette). En l'encapsulant sous forme de code, on a un désordre terrible, alors j'ai utilisé blockquote:
= INT (LEFT (M2, FIND (".", M2) - 1)) * 256 ^ 3 + INT (MOYEN (M2, FIND (".", M2) + 1, FIND (".", M2, FIND (".", M2) + 1) - FIND (".", M2) -1)) * 256 ^ 2 + INT (MOYEN (M2, FIND (".", M2), FIND (".", M2) + 1) + 1, FIND (".", M2, FIND (".", M2, FIND (".", M2) + 1) + 1) - FIND (".", M2, FIND ("." , M2) + 1) - 1)) * 256 + INT (DROITE (M2, LEN (M2) - FIND (".", M2, FIND (".", M2, FIND (".", M2) + 1 ) + 1)))
Ce n’est pas exactement la formule la plus lisible, mais vous pouvez simplement copier et coller dans votre cellule (de préférence N2 ou autre chose dans la même ligne que votre première adresse IP). Cela suppose un formatage correct de l'adresse IP, car une correction d'erreur dans la formule aggraverait encore les choses pour l'analyse syntaxique.
Le est une doublure similaire qui transforme les octets en champs de 3 chiffres qui permet un tri correct.
10.1.0.15
devient 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)))
Si vous ne souhaitez pas utiliser de formules ou VBA, utilisez Power Query. (Dans Excel 2016, Get & Transform, dans Excel 2010 ou 2013, installez le complément PowerQuery à suivre).
Comme indiqué dans la question, la colonne M sont les adresses IP (IPv4), en partant de M2.
En obtenant les bons points de la réponse de chacun, voici ma solution. Une seule colonne d'assistance est nécessaire. Nous essayons de formater les adresses IPv4 en 012.198.043.009
format puis les trier:
12.198.43.9
À 12 198 43 9
, PUIS À 012.198.043.009
Formatez les adresses IPv4 au format 012.198.043.009
en entrant dans N2 et remplissez-le vers le bas:
= 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")
Tri par colonne N
En SUBSTITUTE
ing le point .
avec 6 espaces , nous obtenons ce qui suit pour qu’ils puissent être extraits correctement:
|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===
Ensuite, extrayez et formatez chaque partie par TEXT(..., "000")
.