Comment obtenir des cellules dans Excel contenant des adresses IP pour trier correctement?

34

Je travaille actuellement avec une grande liste d'adresses IP (des milliers).

Cependant, lorsque je trie la colonne contenant les adresses IP, celle-ci n'est pas intuitive ni facile à suivre.

Par exemple, si je saisis les adresses IP comme suit:

entrez la description de l'image ici

Et puis si je trie par ordre croissant, j'obtiens ceci:

entrez la description de l'image ici

Est-il possible pour moi de formater les cellules afin que, par exemple, une adresse IP de 17.255.253.65 apparaisse après le 1.128.96.254 et avant le 103.236.162.56 lorsqu’elle est triée par ordre croissant?

Sinon, y a-t-il un autre moyen pour moi d'atteindre ce but ultime?

Monomeeth
la source
3
Le tri n'est pas affecté par le formatage des cellules.
Blackwood
1
C'est intéressant - j'étais à peu près sûr que le format d'une cellule affecterait le tri dans certains cas et je pensais que c'était peut-être l'un d'entre eux. Merci pour la clarification!
Monomeeth
1
Et Bruce vous aidera si vous avez besoin de gérer des adresses IPv6!
Criggie

Réponses:

42

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 BE comme indiqué ci-dessous.

entrez la description de l'image ici

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 BE 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:

entrez la description de l'image ici

Si vous ne voulez pas voir les colonnes d'assistance (BE), vous pouvez les masquer.

Bois noir
la source
12
Au lieu de diviser en quatre colonnes, il serait peut-être préférable de "concaténer" les octets comme first*256^3+second*256^2+third*256+fourthdans une colonne?
Ruslan
Surtout que les adresses IPv4 ne sont en réalité que des nombres de 32 bits. La manière d'afficher les adresses IP à quatre chiffres en 4 bits est uniquement destinée à la lecture.
Kat
@ Kat je suis d'accord que cela fonctionnerait, et il ne nécessite qu'une colonne d'assistance au lieu de quatre. Mais la formule dans cette colonne étant plutôt longue, j'ai donc choisi d'utiliser quatre colonnes (je les cacherais probablement de toute façon).
Blackwood
10

La solution la plus simple, en 3 étapes, je peux vous proposer,

  1. Sélectionnez la colonne Adresse IP, appliquez la commande Texte à colonne .

  2. Dans la colonne adjacente, écrivez cette formule

    = CONCATENER (B3, ".", C3, ".", D3, ".", E3)

  3. Enfin, triez par ordre croissant.

Vérifiez la capture d'écran.

entrez la description de l'image ici

NB:

Le rouge est l'adresse IP d'origine (dans la colonne A).

Vert après application du texte à la colonne (colonnes B à E).

Le noir est après concaténation et tri appliqués (colonne F).

La raison en est très simple. À l’origine, l’adresse IP est du type texte et Excel n’accepte aucun format de cellule pour le transformer en nombre.

J'espère que cela vous aidera.

Rajesh S
la source
4
C'est terrible. Vous ne voulez jamais mélanger les données de différentes lignes.
MaxW
@ MaxW, je ne comprends pas exactement ce que vous voulez dire !!
Rajesh S
2
Il signifie que vous auriez dû inclure la colonne d'origine A dans le tri afin que les adresses IP soient les mêmes sur chaque ligne.
Bandersnatch
1
Non ,, rien de mal je l'ai fait ,, la demande de l'OP était de trier l'adresse IP en ordre naturel ,, (Nombre) et la colonne A en ROUGE n'est pas triée. La colonne F a l'adresse IP triée en NOIR.
Rajesh S
1
+1 C'est la solution la plus simple sur la page. @RajeshS peut-être changer le mot "ajusté" en "adjacent" dans votre réponse - je pensais que vous vouliez dire l'une des Text To Columncolonnes. @ MaxW, la mise en page est juste pour la démonstration. Si vous voulez que l'IP d'origine soit triée, ignorez simplement l'étape 2. Cette formule massive "VALUE (TRIM (MID (SUBSTITUTE)") "dans la réponse acceptée doit être remplacée par" Text To Columns "et le reste de la réponse est essentiellement identique à celui-ci.
mcalex
9

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

Résultat

Formules

Formules

Vous pouvez trier par la colonne 'Triable' et la cacher.

Grahamj42
la source
4
Je veux juste noter que l’adresse IP triable s’analysera comme une adresse différente de l’adresse originale (car un idiot a choisi de les interpréter comme des octales). Donc, utilisez-les uniquement pour le tri et ne les traitez pas comme des adresses IP appropriées.
CodesInChaos
Si vous voulez sortir vba, pourquoi ne pas le faire trier par vba
Richard Tingle
1
@RichardTingle 1. C'est (un peu) plus de travail 2. Je pourrais vouloir trier la liste de différentes manières à différents moments
grahamj42
7

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 quelque chose d'autre 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.

RudyB
la source
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).

  1. Introduisez la table dans l'éditeur PowerQuery.
  2. Dupliquez la colonne en cliquant avec le bouton droit de la souris sur "Colonne en double"
  3. "Fractionner la colonne" par délimiteur, dans l'onglet Accueil. Sélectionnez "Chaque occurrence du délimiteur"
  4. Trier chaque colonne Asc. de gauche à droite.
  5. Sélectionnez les colonnes précédemment divisées, faites un clic droit et supprimez-les, fermez-les et chargez-les.
cliquez ici
la source
3

Le est une doublure similaire qui transforme les octets en champs de 3 chiffres qui permet un tri correct.

10.1.0.15devient 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)))
utilisateur856853
la source
3
Pour que le tri fonctionne, vous devez également compléter le premier octet avec des zéros non significatifs.
Blackwood
2

Comme indiqué dans la question, la colonne M représente les adresses IP (IPv4), à partir 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.009format , puis de les trier:

  • 12.198.43.9à 12 198 43 9, puis à012.198.043.009

  1. Formatez les adresses IPv4 au 012.198.043.009format en les saisissant dans N2 et remplissez-les 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")
    
  2. Trier par colonne N


Explication

En SUBSTITUTEinsérant le point . avec 6 espaces , nous obtenons ce qui suit, afin 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===
  • 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 derniers caractères contiennent et ne contiennent que la quatrième partie.

Et puis, extrayez et formatez chaque partie par TEXT(..., "000").

Wilson
la source
2

Si vous utilisez une version récente d'Excel sous Windows, vous pouvez utiliser la formule suivante pour calculer la valeur décimale 32 bits de l'adresse IP.

=SUMPRODUCT(FILTERXML("<I><o v="""&SUBSTITUTE([@ipbase],".","""/><o v=""")&"""/></I>","//o/@v"),{16777216;65536;256;1})

Vous pouvez ensuite trier en utilisant la valeur décimale dérivée. Remplacez [@ipbase]par l'emplacement de la cellule d'une adresse IP4 valide.

La fonction "FILTERXML" ne fonctionne que sous Windows, vous êtes donc malchanceux si vous utilisez un autre système d'exploitation.

Cory
la source
0

J'ai aussi un one-liner qui vous donnera un format IP rembourré (000.000.000.000) pour le tri alpha.

= TEXT(MID(A1,1,FIND(".",A1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-1-FIND(".",A1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1,FIND(".",A1)+1)+1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)-1-FIND(".",A1,FIND(".",A1)+1)),"000") & "." &
  TEXT(MID(A1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)+1,LEN(A1)),"000")
John Homer
la source