ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Excel 매크로 (VBA) - 008. 정렬하기 (Sort)
    Excel/Excel 매크로 2022. 8. 24. 01:15
    728x90

    전체 목차

     - 001. 특정 행을 복사하여 삽입하기

     - 002. 선택하여 붙여 넣기 기능 정리

     - 003. 변수/Assignment/Loop/비교

     - 004. 데이터가 있는 셀의 범위 알아내기

     - 005. 데이터 시트(쉘) 순회하기

     - 006. 셀 병합 하기

     - 007. 변수에 저장되어 있는 데이터 확인하기 (디버그 기능)

     

    포스트 목차

     -01. 엑셀에서 정렬

     -02. VBA에서 정렬

     -03. Ragne.Sort 사용 예제

     

     

    01. 엑셀에서 정렬

     

    엑셀에서는 데이터 메뉴에 3개의 아이콘으로 정렬을 설정할 수 있다. 정렬 아이콘은 다음과 같다.

     

     

    위의 정렬 아이콘을 누르기 전에 정렬해야 하는 셀의 영역(Range)를 마우스나 키보드를 이용하여 설정해야 한다.

     

    (1) 테스트 정렬

    텍스트 정렬은 오름차순 정렬과 내림차순 정렬이 있다.

      - 오름차순 정렬: 선택한 셀의 가장 왼쪽 열에 있는 데이터를 기준으로, 데이터 값이 증가하는 방향으로 정렬을 한다.  

      - 내림차순 정렬: 선택한 셀의 가장 왼쪽 열에 있는 데이터를 기준으로, 데이터 값이 감소하는 방향으로 정렬을 한다.

     

    데이터 A와 데이터 B의 대소관계를 따질 때는 데이터 A의 첫글자와 데이터 B의 첫글자를 비교하여, 첫글자가 큰 쪽이 데이터가 크다고 판단한다. 글자 간의 대소관계는 글자에 할당되어 있는 값에 따라 달라지는데, 대부분 우리가 배운 ㄱㄴㄷ 순과 같다. 다만 헷갈릴 때는 다음과 같이 확인을 해보자.

    가 > 나 일때 False가 나왔으므로  "나"의 값이 더 크다는 것을 알 수 있따.

     

    (2) 정렬

    위의 (1)에서 알아본 텍스트 정렬 기능은 정렬의 기준이 되는 열이 데이터 영역의 맨왼쪽열로 고정되어 있다.  우리는 가끔씩 맨왼쪽열이 아닌 열로도 비교를 하고 싶다. 또한 동률이 나왔을 때는 다른기준으로 비교하고 싶을때도 있다. 이러한 복잡한 작업을 지원하기 위해 정렬 메뉴가 따로 있다.  

     

    정렬하고자 하는 영역을 선택하고, 데이터> 정렬 아이콘을 누르면 다음과 같은 정렬 창이 열리게 된다. 

     - 세로 막대형

    위의 그림에서 세로  막대형 C가 의미하는 것은 행데이터를 정렬하겠다는 것을 뜻하고, C열을 정렬의 기준값으로 사용하겠다는 것을 의미한다. 

    세로 막대형 C 옆에 있는 정렬 기준은 이 설정 값들이 정렬을 하는 첫번째 기준이라는 것을 뜻한다.

     

     - 정렬 기준

    아래 그림에서는 정렬 기준이 중간에 하나 더 있는 것을 알 수 있는데, 표현하고자 하는 한국어의 한계인 것으로 보인다. 여기서의 정렬 기준은 셀 안에 들어있는 어떤 것을 기준으로 정렬할 것인지를 의미한다. 셀의 값, 셀의 색, 셀의 글꼴 색, 조건부 서식 아이콘 등이 정렬 기준이 될 수 있다. 

      - 정렬

    아래 그림에서 정렬 이라는 값으로 오름차순, 내림차순 사용자 지정 목록이라는 메뉴를 제공한다. 오름차순과 내림차순은 위의 텍스트 정렬에서 쓰인 그것들과 같은 의미로 볼 수 있다. 사용자 지정 목록은 사용자가 특정값의 순서를 지정하여 저장할 수 있는데 해당 기능을 사용하겠다는 것을 의미한다. 

      - 기준 추가

    왼쪽 상ㄷ단의 기준 추가 버튼을 클릭하면 정렬 기준을 하나 더 추가할 수 있다. 이것은 정렬 기준에서 동률이 발생한 데이터 들의 추가 비교를 "다음 기준"을 이용하여 수행하겠다는 것을 의미한다. 

     

     

    - 정렬 기준들의 우선순위 변경

    정렬 기준들을 우선순위를 변경하는 것이 가능하다. 아래의 그림에서 기준 복사와 옵션 사이의 화살표 버튼을 클릭하면 내가 원하는 정렬 기준을 위로 올리거나 내리는 것이 가능하다.

    예를 들어 다음 기준 (세로 막대형D, 셀값, 오름차순)을 클릭한 상태에서 윗방향 화살표 아이콘을 클릭하면, 두 정렬 기준의 순서가 변경되는 것을 확인할 수 있다. 

     

    - 정렬 옵션

    옵션 버튼을 클릭하면 정렬 옵션을 지정할 수 있다. 기본적인 정렬의 방향은 위쪽에서 아래쪽인데, 정렬옵션창에서 왼쪽에서 오른쪽을 클릭하면 정렬의 방향이 변경된다. 열에 있는 데이터를 정렬하게 된다. 또한 대/소문자 구분을 클릭하면, 정렬 작업을 할 때 대/소문자를 구분하여 정렬하게 된다. 

    - 내 데이터에 머리글 표시

    내 데이터에 머리글 표시를 클릭하면 선택한 영역 중에서 정렬 방향에 따라 최상단의 행 또는 최좌단의 열이 머리글로 빠지게 된다. 해당열/행을 지시할 때 주소대신 머리글을 사용하게 된다. 

    아래 그림 처럼 내 데이터에 머리글 표시를 비활성화하면 선택한 영역 전체가 정렬의 대상이되며 각각의 행과  열을 구분하기 위해 주소를 사용한다.

    (3) 영역에 이름 붙이기

    지금 다룰 내용은 정렬과 직접적인 연관은 없지만 Range를 다룰 때 사용하는 개념이므로 잠시 다루도록 하겠다.

    엑셀의 좌측 상단에는 이름 상자라고 하는 콤보박스가 있는데, 보통 셀의 주소를 나타낸다. 특정 영역을 선택 한 수에 이름 상자에 이름을 넣고 엔터를 치면 그 영역이 저장된다.

    위의 그림에서 B2:B14를 col_b_range라는 이름으로 저장했다.

    이후에 콤보박스의 오른쪽 세모를 클릭하면 다음 그림처럼 지정한 영역의 이름을 볼 수 있다. 여기서 원하는 영역의 이름을 클릭하면 아래 오른쪽 처럼 해당 영역이 선택되는 것을 볼 수 있다. 

     

    02. VBA에서 정렬

     

    Range.Sort  메소드를 이용하여 정렬을 할 수 있다. Sort는 Range 객체가 제공하는 메소드이기 때문에 사용하기 전에 Range 객체가 있어야 한다. 

     

    사용 문법은 다음과 같다. 

    Range객체.Sort [옵션 파라미터]:=[옵션 파라미터값]

     

    다음 사이트에서 자세히 다루고 있다.

    https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.range.sort?view=excel-pia 

     

    Range.Sort Method (Microsoft.Office.Interop.Excel)

    Sorts a PivotTable report, a range, or the active region if the specified range contains only one cell.

    docs.microsoft.com

     

    파라미터 이름 설명 데이터 값
    Key1 첫번째 정렬기준이 되는 Range 객체 또는 Range 이름
    Order1 첫번째 정렬 순서(오름차순, 내림차순, 사용자 지정) xlAscending, xlDescending, xlManual
    Key2 두번째 정렬기준이 되는 Range 객체 또는 Range 이름  
    Order2 두번째 정렬 순서(오름차순, 내림차순, 사용자 지정) xlAscending, xlDescending, xlManual
    key3 세번째 정렬기준이 되는 Range 객체 또는 Range 이름  
    Order3 세번째 정렬 순서(오름차순, 내림차순, 사용자 지정) xlAscending, xlDescending, xlManual
    Header 내 데이터에 머리글 표시 여부 xlNo, xlYes, xlGuess
    OrderCustom 사용자 정의 정렬 순서  
    MatchCase 대소문자 구분  
    Orientation 정렬의 방향 xlSortColumns, xlSortRows
    SortMethod 정렬 방법  
    DataOption1 첫번째 정렬 기준 적용 시, 텍스트와 숫자 구분 정렬 여부 xlSortNormal, xlSortTextAsNumbers
    DataOption2 두번째 정렬 기준 적용 시, 텍스트와 숫자 구분 정렬 여부 xlSortNormal, xlSortTextAsNumbers
    DataOption3 세번째 정렬 기준 적용 시, 텍스트와 숫자 구분 정렬 여부 xlSortNormal, xlSortTextAsNumbers

     

     

    03. Ragne.Sort 사용 예제

     

    이제  Range.Sort를 사용해보자. 

    정렬에 사용할 데이터는 다음과 같다. 

     

     

    (1) 정렬기준1 (학년, 오름차순), 내 데이터에 머리글 표시 여부

     

    1
    2
    3
    4
    5
    Sub sort1()
     
        ActiveSheet.Range("A1:E21").Sort Key1:=Cells(12), Order1:=xlAscending, Header:=xlYes
     
    End Sub
    cs

    위의 Sub 프로시저를 실행한 결과는 다음과 같다. 2열(B열)을 기준으로 오름차순으로 정렬된 것을 확인할 수 있다.  또한 영역의 맨 윗줄은 머리글로 사용되고 있음을 알 수 있다. 

     

     

    (2) 정렬기준1 (학년, 오름차순), 정렬기준2 (사는 곳, 오름차순), 내 데이터에 머리글 표시 여부

    1
    2
    3
    4
    5
    Sub sort2()
     
        ActiveSheet.Range("A1:E21").Sort Key1:=Cells(12), Order1:=xlAscending, Header:=xlYes, Key2:=Cells(11), Order2:=xlAscending
     
    End Sub


    위의 Sub 프로시저를 실행한 결과는 다음과 같다. 2열(B열)을 기준으로 오름차순으로 정렬한 후, 동률인 것들에 대해 1열(A열)을 기준으로 다시 정렬한 것을 확인할 수 있다.  또한 영역의 맨 윗줄은 머리글로 사용되고 있음을 알 수 있다. 

     

    (3) DataIOption1 := xlSortNormal  사용(숫자, 텍스트 분리 하여 정렬), 정렬기준1(점수, 오름차순), 내 데이터에 머리글 표시 여부

     

    DataOption1을 사용하기 위해 점수의 일부분을 텍스트로 변경한다. 텍스트로 변경하기 위해서는 값 앞에 '기호를 붙이면 된다.

     

    1
    2
    3
    4
    5
    Sub sort3()
     
        ActiveSheet.Range("A1:E21").Sort Key1:=Cells(15), Order1:=xlAscending, Header:=xlYes, DataOption1:=xlSortNormal
     
    End Sub
    cs

    Sub 프로시저를 실행한 결과는 다음과 같다. 점수열을 기준으로 오름차순으로 정렬되었는데 밑에 있는 5개는 텍스트로 분류하여 숫자 부분과 따로 정렬이 되는 것을 확인할 수 있으며, 텍스트 이기 때문에 첫문자부터 비교를 한다는 것을 알 수 있다. 

     

     

    (4) DataIOption1 := xlSortTextAsNumbers  사용(숫자, 텍스트 합쳐서 정렬), 정렬기준1(점수, 오름차순), 내 데이터에 머리글 표시 여부

     

    이번에는 (3)번 Sub 프로시저와는 다르게 xlSortTextAsNumbers 를 사용해보자.

    1
    2
    3
    4
    5
    Sub sort4()
     
        ActiveSheet.Range("A1:E21").Sort Key1:=Cells(15), Order1:=xlAscending, Header:=xlYes, DataOption1:=xlSortTextAsNumbers
     
    End Sub
    cs

     

    같은 상황에서 텍스트 데이터도 숫자로 간주되어 정렬되는 것을 확인할 수 있다.

     

     

    728x90
Designed by Tistory.