rand(life)

[vba] 병합된 셀이 있는 상태에서 정렬하기 본문

컴퓨터/엑셀

[vba] 병합된 셀이 있는 상태에서 정렬하기

flogsta 2019. 7. 2. 07:28

 

셀병합된상태로정렬.xlsm
0.02MB

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셀에 붙여넣어진다.