본문 바로가기
VBA

[VBA_정렬하기] Dictionary + ArrayList 정렬하기

by 일등미노왕국 2021. 8. 26.

오늘은 엑셀에 Vlookup이 있다면 VBA Dictionary가 있다고 해도 과언이 아니기에 딕셔너리를 다뤄보려고 한다.
확실히 딕셔너리가 퍼포먼스 하기에는 딱인거 같다.

해결과제는 이렇다. 1행부터 1000행까지 데이터가 있다. 각 행에는 1번부터 100번까지 무작위 수가 들어가 있고, 옆에는 그 무작위로 뽑아낸 수에 또다시 1번부터 8번까지 무작위 수를 주어 두수를 곱하여 키값과 아이템 값을 구분지었다

복잡해 보이지만 딕셔너리로 풀면 이건 눈깜짝할이에 값이 출력될 것이다. 딕셔너리 강의는 군더더기 없이 깔끔한 엑사남님 강의가 있으니 딕셔너리를 모르시거나 아직 정립이 안되신 분들은 반드시 한번 꼭 보고 오시길 바란다.
https://www.youtube.com/watch?v=DXf7szoq8lM&t=430s

딕셔너리는 데이터가 입력된 상태에 따라 그대로 키값으로 만들어 버리기 때문에 순번없이 뒤섞여서 그게 보기 싫은 분들은 셀에 출력한 후 그 셀을 다시 정렬하여야 한다

근데 이게 키값은 정렬이 되는데 아이템 값은 정렬하기가 쉽지 않다. 아이템의 중복값도 제거해야 한다 ㅠ
이번에 적용한 코드는 저번에 한번 가볍게 다루었던 ArrayList를 좀더 다각도로 다가가 이녀석의 최대한계치를 끌어내 보려고 한다. 딕셔너리 전체 키값을 담을 Arrkey, 딕셔너리 각 키값의 아이템들을 모두 담을 Arritem 으로 ArrayList 2개를 사용하여 구문을 완성하였다.

눈썰미가 있는 분들은 왜 Arrkey는 For each밖에서 선언했고 Arritem은 For each안 비교문안에서 해당 조건이 충족될 때마다 다시 SET문으로 선언하는 것을 확인할 수 있다.
보통 필자는 Object를 선언하면 최대한 바로 근처나 옆에 붙혀놓는걸 좋아한다.

하지만 이 구문에서는 딕셔너리 구문에 SET문으로 두번 선언하였다.

 

유는 이렇다.
딕셔너리 키값이 존재하면 아이템만 추가하면된다. 그러기에 Arritem을 특정하기 위해 딕셔너리의 해당 아이템값을 Arritem에 담아놓고 거기에 Ditem을 추가 해주는 것이다.
우리가 많이 했던 Dict(dkey) = Dict(dkey) & "," & Ditem 이것과 의미는 사실같지만 Arritem안에서 특별한 구분자 없이 ArrayList자체에 담겨서 Ditem 에 담겨지는 것에 대해서 유념해야 한다.

딕셔너리 키값이 존재하지 않는다면 키값과 아이템 값을 모두 추가 해야 한다. 이구문에서 새로운 아이템 값을 담기위해 SET 문으로 Arritem을 재선언하여 딕셔너리 Ditem에 역시 ArrayList 상태로 추가하였다.

딕셔너리 반복문 구문이 종료가 되면 바로 키값을 정렬하고
정렬한 것을 토대로 각 아이템들을 FOR 문을 통해 셀에 뿌려주는것으로 구문이 종료가 된다.

Dict_Arrlist(21.08.06).xlsm
0.06MB

댓글