programing

컬렉션이 있을 때 VBA에서 어레이를 사용하는 이유는 무엇입니까?

abcjava 2023. 5. 6. 14:00
반응형

컬렉션이 있을 때 VBA에서 어레이를 사용하는 이유는 무엇입니까?

많은 사람들이 Excel/VBA의 어레이를 광범위하게 사용하여 데이터 목록을 저장합니다.그러나 제가 보기에 훨씬 더 편리한 컬렉션 개체가 있습니다(주로 목록의 길이를 다시 정의할 필요 없음).

그래서, 저는 제가 뭔가를 놓치고 있지 않은지 진심으로 스스로에게 묻고 있습니다.왜 다른 사람들은 여전히 어레이를 사용하여 데이터 목록을 저장합니까?그것은 단순히 과거의 숙취입니까?

컬렉션(또는 사전) 대신 어레이를 사용하는 몇 가지 이유:

  • 어레이를 범위로 쉽게 전송할 수 있습니다(그 반대도 가능).Range("A1:B12") = MyArray
  • 컬렉션은 고유한 만 저장할 수 있는 반면 어레이는 모든 값을 저장할 수 있습니다.
  • 컬렉션은 두 개(키, 값)를 저장해야 하는 반면, 배열에 무엇이든 저장할 수 있습니다.

어레이에 대한 Chip Pearson의 기사를 참조하여 더 나은 이해를 얻으십시오.

더 나은 질문은 오히려 사람들이 사전 대신 컬렉션을 사용하는 이유입니다(좋아요, 컬렉션은 표준 VBA인 반면 사전을 가져와야 합니다).

@CharlesWilliams의 대답이 맞습니다. 배열의 모든 값을 반복하는 것이 컬렉션이나 사전을 반복하는 것보다 빠릅니다. 그렇게 해야 할 때는 항상 사전의 Keys() 또는 Items() 메서드를 사용합니다. 두 메서드 모두 벡터 배열을 반환합니다.

참고: 저는 컬렉션보다 사전 클래스를 훨씬 더 많이 사용합니다. Exists() 메서드는 너무 유용합니다.

컬렉션과 사전에는 물론 단점이 있습니다.그 중 하나는 어레이가 2차원 또는 3차원이 될 수 있다는 것입니다. 표 형식의 데이터 구조는 훨씬 더 우수합니다.배열을 컬렉션의 멤버로 저장할 수 있지만, 몇 가지 단점이 있습니다. 사용하지 않는 한 항목에 대한 참조를 얻지 못할 수도 있습니다. arrItem = MyDictionary(strKey)스토리지의 'ByVal' 복사본을 거의 확실하게 얻을 수 있습니다. 즉, 데이터가 동적이고 여러 프로세스에 의해 변경될 수 있는 경우에는 좋지 않습니다.그것은 또한 느립니다. 많은 양의 할당과 할당 해제.

무엇보다도 어레이(또는 개체)를 멤버로 포함한 컬렉션이나 사전이 있는 경우 VBA가 메모리 할당을 취소할 것이라고는 신뢰하지 않습니다. 범위를 벗어나는 것도 아니고 다음이 아닌 것도 아닙니다.Set objCollection = NothingobjDictionary에 의해서도 .모두 제거 - VBE에서 사용할 수 있는 제한된 테스트 툴킷에서 문제가 존재한다는 것을 증명하기는 어렵지만 사전에서 어레이를 사용하는 애플리케이션에서 메모리 누수가 충분히 발생하여 주의가 필요하다는 것을 알고 있습니다.그렇긴 하지만, 저는 어딘가에 Erase 명령이 없는 어레이는 절대 사용하지 않습니다.

@JMax는 어레이에 대한 또 다른 큰 이점을 설명했습니다. 하나의 '히트'로 어레이를 워크시트에 채울 수 있고 하나의 '히트'로 작업 내용을 다시 쓸 수 있습니다.

물론 인덱스 배열 클래스를 구성하면 두 가지 장점을 모두 얻을 수 있습니다. 어떤 종류의 행 식별자를 키로 저장하는 관련 컬렉션 또는 사전 개체가 있는 2차원 배열과 행 서수를 데이터 항목으로 사용할 수 있습니다.

자동으로 크기를 조정하는 수집은 더 느립니다(이론적으로, 다양한 구현에는 분명히 고유한 마일리지가 있습니다).항목 수가 정해져 있고 선형 방식으로만 액세스하면 되는 경우 기존 어레이가 올바른 접근 방식입니다.

언급URL : https://stackoverflow.com/questions/10579457/why-use-arrays-in-vba-when-there-are-collections

반응형