Bagaimana cara mendapatkan sel di Excel yang berisi alamat IP untuk disortir dengan benar?


34

Saat ini saya sedang bekerja dengan daftar besar alamat IP (ribuan dari mereka).

Namun, ketika saya mengurutkan kolom yang berisi alamat IP, mereka tidak mengurutkan dengan cara yang intuitif atau mudah diikuti.

Misalnya, jika saya memasukkan Alamat IP sebagai berikut:

masukkan deskripsi gambar di sini

Dan kemudian jika saya mengurutkan dalam urutan naik saya mendapatkan ini:

masukkan deskripsi gambar di sini

Apakah ada cara bagi saya untuk memformat sel sehingga, misalnya, alamat IP 17.255.253.65 muncul setelah 1.128.96.254 dan sebelum 103.236.162.56 ketika diurutkan dalam urutan menaik?

Jika tidak, adakah cara lain bagi saya untuk mencapai tujuan akhir ini?


3
Penyortiran tidak terpengaruh oleh pemformatan sel.
Blackwood

1
Itu menarik - saya cukup yakin bahwa format sel akan memengaruhi penyortiran dalam beberapa kasus dan berpikir mungkin ini salah satunya. Terimakasih atas klarifikasinya!
Monomeeth

1
Dan Bruce membantu Anda jika ada yang perlu menangani alamat IPv6!
Criggie

Jawaban:


42

Seperti yang mungkin telah Anda sadari, alamat IP Anda diperlakukan sebagai teks dan bukan angka. Mereka sedang disortir sebagai teks, yang berarti bahwa alamat yang dimulai dengan "162" akan datang sebelum alamat yang dimulai dengan "20." (karena karakter "1" muncul sebelum karakter "2".

Anda dapat menggunakan rumus yang disediakan dalam jawaban ini: https://stackoverflow.com/a/31615838/4424957 untuk membagi alamat IP menjadi bagian-bagiannya.

Jika alamat IP Anda ada di kolom A, tambahkan kolom BE seperti yang ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini

Masukkan formula

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

di sel B2 dan salin ke kolom BE di semua baris untuk mendapatkan empat bagian dari setiap alamat IP. Sekarang urutkan seluruh rentang dengan kolom B hingga E (dalam urutan itu) seperti yang ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Jika Anda tidak ingin melihat kolom pembantu (BE), Anda dapat menyembunyikannya.


12
Alih-alih membelah menjadi empat kolom, mungkin akan lebih baik untuk "menyatukan" byte seperti first*256^3+second*256^2+third*256+fourthdalam satu kolom?
Ruslan

Terutama karena alamat IPv4 sebenarnya hanya nomor 32 bit. Empat cara nomor 4 bit menampilkan alamat IP semata-mata untuk keterbacaan manusia.
Kat

@ Kat Saya setuju itu akan berhasil, dan hanya membutuhkan satu kolom pembantu alih-alih empat. Tetapi rumus dalam satu kolom itu akan agak panjang, jadi saya memilih untuk menggunakan empat kolom (saya mungkin akan menyembunyikannya).
Blackwood

10

Yang paling mudah, 3 langkah Solusi Saya bisa menyarankan Anda adalah ,,,

  1. Pilih Kolom Alamat IP, terapkan perintah Teks ke Kolom .

  2. Di kolom sebelah, tulis Formula ini

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

  3. Akhirnya Sortir dalam urutan Naik.

Periksa Tangkapan Layar.

masukkan deskripsi gambar di sini

NB:

Merah adalah Alamat IP Asli (dalam Kolom A).

Hijau setelah menerapkan Teks ke Kolom (Kolom B ke E).

Hitam Setelah Diaplikasikan Concatenate & Sorting (Kolom F).

Alasannya sangat sederhana, awalnya alamat IP adalah Data Teks dan Excel tidak menerima Format Sel apa pun untuk mengubahnya menjadi Angka.

Semoga ini bisa membantu Anda.


4
Ini mengerikan. Anda tidak pernah ingin mencampur data dari baris yang berbeda.
MaxW

@ MaxW ,, saya tidak mengerti apa yang ingin Anda katakan !!
Rajesh S

2
Maksudnya Anda harus memasukkan kolom A asli di dalam pengurutan, sehingga alamat IP akan sama di setiap baris.
Bandersnatch

1
Tidak ,,, tidak ada yang salah yang saya lakukan ,, permintaan OP adalah untuk Mengurutkan Alamat IP dalam urutan Alami ,, (Nomor) dan Kolom A dalam RED tidak diurutkan. Kolom F telah Mengurutkan Alamat IP dalam HITAM.
Rajesh S

1
+1 Ini adalah solusi termudah di halaman. @RajeshS mungkin mengubah kata 'disesuaikan' menjadi 'berdekatan' dalam jawaban Anda - saya pikir Anda maksud salah satu Text To Columnkolom di sana. @ MaxW, tata letak hanya untuk demonstrasi. Jika Anda ingin IP asli disortir, abaikan saja langkah 2. Rumus "VALUE (TRIM (MID (SUBSTITUTE") yang masif dalam jawaban yang diterima harus diganti dengan 'Text To Columns' dan sisa jawabannya pada dasarnya sama dengan ini).
mcalex

9

