IP 주소가 포함 된 Excel에서 셀을 올바르게 정렬하려면 어떻게해야합니까?


34

현재 많은 IP 주소 목록 (수천 개의 IP 주소)을 사용하고 있습니다.

그러나 IP 주소가 포함 된 열을 정렬하면 직관적이거나 따르기 쉬운 방식으로 정렬되지 않습니다.

예를 들어 다음과 같이 IP 주소를 입력하면

여기에 이미지 설명을 입력하십시오

그리고 오름차순으로 정렬하면 다음과 같이 나타납니다.

여기에 이미지 설명을 입력하십시오

예를 들어 IP 주소 17.255.253.65가 1.128.96.254 이후 에 오름차순으로 정렬 될 때 103.236.162.56 이전에 나타나도록 셀을 포맷하는 방법이 있습니까?

그렇지 않다면이 궁극적 인 목표를 달성 할 수있는 다른 방법이 있습니까?


3
정렬은 셀 서식의 영향을받지 않습니다.
Blackwood

1
흥미 롭습니다. 어떤 경우에는 셀 형식이 정렬에 영향을 미치며 이것이 아마도 그 중 하나 일 것이라고 생각했습니다. 설명 주셔서 감사합니다!
Monomeeth

1
그리고 Bruce가 IPv6 주소를 처리해야 할 경우 도움을줍니다!
Criggie

답변:


42

알다시피 IP 주소는 숫자가 아닌 텍스트로 취급됩니다. 텍스트로 정렬되므로 "162"로 시작하는 주소는 "20"으로 시작하는 주소 앞에옵니다. 문자 "1"이 문자 "2"앞에 오기 때문입니다.

https://stackoverflow.com/a/31615838/4424957 에서 제공하는 공식을 사용하여 IP 주소를 부분으로 분할 할 수 있습니다.

IP 주소가 열 A에 있으면 아래에 표시된대로 열 BE를 추가하십시오.

여기에 이미지 설명을 입력하십시오

공식을 입력하십시오

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

셀 B2에서 모든 행의 BE 열에 복사하여 각 IP 주소의 네 부분을 가져옵니다. 이제 아래 표시된 것처럼 열 B에서 E까지 (순서대로) 전체 범위를 정렬하십시오.

여기에 이미지 설명을 입력하십시오

도우미 열 (BE)을 보지 않으려면 숨길 수 있습니다.


12
4 개의 열로 나누는 대신 first*256^3+second*256^2+third*256+fourth한 열 에서처럼 바이트를 "연결"하는 것이 더 좋을까요?
Ruslan

특히 IPv4 주소는 실제로 32 비트 숫자이기 때문입니다. IP 주소를 표시하는 4 개의 4 비트 숫자 방식은 사람이 읽을 수있는 것입니다.
Kat

@Kat 나는 그것이 작동 할 것에 동의하며, 4 개가 아닌 1 개의 도우미 열만 필요합니다. 그러나 한 열의 수식은 다소 길기 때문에 4 개의 열을 사용하기로 결정했습니다 (어쨌든 숨길 것입니다).
Blackwood

10

내가 제안 할 수있는 가장 쉬운 3 단계 솔루션은 다음과 같습니다.

  1. IP 주소 열을 선택하고 텍스트를 열에 적용하십시오 .

  2. 인접한 열에이 수식을 작성하십시오

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

  3. 마지막으로 오름차순으로 정렬하십시오.

스크린 샷을 확인하십시오.

여기에 이미지 설명을 입력하십시오

NB :

빨간색 은 원래 IP 주소입니다 (A 열).

텍스트를 열에 적용한 후 녹색 (B 열에서 E 열로).

검은 색 이 적용된 후 연결 및 정렬 (열 F)입니다.

그 이유는 원래 IP 주소가 텍스트 데이터이기 때문에 매우 간단하기 때문에 Excel에서는 셀 형식을 허용하지 않으므로 숫자로 변환 할 수 없습니다.

이것이 당신을 돕기를 바랍니다.


4
이 끔찍한. 다른 행의 데이터를 혼합하고 싶지 않습니다.
MaxW

@ MaxW, 나는 당신이 말하고 싶은 것을 정확히 얻지 못했습니다!
Rajesh S

2
즉, 원래 열 A를 정렬에 포함 했으므로 iP 주소가 각 행에서 동일해야합니다.
Bandersnatch

1
아니요, 내가 한 일이 잘못되었습니다. OP 수요는 IP 주소를 자연 순서대로 정렬해야했으며 (숫자) RED의 열 A는 정렬되지 않았습니다. F 열의 IP 주소는 BLACK입니다.
Rajesh S

1
+1 페이지에서 가장 쉬운 솔루션입니다. @RajeshS는 귀하의 답변에서 'adjusted'라는 단어를 'adjacent'로 바꿀 수 Text To Column있습니다. @MaxW, 레이아웃은 데모 용입니다. 원래 IP를 정렬하려면 2 단계를 무시하십시오. 승인 된 답변의 방대한 "VALUE (TRIM (MID (SUBSTITUTE") 수식은 'Text To Columns "로 대체되어야하며 나머지 답변은 기본적으로 동일합니다.
mcalex

