엑셀에 기본적으로 제공되는 정렬기능은 열방향(세로방향)으로 정렬하도록 되어있습니다.
만약, 각 열의 데이터를 정렬하려고 한다면, 아래와 같이 옵션창을 열어 '위쪽에서 아래쪽' 대신 '왼쪽에서 오른쪽' 옵션을 선택하면 가로방향으로 정렬이 가능합니다.
가로방향으로 정렬이 가능하다는 것 자체를 모르는 분들도 많이 계시기도 하고, 정렬 기능을 자주 사용하는 경우에는 정렬기준을 찾아서 옵션을 선택하는 것이 생각보다 번거로운 작업이기도 합니다.
작업영역을 선택하고, 가로/세로 방향으로 정렬하는 기능을 조금더 직관적이고 간단하게 작업하기를 원한다면 아래와 같은 매크로를 사용해볼 수도 있습니다. 개인별 작업 방식에 따라 적당히 수정해서 사용하신다면 좋을 듯 하여 소개해드립니다.
---------------------------------------------------------------
'아래 함수는 사용자가 선택한 여러 개의 셀, 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
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
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
If Selection.Rows.Count = 1 And Selection.Columns.Count = 1 Then Selection.CurrentRegion.Select
'만약, 선택된 영역이 현재 시트의 전체 사용영역을 벗어난 경우라면, 현재 사용영역까지만 작업 영역으로 변경해줍니다.
Set tRange = Application.Intersect(Selection, tSh.UsedRange)
Set tRange = Application.Intersect(Selection, tSh.UsedRange)
'정렬을 여러개의 영역에서 작업하는 경우는 거의 없기 때문에 1개의 영역으로만 선택하도록 설정해줍니다.
If tRange.Areas.Count > 1 Then MsgBox "1개의 영역만 선택하세요.", vbInformation, "선택 오류": GoTo ErrorHandler
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
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)
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
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
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
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
---------------------------------------------------------------
평소에 세로 방향 정렬 뿐만 아니라, 가로 방향 정렬을 수시로 사용해야하는 분이라면, 위의 매크로를 리본 메뉴 버튼으로 지정해두고 사용하면 엑셀 내장된 정렬기능보다는 설정이 조금은 간단해질 것 같습니다.
댓글 없음:
댓글 쓰기
의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~