본문 바로가기
VBA

[VBA] 사용자 지정 정렬을 해보자

by 일등미노왕국 2022. 12. 22.

출근일이 통합된 출근부에서 개별적으로 출근일을 분리하는 문제이다.

그룹정렬을 해서 풀어도 되고, 출력한 후 본인처럼 사용자 지정 정렬도 풀어도 된다.

 

그룹으로 정렬하는것은 방법자체에서 많이들 하는 방법이기에 사용자 지정정렬로 풀어보려한다.

 

혹여나 사용자 지정 정렬이 모르는 분들이 계실것 같아 엑셀 화면을 캡쳐해보았다.

 

이런식으로 올림차순 / 내림차순을 넘어 내가 원하는 목록으로 정렬하고자 할때 사용된다.

더보기

Option Explicit
Sub 출근부정렬()

    Dim rngAll As Range: Set rngAll = [a4:b13]
    Dim rngA As Range
    Dim Vtemp
    Dim rngX As Range: Set rngX = [d4]
    
    rngX.CurrentRegion.Offset(1).Clear
    For Each rngA In rngAll.Columns(1).Cells
    
        Vtemp = Split(rngA.Next, ",")               '= 출근일을 콤마(,) 기준으로 나눠서 Vtemp 에 담아라
    
        rngX.Resize(UBound(Vtemp) + 1, 1) = rngA    '= Vtemp는 근무한 횟수만큼 크기가 잡히니 그곳에 근무자 이름을 담아라
        rngX.Next.Resize(UBound(Vtemp) + 1, 1) = Application.Transpose(Vtemp)  '= 근무일을 담아라
        
        Set rngX = Cells(Rows.Count, "d").End(3)(2) '= 다음근무자는 D열의 마지막 데이터가 채워진 바로 아래에 출력해라
    
    Next rngA

    Set rngAll = [d4].CurrentRegion                 '= 출력된 모든 데이터를 rngAll로 재 설정해라

    apply_Sort rngAll                               '= apply_Sort를 호출해라
End Sub

Function apply_Sort(rngAll As Range)

    Dim V: V = Application.Transpose([a3:a13])      '= 헤더 값을 포함하여 사용자 정의 정렬 영역을 선택해라
       V = Join(V, ",")                             '= ★정말 중요하다★
    
    With ActiveSheet.Sort
        .SortFields.Clear                           
        .SortFields.Add2 Key:=rngAll.Columns(1), CustomOrder:="""" & V & """"
      
        .SortFields.Add2 Key:=rngAll.Columns(2)
        
        .SetRange rngAll
        .Header = xlYes
        .Apply
    End With
    
    rngAll.Borders.LineStyle = 2
    rngAll.HorizontalAlignment = xlCenter
    
End Function

코드는 정렬하는 코드이기에 어떻게 하는 지는 코드를 보면 이해할 수 있으리라 본다.

 

단 , 헤더값을 포함하여 코드를 진행하려면 반드시 key 영역을 헤더값 포함해서 잡아야 한다.

 

출근부.xlsm
0.02MB

댓글