애들센스


Collection의 Key는 어디서 찾아야 하나? 오피스/VBA/Office.JS

이런 경우 VBA는 한심한 언어이다. 무슨 얘기인가 하면 Collection개체의 Add메서드를 사용할 때 딕셔너리처럼 {Key, Item}와 같이 Key를 같이 입력할 수 있다. 물론 Key는 유일해야 하므로 중복된 Key값은 받아주질 않는다.
그런데 Key를 입력하고 나면 Key값을 알 수 있는 방법이 없다. 도대체 Key를 만들어 입력해서 Key를 갖고 Item을 찾을 수 있게 해주면 뭐하나? Key을 돌려주는 프로퍼티나 메서드가 없는데…
이런 문제점에 대한 대안으로 Item에 Key를 포함해서 넣어주는 방법으로 해결한다. 즉 프로그래밍언어 차원이 아닌 개발방법으로서 몸으로 때우는 것이다.
Dim col As New Collection

col.Add Array("key#1", "first string"), "key#1"
col.Add Array("key#2", "second string"), "key#2"
col.Add Array("key#3", "third string"), "key#3"

'// print item's value in the collection
Dim item As Variant

For Each item In col
Debug.Print item(1)
Next

'// print item's key in the collection
Dim key As Variant

For Each key In col
Debug.Print key(0)
Next
위의 코드에서 Key#1, Key#2, Key#3는 종전처럼 입력하지만 이와 동시에 아이템 선두에 키값을 한번 더 입력하고 아이템 조회시 0번 인덱스를 Key로 삼아 사용하려는 것이다.

이런 VBA를 계속 쓰는 오피스개발자로서 눈물이 앞을 가린다.

[관련 포스팅]: VBA Collection

덧글

  • 우왕 2020/01/21 09:43 # 삭제 답글

    애독자(?) 입니다. 이 글 보니까 사람들 생각은 다 비슷한 데가 많다는걸 알게 되네요. 저도 Dictonary안쓸땐 Collection으로는 이렇게 쓰고 있거든요.
  • 타임버드 2020/01/21 13:02 #

    ㅎㅎ 애독자 인증드립니다. 아마 댓글을 남기진 않지만 이 블로그를 찾아주시는 분들은 이미 알고 있을 겁니다.
  • 우왕 2020/01/21 09:53 # 삭제 답글

    http://vb.mvps.org/tips/varptr/

    위와 같이, 땡땡땡ptr 함수를 이용하면 데이터의 메모리 주소값(?)을 키로 삼아서 컬렉션을 핸들링하는 방법이 있었습니다.
    사실 컬렉션 키를 알아야 할때는 대부분... remove 할때 정도가 대부분이더라구요. 나머지는 호출인데 그런경우는 이미 키를 규칙에 맞춰서 넣는 경우라서...
  • 타임버드 2020/01/21 12:59 #

    좋은 정보 감사합니다. 읽어 볼게요
댓글 입력 영역