Inilah fungsi VBA yang saya tulis beberapa waktu lalu untuk menyelesaikan masalah yang sama. Ini menghasilkan versi empuk dari alamat IPv4 yang mengurutkan dengan benar.

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

Contoh sederhana:

Hasil

Hasil

Formula

Formula

Anda dapat mengurutkan berdasarkan kolom 'Diurutkan' dan menyembunyikannya.


4
Saya hanya ingin mencatat bahwa alamat IP yang dapat diurutkan akan diurai sebagai alamat yang berbeda dari yang asli (karena beberapa orang idiot memilih untuk menafsirkannya sebagai oktal). Jadi hanya gunakan mereka untuk menyortir dan jangan memperlakukan mereka sebagai IP yang tepat.
CodesInChaos

Jika Anda akan menarik vba mengapa tidak hanya meminta vba melakukan penyortiran
Richard Tingle

1
@RichardTingle 1. Ini (sedikit) lebih banyak pekerjaan 2. Saya mungkin ingin mengurutkan daftar dalam beberapa cara yang berbeda pada saat yang berbeda
grahamj42

7

Berikut ini adalah jawaban yang hanya akan mengambil 1 kolom dari tabel Anda dan mengonversi alamat IPv4 menjadi penomoran 10 basis.

Karena Anda meletakkan data Anda di kolom "M", ini dimulai pada sel M2 (M1 menjadi label). Enkapsulasi sebagai kode memberikan satu kekacauan yang mengerikan, jadi saya telah menggunakan blockquote:

= INT (KIRI (M2, FIND (".", M2) - 1)) * 256 ^ 3 + INT (MID (M2, FIND (".", M2) + 1, FIND (".", M2, FIND (".", M2) + 1) - FIND (".", M2) -1)) * 256 ^ 2 + INT (MID (M2, FIND (".", M2, FIND (".", M2) +1) +1, FIND (".", M2, FIND (".", M2, FIND (".", M2) +1) + 1) - FIND (".", M2, FIND ("." , M2) + 1) - 1)) * 256 + INT (KANAN (M2, LEN (M2) - FIND (".", M2, FIND (".", M2, FIND (".", M2) + 1 ) + 1)))

Bukan formula yang paling mudah dibaca, tetapi Anda bisa menyalin dan menempel ke sel Anda (lebih disukai N2 atau yang lain di baris yang sama dengan alamat IP pertama Anda). Itu menganggap pemformatan yang benar dari alamat IP sebagai koreksi kesalahan dalam formula akan membuatnya lebih buruk untuk penguraian manusia.


3

Jika Anda tidak ingin menggunakan rumus atau VBA, gunakan Power Query. (Di Excel 2016, Get & Transform, di Excel 2010 atau 2013 instal add-in PowerQuery untuk mengikuti).

  1. Bawa tabel ke dalam editor PowerQuery.
  2. Gandakan kolom dengan mengklik kanan "Duplikat Kolom"
  3. "Split Column" oleh pembatas, pada tab Home. Pilih "Setiap kemunculan pembatas"
  4. Sortir setiap kolom, Asc. dari kiri ke kanan.
  5. Pilih kolom yang sebelumnya terpecah, klik kanan dan hapus, tutup dan muat.

3

Ini adalah liner serupa yang mengubah oktet menjadi bidang 3 digit yang memungkinkan penyortiran yang tepat.

10.1.0.15menjadi 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
Agar sortir berfungsi, Anda juga harus mengisi oktet pertama dengan nol di depan.
Blackwood

2

Seperti ditunjukkan dalam pertanyaan, kolom M adalah alamat IP (IPv4), mulai dari M2.

Dengan mendapatkan poin bagus dari jawaban semua orang, inilah solusi saya. Hanya 1 kolom pembantu yang diperlukan. Kami mencoba memformat alamat IPv4 ke dalam 012.198.043.009format dan kemudian mengurutkannya:

  • 12.198.43.9untuk 12 198 43 9, lalu ke012.198.043.009

  1. Format alamat IPv4 ke dalam 012.198.043.009format dengan memasukkan N2 , dan isi ke bawah:

    = 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. Sortir menurut kolom N


Penjelasan

Dengan SUBSTITUTEmemasukkan titik . dengan 6 spasi , kita mendapatkan yang berikut, sehingga mereka dapat diekstraksi dengan benar:

                   |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===
  • Karakter 1-3 berisi dan hanya berisi bagian pertama.
  • Karakter 8-12 berisi dan hanya berisi bagian kedua.
  • Karakter 15-21 berisi dan hanya berisi bagian ketiga.
  • 3 karakter paling kanan berisi dan hanya berisi bagian keempat.

Dan kemudian, ekstrak dan format masing-masing bagian TEXT(..., "000").


2

Jika Anda menggunakan versi Excel terbaru di Windows Anda dapat menggunakan rumus berikut untuk menghitung nilai desimal 32 bit dari alamat IP.

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

Anda kemudian bisa mengurutkan menggunakan nilai desimal yang diturunkan. Ganti [@ipbase]dengan lokasi sel dari alamat IP4 yang valid.

Fungsi "FILTERXML" hanya berfungsi di Windows, jadi Anda kurang beruntung jika menggunakan sistem operasi lain.


0

Saya juga punya satu-liner yang akan memberi Anda format IP empuk (000.000.000.000) untuk penyortiran 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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.