Sortowanie kolumny Excel według adresu IP


15

Mam dość duży (ponad 200 wierszy) arkusz kalkulacyjny Excel, który wyświetla pozycje w mojej sieci (tj. Drukarki, serwery, stacje robocze, projektory sieciowe itp.), A jedną z pierwszych kolumn jest pole Adres IP, które przyjmuje formę 192.168.x.y. Mój problem, gdy próbuję go sortować, polega na tym, że idzie (jako przykład) z 192.168.0.85 do 192.168.0.9. Chciałbym zobaczyć, że sortowanie opiera się na pierwszych 3 oktetach, a następnie na ostatnim oktecie logicznie (tj. .1, .2, .3itp.) czy to możliwe? Jeśli tak to jak?

Odpowiedzi:


19

Jak wspomina nixda w komentarzach, kolumny pomocnicze to umożliwiają. Masz dwie możliwości późniejszego utrzymania arkusza:

  • Dodaj wszystkie nowe adresy IP w podzielonych kolumnach pomocniczych.
  • Powtórz procedurę Text-to-columns dla nowych dodatków.

Oto procedura:

  1. Wybierz kolumnę IP i kliknij Data & gt; Text-to-Columns text-to-columns

  2. Wybierz opcję Rozdzielone i kliknij Dalej. Sprawdź Other pole wyboru i wprowadź kropkę .. Kliknij Następny. choose . as delimiter

  3. Zachowaj wszystkie kolumny, zachowaj je jako Ogólne, kliknij ikonę zakresu, aby edytować Destination Sekcja. change dest 1

  4. Wybierz kolumny, w których ma się pojawić nowy tekst. Naciśnij klawisz Enter. change dest 2

  5. Upewnij się, że wybrany jest zakres i kliknij Data & gt; Sort. Wprowadź kryteria sortowania. Dodawaj poziomy dla każdego oktetu. sorting

  6. Oto wynik końcowy: result


@nixda Yea, slow poke: P Szkoda, że ​​nie mogę też rzucić kilku rep
Canadian Luke

Przepraszamy, @nixda! Czy dodawanie odpowiedzi jest nielegalne?
rishimaharaj

Cóż, to zadziałało ... Czas, żebyście walczyli o dodatkowe 15 punktów rep
Canadian Luke

3

Zdaję sobie sprawę, że jest to stary post, ale w celu zapewnienia działającego rozwiązania przedstawiam następujące.

Wystarczy umieścić tę formułę w sąsiedniej komórce i zaktualizować odniesienia, aby wskazywały komórkę zawierającą adres IP (w tym przykładzie A1). Daje to wynik podobny do 010.121.008.030, który można następnie sortować (poprawnie) alfabetycznie. Następnie ustaw szerokość nowej kolumny na zero i voila. Czas na filiżankę kawy.

=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")

1
Uwielbiam to, idealne. Pojedyncza formuła, pojedyncza kolumna „pomocnicza”. Dzięki.
Earls

Podobnie jak w przypadku wszystkich formuł programu Excel może być konieczne użycie średników ( ; ) zamiast przecinków ( , ) w oparciu o ustawienia regionalne Twojego systemu.
Scott

Możesz pominąć połączone okresy ( …&"."&… ) i otrzymaj zwykłą dwunastocyfrową liczbę, np. 010121008030, która również zostanie poprawnie posortowana (chociaż funkcja sortowania może wywołać u Ciebie denerwujące okno dialogowe).
Scott

1
Sub IPSplit()

HeaderRow = 1
ColimnName = "A"
BeginIPaddsressData = 2

Dim HeaderArray As Variant
HeaderArray = Array("IP oct 1", "IP oct 2", "IP oct 3", "IP oct 4")

Dim Octet() As String
Dim RangeSearch As Range, RangeFound As Range, LastCell As Range
Dim LastCellRowNumber As Long, LastCellColumnNumber As Long, RowNumber As Long

With ActiveSheet
Set LastCell = .Cells(HeaderRow, .Columns.Count).End(xlToLeft)
LastHeaderColumnNumber = LastCell.Column

Set RangeSearch = Range("1:1")
Set RangeFound = RangeSearch.Find(What:=HeaderArray(0), LookIn:=xlValues)

If RangeFound Is Nothing Then
RowNumber = 2
    If .Cells(RowNumber, .Columns.Count) <> vbNullString Then
        Set LastCell = .Cells(RowNumber, .Columns.Count)
        LastCellColumnNumber = LastCell.Column
    Else
        Set LastCell = .Cells(RowNumber, .Columns.Count).End(xlToLeft)
'Specifies the last column LastCellColumnNumber.

        LastCellColumnNumber = LastCell.Column
    End If

Range(Cells(HeaderRow, LastCellColumnNumber + 1), Cells(HeaderRow, LastCellColumnNumber + 4)).Value = HeaderArray
'Insert Header

Else
LastCellColumnNumber = RangeFound.Column - 1
End If

Set LastCell = .Cells(.Rows.Count, ColimnName).End(xlUp)
'Specifies the last cell number in the column ColimnName.

LastCellRowNumber = LastCell.Row   
End With

    For I = BeginIPaddsressData To LastCellRowNumber

    Octet = Split(Cells(I, ColimnName).Value, ".")
    For O = 0 To 3       
'cells populate the values of octets 1-4.
      If (UBound(Octet) - O) >= 0 Then      
         Cells(I, ColimnName).Offset(0, LastCellColumnNumber + O).Value = Octet(O)
      End If
    Next
Next
End Sub

Nie mogę tego teraz przetestować (nie w pracy), ale spróbuję, kiedy zacznę pracować. Wygląda na to, że będzie bardziej przystosowany do dłuższych list, zwłaszcza jeśli dodam przycisk „Ośrodek”, aby uruchomić to makro
Canadian Luke

@CanadianLuke Możesz także utworzyć kolumnę BigIntIP. Następnie możesz sortować wszystkie adresy IP i odwrotnie A-Z.
STTR

To działa świetnie! Moim jedynym żądaniem byłoby ponowne użycie starych kolumn jako drukarek
Canadian Luke

@CanadianLuke Jeśli zmienisz nazwę tematu „IP ​​oct 1”, kolumna zostanie dodana po prawej stronie. A stary zostaje. To jest, jeśli potrzebujesz historii. Na przykład podczas migracji z jednej sieci do innej. Może nie do końca zrozumiałem pytanie ...
STTR
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.