9

다음은 동일한 문제를 해결하기 위해 얼마 전에 작성한 VBA 함수입니다. 올바르게 정렬 된 IPv4 주소의 패딩 된 버전을 생성합니다.

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

간단한 예 :

결과

결과

방식

방식

'정렬 가능'열을 기준으로 정렬하여 숨길 수 있습니다.


4
정렬 가능한 IP 주소가 원래 주소와 다른 주소로 구문 분석됩니다 (일부 바보가 8 진수로 해석하기로 선택했기 때문에). 따라서 정렬에만 사용하고 적절한 IP로 취급하지 마십시오.
코드 InChaos

vba를 꺼내려면 왜 vba가 정렬을 수행하지 않았는지
Richard Tingle

1
@RichardTingle 1. (약간) 더 많은 작업입니다 2. 다른 순간에 여러 가지 다른 방법으로 목록을 정렬하고 싶을 수도 있습니다
grahamj42

7

다음은 테이블의 한 열만 가져오고 IPv4 주소를 기본 10 번호 매기기로 변환하는 답변입니다.

데이터를 "M"열에 넣었으므로 M2 셀에서 시작합니다 (M1은 레이블 임). 코드로 캡슐화하면 끔찍한 혼란이 생겨 블록 인용 부호를 사용했습니다.

= INT (LEFT (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 (RIGHT (M2, LEN (M2)-FIND ( ".", M2, FIND ( ".", M2, FIND ( ".", M2) + 1) ) + 1)))

가장 쉽게 읽을 수있는 공식은 아니지만 셀에 복사하여 붙여 넣을 수 있습니다 (예 : N2 또는 첫 번째 IP 주소와 같은 행에있는 다른 항목). 수식의 오류 수정으로 인해 사람의 구문 분석이 더 나빠질 수 있으므로 IP 주소의 올바른 형식을 가정합니다.


3

수식이나 VBA를 사용하지 않으려면 파워 쿼리를 사용하십시오. (Excel 2016, Get & Transform의 Excel 2010 또는 2013에서 PowerQuery 추가 기능을 설치하십시오.)

  1. 표를 PowerQuery 편집기로 가져 오십시오.
  2. "열 복제"를 마우스 오른쪽 단추로 클릭하여 열을 복제하십시오.
  3. 홈 탭에서 구분 기호로 "열 분리" "구분 자마다"를 선택하십시오.
  4. 각 열 Asc를 정렬하십시오. 왼쪽에서 오른쪽으로.
  5. 이전에 분할 된 열을 선택하고 마우스 오른쪽 버튼을 클릭하고 제거하고 닫고로드하십시오.

3

이것은 옥텟을 적절한 정렬을 허용하는 3 자리 필드로 변환하는 유사한 하나의 라이너입니다.

10.1.0.15됩니다 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
정렬이 작동하려면 첫 번째 옥텟을 선행 0으로 채워야합니다.
Blackwood

2

문제에서 알 수 있듯이 M 열 은 M2부터 IP 주소 (IPv4)입니다.

모든 사람의 대답에서 좋은 점을 얻음으로써 여기 내 해결책이 있습니다. 1 개의 도우미 열만 필요합니다. 우리는 시도 에 IPv4 주소 포맷 012.198.043.009형식을 분류 그들을 다음과 :

  • 12.198.43.9~에 12 198 43 9, ~에012.198.043.009

  1. N2012.198.043.009 를 입력하여 IPv4 주소 를 형식 으로 형식화하고 아래로 채 웁니다.

    = 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. N 열로 정렬


설명

6 개의 공백으로SUBSTITUTE 점 을 찍으면 다음을 얻을 수 있으므로 올바르게 추출 할 수 있습니다..

                   |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===
  • 문자 1-3은 첫 번째 부분 만 포함하고 포함합니다.
  • 문자 8-12는 두 번째 부분 만 포함하고 있습니다.
  • 문자 15-21에는 세 번째 부분 만 포함됩니다.
  • 가장 오른쪽 3 자에는 네 번째 부분 만 포함됩니다.

그런 다음로 각 부분을 추출하고 형식을 지정하십시오 TEXT(..., "000").


2

Windows에서 최신 버전의 Excel을 사용하는 경우 다음 공식을 사용하여 IP 주소의 32 비트 10 진수 값을 계산할 수 있습니다.

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

그런 다음 파생 된 10 진수 값을 사용하여 정렬 할 수 있습니다. [@ipbase]유효한 IP4 주소의 셀 위치로 대체 하십시오.

"FILTERXML"기능은 Windows에서만 작동하므로 다른 운영 체제를 사용하는 경우 운이 좋지 않습니다.


0

또한 알파 정렬을 위해 패딩 형식 IP (000.000.000.000)를 제공하는 단일 라이너가 있습니다.

= 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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.