Come faccio a ottenere celle in Excel che contengono indirizzi IP per ordinare correttamente?


34

Attualmente sto lavorando con un ampio elenco di indirizzi IP (migliaia di essi).

Tuttavia, quando ordino la colonna contenente gli indirizzi IP, non vengono ordinati in modo intuitivo o facile da seguire.

Ad esempio, se inserisco gli indirizzi IP come segue:

inserisci qui la descrizione dell'immagine

E poi se ordino in ordine crescente ottengo questo:

inserisci qui la descrizione dell'immagine

Esiste un modo per formattare le celle in modo che, ad esempio, un indirizzo IP di 17.255.253.65 appaia dopo 1.128.96.254 e prima di 103.236.162.56 quando ordinato in ordine crescente?

In caso contrario, c'è un altro modo per raggiungere questo obiettivo ultimo?


3
L'ordinamento non è influenzato dalla formattazione delle celle.
Blackwood,

1
È interessante - ero abbastanza sicuro che il formato di una cella avrebbe influenzato l'ordinamento in alcuni casi e ho pensato che forse fosse uno di quelli. Grazie per il chiarimento!
Monomeeth,

1
E Bruce ti aiuta se uno di questi deve gestire indirizzi IPv6!
Criggie il

Risposte:


42

Come avrai capito, i tuoi indirizzi IP sono trattati come testo e non come numeri. Vengono ordinati come testo, il che significa che gli indirizzi che iniziano con "162" verranno prima degli indirizzi che iniziano con "20." (perché il carattere "1" precede il carattere "2".

È possibile utilizzare la formula fornita in questa risposta: https://stackoverflow.com/a/31615838/4424957 per dividere l'indirizzo IP nelle sue parti.

Se i tuoi indirizzi IP sono nelle colonne A, aggiungi le colonne BE come mostrato di seguito.

inserisci qui la descrizione dell'immagine

Inserisci la formula

=VALUE(TRIM(MID(SUBSTITUTE($A2,".",REPT(" ",999)),(B$1)*999-998,999)))

nella cella B2 e copiarlo nelle colonne BE in tutte le righe per ottenere le quattro parti di ciascun indirizzo IP. Ora ordina l'intero intervallo in base alle colonne da B a E (in questo ordine) come mostrato di seguito:

inserisci qui la descrizione dell'immagine

Se non vuoi vedere le colonne helper (BE), puoi nasconderle.


12
Invece di dividere in quattro colonne, forse sarebbe meglio "concatenare" i byte come first*256^3+second*256^2+third*256+fourthin una colonna?
Ruslan,

Soprattutto perché gli indirizzi IPv4 sono in realtà solo numeri a 32 bit. Il modo in quattro numeri a 4 bit di visualizzare gli indirizzi IP è esclusivamente per la leggibilità umana.
Kat

@Kat Sono d'accordo che funzionerebbe e richiede solo una colonna di supporto anziché quattro. Ma la formula in quella colonna sarebbe piuttosto lunga, quindi ho scelto di usare quattro colonne (probabilmente le avrei nascoste in ogni caso).
Blackwood,

10

La soluzione in 3 passaggi più semplice che posso suggerire di essere ,,,

  1. Seleziona la colonna Indirizzo IP, applica il comando Testo a colonna .

  2. Nella colonna adiacente scrivi questa formula

    = CONCATENA (B3, "", C3, "", D3, "", E3)

  3. Infine ordina in ordine crescente.

Controlla la schermata.

inserisci qui la descrizione dell'immagine

NB:

Il rosso è l'indirizzo IP originale (nella colonna A).

Verde dopo l'applicazione del testo alla colonna (dalla colonna B alla E).

Il nero viene applicato dopo il concatenamento e l'ordinamento (colonna F).

Il motivo è molto semplice in origine l'indirizzo IP è Dati di testo ed Excel non accetta alcun formato di cella per trasformarlo in numero.

Spero che questo ti aiuti.


4
Questo è terribile. Non vorrai mai confondere i dati di diverse righe.
Max W

@MaxW ,, Non sto ottenendo esattamente quello che vuoi dire !!
Rajesh S,

2
Vuol dire che avresti dovuto includere la colonna originale A nell'ordinamento, quindi gli indirizzi iP sarebbero gli stessi su ogni riga.
Bandersnatch il

1
No ,,, non ho fatto nulla di sbagliato, la richiesta del PO era di ordinare l'indirizzo IP in ordine naturale ,, (Numero) e la colonna A in ROSSO non è ordinata. La colonna F ha l'indirizzo IP ordinato in NERO.
Rajesh S,

1
+1 Questa è la soluzione più semplice sulla pagina. @RajeshS potrebbe cambiare la parola "aggiustata" in "adiacente" nella tua risposta - pensavo che volessi dire una delle Text To Columncolonne lì. @ Max, il layout è solo per dimostrazione. Se vuoi che l'IP originale sia ordinato, ignora il passaggio 2. Quella formula "VALUE (TRIM (MID (SOSTITUTIVO") nella risposta accettata dovrebbe essere sostituita da "Testo in colonne" e il resto della risposta è essenzialmente lo stesso di questo.
Mcalex,

9

Ecco una funzione VBA che ho scritto qualche tempo fa per risolvere lo stesso problema. Genera una versione imbottita di un indirizzo IPv4 che si ordina correttamente.

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

Esempio semplice:

Risultato

Risultato

formule

formule

Puoi ordinare per colonna 'Ordinabile' e nasconderlo.


4
Voglio solo notare che l'indirizzo IP ordinabile analizzerà come un indirizzo diverso da quello originale (perché alcuni idioti hanno scelto di interpretarli come ottali). Quindi usali solo per l'ordinamento e non trattarli come IP corretti.
CodesInChaos,

Se hai intenzione di estrarre VBA perché non devi solo fare vba fare l'ordinamento
Richard Tingle,

1
@RichardTingle 1. È (un po ') più lavoro 2. Potrei voler ordinare l'elenco in diversi modi in momenti diversi
grahamj42

7

Ecco una risposta che richiederà solo 1 colonna della tabella e converte l'indirizzo IPv4 in base 10.

Dato che stai inserendo i tuoi dati nella colonna "M", questo inizia nella cella M2 (M1 è l'etichetta). Incapsularlo come codice dà un casino terribile, quindi ho usato blockquote:

= INT (SINISTRA (M2, FIND (".", M2) - 1)) * 256 ^ 3 + INT (MID (M2, FIND (".", M2) + 1, FIND (".", M2, FIND (".", M2) + 1) - TROVA (".", M2) -1)) * 256 ^ 2 + INT (MID (M2, FIND (".", M2, FIND (".", M2) + 1) + 1, TROVA (".", M2, TROVA (".", M2, TROVA (".", M2) + 1) + 1) - TROVA (".", M2, TROVA ("." , M2) + 1) - 1)) * 256 + INT (DESTRA (M2, LEN (M2) - TROVA (".", M2, TROVA (".", M2, TROVA (".", M2) + 1 ) + 1)))

Non esattamente la formula più facilmente leggibile, ma puoi semplicemente copiare e incollare nella tua cella (preferibilmente N2 o qualcos'altro nella stessa riga del tuo primo indirizzo IP). Presume una corretta formattazione dell'indirizzo IP poiché la correzione degli errori nella formula renderebbe ancora peggio l'analisi umana.


3

Se non si desidera utilizzare formule o VBA, utilizzare Power Query. (In Excel 2016, Ottieni e trasforma, in Excel 2010 o 2013 installa il componente aggiuntivo PowerQuery da seguire).

  1. Porta la tabella nell'editor di PowerQuery.
  2. Duplica la colonna facendo clic con il tasto destro del mouse su "Duplica colonna"
  3. "Dividi colonna" per delimitatore, nella scheda Home. Seleziona "Ogni occorrenza del delimitatore"
  4. Ordina ogni colonna Asc. da sinistra a destra.
  5. Seleziona le colonne precedentemente divise, fai clic destro e rimuovi, chiudi e carica.

3

È un liner simile che trasforma gli ottetti in campi a 3 cifre che consentono un corretto ordinamento.

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

3
Perché l'ordinamento funzioni, devi anche riempire il primo ottetto con zeri iniziali.
Blackwood,

2

Come mostrato nella domanda, la colonna M sono gli indirizzi IP (IPv4), a partire da M2.

Ottenendo i punti positivi dalla risposta di tutti, ecco la mia soluzione. È necessaria solo 1 colonna helper. Proviamo a formattare gli indirizzi IPv4 in 012.198.043.009formato e quindi a ordinarli:

  • 12.198.43.9a 12 198 43 9, quindi a012.198.043.009

  1. Formatta gli indirizzi IPv4 nel 012.198.043.009formato inserendo N2 e compila verso il basso:

    = 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. Ordina per colonna N


spiegazione

Inserendo SUBSTITUTEil punto . con 6 spazi , otteniamo quanto segue, in modo che possano essere estratti correttamente:

                   |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===
  • Il carattere 1-3 contiene e contiene solo la prima parte.
  • Il carattere 8-12 contiene e contiene solo la seconda parte.
  • Il carattere 15-21 contiene e contiene solo la terza parte.
  • 3 caratteri all'estrema destra contiene e contiene solo la quarta parte.

E quindi, estrarre e formattare ogni parte di TEXT(..., "000").


2

Se si utilizza una versione recente di Excel in Windows, è possibile utilizzare la seguente formula per calcolare il valore decimale a 32 bit dell'indirizzo IP.

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

È quindi possibile ordinare utilizzando il valore decimale derivato. Sostituire [@ipbase]con la posizione della cella di un indirizzo IP4 valido.

La funzione "FILTERXML" funziona solo in Windows, quindi sei sfortunato se stai usando un altro sistema operativo.


0

Ho anche un one-liner che ti darà un formato IP imbottito (000.000.000.000) per l'ordinamento alfa.

= 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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.