글목록

2021년 11월 22일

가로/세로 방향 데이터 정렬하기

엑셀에 기본적으로 제공되는 정렬기능은 열방향(세로방향)으로 정렬하도록 되어있습니다.

만약, 각 열의 데이터를 정렬하려고 한다면, 아래와 같이 옵션창을 열어 '위쪽에서 아래쪽' 대신 '왼쪽에서 오른쪽' 옵션을 선택하면 가로방향으로 정렬이 가능합니다.


가로방향으로 정렬이 가능하다는 것 자체를 모르는 분들도 많이 계시기도 하고, 정렬 기능을 자주 사용하는 경우에는 정렬기준을 찾아서 옵션을 선택하는 것이 생각보다 번거로운 작업이기도 합니다.

작업영역을 선택하고, 가로/세로 방향으로 정렬하는 기능을 조금더 직관적이고 간단하게 작업하기를 원한다면 아래와 같은 매크로를 사용해볼 수도 있습니다. 개인별 작업 방식에 따라 적당히 수정해서 사용하신다면 좋을 듯 하여 소개해드립니다.

---------------------------------------------------------------

'아래 함수는 사용자가 선택한 여러 개의 셀, range를 각각의 행 또는 열로 나눠주는 함수입니다.
'Ctrl, Shift 버튼과 마우스 버튼을 조합하여 선택된 여러 영역을 선택된 순서대로 행이나 열로 나눠주는 기능이며, 정렬에 반드시 필요한 함수는 아닙니다.
Function DivideLines(iRange As Range, iColumnDir As Boolean) As Range()
  On Error GoTo ErrorHandler
  Dim tLine() As Range, i As Long, j As Long, n As Long
  n = 0
  Select Case iColumnDir
    Case True
      For i = 1 To iRange.Areas.Count
        For j = 1 To iRange.Areas(i).Columns.Count
          n = n + 1
          ReDim Preserve tLine(1 To n)
          Set tLine(n) = iRange.Areas(i).Columns(j)
        Next
      Next
    Case False
      For i = 1 To iRange.Areas.Count
        For j = 1 To iRange.Areas(i).Rows.Count
          n = n + 1
          ReDim Preserve tLine(1 To n)
          Set tLine(n) = iRange.Areas(i).Rows(j)
        Next
      Next
  End Select
  DivideLines = tLine
ErrorHandler:
  Erase tLine
End Function

---------------------------------------------------------------

Sub SortSelectedRange()
  On Error GoTo ErrorHandler
  Dim tSh As Worksheet, tRange As Range, tSelKey() As Range, tKey() As Range, tOrder(), tOrientation, tMSG
  Dim i As Long, j As Long, n As Long
  Set tSh = ActiveSheet
  '매크로를 실행하기 직전에 선택된 영역이 단일 셀이라면, 정렬이 필요없습니다. 따라서, 선택된 셀이 위치한 전체 영역을 재선택해줍니다.
  If Selection.Rows.Count = 1 And Selection.Columns.Count = 1 Then Selection.CurrentRegion.Select
  '만약, 선택된 영역이 현재 시트의 전체 사용영역을 벗어난 경우라면, 현재 사용영역까지만 작업 영역으로 변경해줍니다.
  Set tRange = Application.Intersect(Selection, tSh.UsedRange)
  '정렬을 여러개의 영역에서 작업하는 경우는 거의 없기 때문에 1개의 영역으로만 선택하도록 설정해줍니다.
  If tRange.Areas.Count > 1 Then MsgBox "1개의 영역만 선택하세요.", vbInformation, "선택 오류": GoTo ErrorHandler

  '선택영역을 가로/세로 방향으로 정렬할지 확인합니다.
  ReDim tSelKey(0)
  n = -1
  If MsgBox("세로 방향으로 정렬하시겠습니까?" & vbCrLf & " -Yes : 세로방향 정렬(▼), -No : 가로방향 정렬(▶)", vbYesNo, "정렬 방향") = vbYes Then
    tOrientation = xlSortColumns

  '선택영역을 세로방향으로 정렬하고자 한다면, 정렬 기준이 되는 열을 Ctrl, Shift 조합하여 여러 셀을 입력받습니다.
    Set tSelKey(0) = Application.InputBox("정렬할 Key값이 포함된 열을 선택하세요.", "열 선택", tRange.Columns(1).Address, Type:=8)
    tSelKey = DivideLines(tSelKey(0), True)
  '정렬기준행이 현재 선택 영역 내에 있는지 확인하여, 제대로 선택된 정렬 기준을 key로 정의해줍니다.
    For i = LBound(tSelKey) To UBound(tSelKey)
      If HasIntersect(tSelKey(i).EntireColumn, tRange) Then
        n = n + 1
        ReDim Preserve tKey(n)
        Set tKey(n) = Application.Intersect(tSelKey(i).EntireColumn, tRange)
      End If
    Next
  Else
  '가로 방향으로 정렬한다면, 정렬 기준 행을 입력받을 수 있습니다.
    tOrientation = xlSortRows
    Set tSelKey(0) = Application.InputBox("정렬할 Key값이 포함된 행을 선택하세요.", "행 선택", tRange.Rows(1).Address, Type:=8)
    tSelKey = DivideLines(tSelKey(0), False)
    For i = LBound(tSelKey) To UBound(tSelKey)
      If HasIntersect(tSelKey(i).EntireRow, tRange) Then
        n = n + 1
        ReDim Preserve tKey(n)
        Set tKey(n) = Application.Intersect(tSelKey(i).EntireRow, tRange)
      End If
    Next
  End If

  '정렬 기준이 되는 행/열이 없다면, 작업 종료하고, 정렬 기준이 있다면, 각 정렬 기준을 오름차순, 내림차순으로 정렬할지 확인합니다.
  If n < 0 Then
    MsgBox "정렬할 Key값이 포함된 행/열은 선택 영역 내에 포함되어야 합니다.", vbInformation, "선택 오류"
    GoTo ErrorHandler
  Else
    ReDim Preserve tOrder(UBound(tKey))
    For i = 0 To UBound(tKey)
      tKey(i).Select
      tMSG = MsgBox(i + 1 & "번째 Key값으로 오름차순 정렬 하시겠습니까?" & vbCrLf & " Yes : 오름차순, No : 내림차순, Cancel : 작업취소", vbYesNoCancel, "정렬 방법")
      If tMSG = vbCancel Then GoTo ErrorHandler
      If tMSG = vbYes Then tOrder(i) = xlAscending Else tOrder(i) = xlDescending
    Next
  End If
  
  '현재 작업시트에서 대상 영역, 정렬 방법 등을 지정해주고 내장된 정렬 기능을 실행합니다.
  With tSh.Sort
    .SortFields.Clear
    For i = 0 To UBound(tKey)
      .SortFields.Add Key:=tKey(i), SortOn:=xlSortOnValues, Order:=tOrder(i), DataOption:=xlSortNormal
    Next
    .SetRange tRange
    .Header = xlNo
    .Orientation = tOrientation
    .Apply
  End With
ErrorHandler:
  Erase tKey, tSelKey, tOrder
End Sub
---------------------------------------------------------------


평소에 세로 방향 정렬 뿐만 아니라, 가로 방향 정렬을 수시로 사용해야하는 분이라면, 위의 매크로를 리본 메뉴 버튼으로 지정해두고 사용하면 엑셀 내장된 정렬기능보다는 설정이 조금은 간단해질 것 같습니다.

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :