Notice
Recent Posts
Recent Comments
rand(life)
[vba] 병합된 셀이 있는 상태에서 정렬하기 본문
Option Explicit
Sub Jo_sort()
Dim rD As Range
Dim jList As Object
Dim i As Long, iCol As Long
'Application.ScreenUpdating = False
Set rD = Range("a1").CurrentRegion '데이터 범위
iCol = rD.Columns.Count
Set jList = CreateObject("system.collections.sortedlist")
With jList
For i = 1 To rD.Rows.Count Step 2
Dim sT As String
sT = rD.Cells(i, 1).Value & rD.Cells(i, 3).Value
If Not .contains(sT) Then .Add sT, rD.Cells(i, 1).Resize(2, iCol)
Next i
For i = 0 To .Count - 1
.getbyindex(i).Copy Cells(i * 2 + 1, 100)
Next i
End With
rD.Offset(, 99).Cut rD
Application.ScreenUpdating = True
End Sub
지식인에서 가져온 글
.Add sT, rD.Cells(i, 1).Resize(2, iCol) 이 부분은 Scripting.Dictionary와 유사하다.
특징적인 것은, rD.Cells(i, 1).Resize(2, iCol) 이 부분은 셀병합이 된 구조인데
이상태로 collection에 담아두었다가
뒤의 코드에서 collection안에 있는 구조를 "그대로 복사"할 수 있다는 것이다.
.getbyindex(i).Copy Cells(i * 2 + 1, 100)
즉, collection에 텍스트, 숫자, 셀 정도만 담아둘 수 있는 것이 아니라
셀의 구조(병합된 형태)조차도 담아둘 수 있다는 것.
이 특성은 현재의 sortedlist 뿐만 아니라 이전에 사용했던 dictionary에도 똑같이 적용된다.
d.items()(3).Copy Range("J1")
이렇게 하면 4번째 (index는 0부터 시작이므로) key에 있는 item이 복사되어 J1셀에 붙여넣어진다.