VBA ArrayList – 2022년 업데이트된 완벽한 가이드

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Younjung Kim

Last updated on 4월 6, 2023

VBA ArrayList 사용하기

ArrayList는 값을 저장하는 데 사용할 수 있는 VBA 객체입니다. Collection 객체와 비슷하지만 프로그래밍 관점에서 보면 훨씬 더 유연합니다. ArrayList와 Collection과 배열의 몇 가지 차이점에 대해 알아보겠습니다.

  • Collection 객체에는 두 가지 메서드(Add, Remove)와 두 가지 속성(Count, Item)만 있는 반면 ArrayList에는 더 많은 메서드가 있습니다.
  • Collection객체는 읽기 전용입니다. 값을 추가한 후에는 색인된 값을 변경할 수 없지만 Array List에서는 편집이 가능합니다.
  • ArrayList 객체는 포함된 항목 수에 따라 크기가 확장 및 축소됩니다. Array처럼 사용하기 전에 크기를 지정할 필요가 없습니다.
  • ArrayList는 1차원이며(Collection 객체와 동일) 기본 데이터 유형은 Variant이므로 숫자, 텍스트, 날짜 등 모든 유형의 데이터를 받아들일 수 있습니다.

여러 가지 면에서 ArrayList는 Collection 객체의 여러 단점을 해결합니다. ArrayList를 활용하면 더 유연하게 코드를 작성할 수 있습니다.
ArrayList 객체는 표준 VBA 라이브러리의 일부가 아닙니다. Late 바인딩 또는 Early 바인딩을 사용하여 Excel VBA 코드에서 사용할 수 있습니다.

Sub LateBindingExample()
Dim MyList As Object
Set MyList = CreateObject("System.Collections.ArrayList")
End Sub
Sub EarlyBindingExample()
Dim MyList As New ArrayList
End Sub

Early 바인딩 예제를 사용하려면 먼저 VBA에서 ‘mscorlib.tlb’ 파일에 대한 참조를 입력해야 합니다.

이를 위해서는 비주얼 베이직 에디터(VBE) 창에서 ‘도구 > 참조’를 선택합니다. 사용 가능한 모든 참조가 표시된 팝업 창이 나타나면. 아래로 스크롤하여 ‘mscorlib.dll’ 찾은 후 체크박스를 선택합니다. 확인을 클릭하면 해당 라이브러리가 이제 프로젝트의 일부가 됩니다:

ArrayList객체의 큰 단점 중 하나는 ‘자동요약정보’가 없다는 것입니다. 일반적으로 범위와 같은 VBA에서 개체를 사용하는 경우 사용 가능한 모든 속성 및 메서드의 팝업 목록이 표시됩니다. ArrayList객체에서는 이러한 팝업이 표시되지 않으므로 메서드나 속성의 철자가 올바른지 주의 깊게 확인해야 하는 경우가 있습니다.

또한 VBE 창에서 F2 키를 누르고 ‘arraylist’를 검색하면 아무것도 표시되지 않아 개발자에게는 그다지 도움이 되지 않습니다.

코드가 모두 미리 컴파일되기 때문에 Early바인딩을 사용하면 코드가 훨씬 빠르게 실행됩니다. Late 바인딩을 사용하면 코드가 실행될 때 객체를 컴파일해야 합니다.

ArrayList가 포함된 Excel 애플리케이션 배포하기

위에서 언급했듯이 ArrayList 객체는 Excel VBA의 일부가 아닙니다. 즉, 애플리케이션을 사용할 모든 동료들은 ‘mscorlib.tlb’ 파일에 대한 액세스 권한이 있어야 합니다.

이 파일은 일반적으로 아래 경로에 있습니다:

C:\Windows\Microsoft.NET\Framework\v4.0.30319

사용자가 애플리케이션을 로드할 때 이 파일이 존재하는지 확인하는 코드(Dir 메서드 사용)를 작성하여 파일이 없는 경우 메시지박스 등을 활용하여 애플리케이션을 사용할 수 없음을 인지시켜주는 것이 좋습니다. 파일이 없는데도 코드가 실행된다면 오류가 발생합니다.

또한 사용자에게 올바른 .Net Framework 버전이 설치되어 있어야 합니다. 사용자가 이전 버전을 가지고 있더라도 V3.5를 설치해야 하며, 그렇지 않으면 애플리케이션이 작동하지 않습니다.

Array List 객체의 사용 범위

사용 범위 측면에서 ArrayList 객체는 통합 문서가 열려 있는 동안에만 사용할 수 있습니다. 통합 문서가 저장될 때 저장되지 않습니다. 통합 문서를 다시 열면 VBA 코드를 사용하여 ArrayList 객체를 다시 만들어야 합니다.

코드 모듈의 모든 코드에서 ArrayList을 사용할 수 있도록 하려면 모듈 창의 맨 위에 있는 선언 섹션에서 ArrayList 객체를 선언해야 합니다.

아래와 같이 선언하면 해당 모듈 내의 모든 코드가 ArrayList로 선언된 변수에 액세스할 수 있습니다. 통합 문서 내의 모든 모듈이 ArrayList 객체에 액세스하도록 하려면 해당 객체를 전역 변수로 정의해야합니다.

Global MyCollection As New ArrayList

ArrayList 채우기 및 읽기

가장 기본적인 작업은 ArrayList을 만들고 여기에 데이터를 넣은 다음 데이터를 읽을 수 있음을 보여주는 것입니다. 이 글의 모든 코드 예제에서는 위에서 설명한 대로 Early 바인딩을 사용하고 있고, VBA 참조에 ‘mscorlib.tlb’를 추가했다고 가정합니다.

Sub ArrayListExample()
'새로운 ArrayList 객체를 생성합니다
Dim MyList As New ArrayList

'아이템을 목록에 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"

'ArrayList을 반복하여 값이 있음을 확인합니다
For N = 0 To MyList.Count - 1
    MsgBox MyList(N)
Next N

End Sub

이 예제는 새로운 ArrayList 객체를 생성하고, 3개의 항목으로 채운 다음, 각 항목을 표시하는 목록을 반복합니다.

ArrayList 인덱스는 1이 아니라 0에서 시작하므로 Count 값에서 1을 빼야 합니다.

‘For…Each’ 반복문을 사용하여 값을 읽을 수도 있습니다:

Sub ArrayListExample()
'새로운 ArrayList 객체를 생성합니다
Dim MyList As New ArrayList

'아이템을 목록에 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"

'ArrayList을 반복하여 값이 있음을 확인합니다
For Each I In MyList
    MsgBox I
Next I

End Sub

ArrayList의 항목 편집, 변경하기

Collection에 비해 ArrayList의 가장 큰 장점은 코드 내에서 목록의 항목을 편집하고 변경할 수 있다는 것입니다. Collection 객체는 읽기 전용인 반면 ArrayList객체는 읽기/쓰기가 가능합니다.

Sub ArrayListExample()
'새로운 ArrayList 객체를 생성합니다
Dim MyList As New ArrayList

'아이템을 목록에 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"

'Item2를 '변경'으로 변경합니다 
MyList(1) = "변경"

'ArrayList을 반복하여 값이 변경되었음을 확인합니다
For Each I In MyList
    'Display item name
    MsgBox I
Next I

End Sub

이 예제에서는 두 번째 항목인 ‘Item2’가 ‘변경’ 값으로 변경됩니다(인덱스는 0에서 시작한다는 점을 기억하세요). 코드 마지막에 반복이 실행되면 새 값이 표시됩니다.

ArrayList에 배열의 값들 추가하기

값의 목록이 포함된 배열 또는 워크시트의 셀 값에 대한 참조를 사용하여 ArrayList에 값을 입력할 수 있습니다.

Sub AddArrayExample()
'새로운 ArrayList객체를 생성합니다
Dim MyList As New ArrayList

'배열을 반복하여 ArrayList에 값들을 추가합니다
For Each v In Array("A1", "A2", "A3")
    '각각의 배열의 값들을 리스트에 추가합니다
    MyList.Add v
Next

'워크시트의 값들을 참조하여 ArrayList에 추가합니다
For Each v In Array(Range("A5").Value, Range("A6").Value)
    MyList.Add v
Next

'ArrayList을 반복하여 값들이 추가되었음을 확인합니다
For N = 0 To MyList.Count – 1
   'Display list item
    MsgBox MyList.Item(N)
Next N

End Sub

ArrayList에서 항목 읽기/검색하기

ArrayList에서 GetRange 메서드를 사용하면 연속된 항목의 범위를 지정할 수 있습니다. 필요한 두 가지 매개 변수는 시작 인덱스 위치와 항목 수입니다. 이 코드는 두 번째 ArrayList 객체에 할당할 첫번째 ArrayList 객체의 일부를 추출합니다 .

Sub ReadRangeExample()
'Define objects
Dim MyList As New ArrayList, MyList1 As Object

' ‘MyList’ 객체에 항목을 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
MyList.Add "Item6"
MyList.Add "Item4"
MyList.Add "Item7"

'‘MyList’의 2번째 항목부터 4개의 항목을 추출합니다
Set MyList1 = MyList.GetRange(2, 4)

' ‘MyList1’ 객체를 반복하여 항목을 표시합니다
For Each I In MyList1
   'Display item name
    MsgBox I
Next I

End Sub

ArrayList 내에서 항목 검색하기

‘Contains’ 메서드를 사용하여 명명된 항목이 목록에 있는지 여부를 테스트할 수 있습니다. 이 메서드는 참 또는 거짓을 반환합니다.

MsgBox MyList.Contains("Item2")

‘IndexOf’ 메서드를 사용하여 실제 인덱스 위치를 찾을 수도 있습니다. 검색의 시작 인덱스(일반적으로 0)를 지정해야 합니다. 반환 값은 발견된 항목의 첫 번째 인스턴스의 인덱스입니다. 반복문을 사용하여 시작 지점을 다음 인덱스 값으로 변경하여 중복된 값이 여러 개 있는 경우 추가 인스턴스를 찾을 수도 있습니다

값이 없으면 -1 값이 반환됩니다.

이 예제에서는 ‘Contains’, 항목 없음, ArrayList 반복을 사용하여 중복된 항목의 위치를 모두 찾는 방법을 보여 줍니다:

Sub SearchListExample()
'ArrayList와 변수를 선언합니다
Dim MyList As New ArrayList, Sp As Integer, Pos As Integer

'중복을 포함한 항목들을 ArrayList에 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
MyList.Add "Item1"

'“Item2”가 리스트에 있는지 확인합니다 - True를 반환합니다
MsgBox MyList.Contains("Item2")

'존재하지 않는 값에 대한 Index를 가져옵니다 – -1을 반환합니다
MsgBox MyList.IndexOf("Item", 0)

'검색을 시작할 위치를 0으로 지정합니다
Sp = 0

'Item1의 모든 위치를 반복문을 통해 찾습니다
Do
     'Sp 값을 검색을 시작할 위치로 두고 'Item1'을 검색합니다
    Pos = MyList.IndexOf("Item1", Sp)
   ' 'Item1'이 더이상 검색되지 않을경우 반복문을 종료합니다
    If Pos = -1 Then Exit Do
   '발견된 항목과 인덱스 번호를 표시합니다
    MsgBox MyList(Pos) & " at index " & Pos
   '마지막으로 발견된 인덱스번호에서 1을 더합니다– 다음 검색에서 사용될 시작 위치입니다
    Sp = Pos + 1
Loop

End Sub

검색 텍스트는 대소문자를 구분하며 와일드카드는 사용할 수 없습니다.

항목 삽입 및 제거하기

항목을 목록 끝에 추가하고 싶지 않은 경우 특정 색인 위치에 항목을 삽입하여 새 항목이 목록 중간에 오도록 할 수 있습니다. 이후 항목에 대해 인덱스 번호가 자동으로 조정됩니다.

Sub InsertExample()
'ArrayList 객체를 생성합니다
Dim MyList As New ArrayList

'Add items to array list
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
MyList.Add "Item1"

'‘Item6’ 2번 Index에 삽입합니다
MyList.Insert 2, "Item6"

'ArrayList의 목록들을 반복해서 새로운 순서와 항목을 메시지박스에 표시합니다
For N = 0 To MyList.Count - 1
    MsgBox MyList(N) & " Index " & N
Next N

End Sub

이 예제에서는 ‘Item6’이 인덱스 위치 2의 목록에 추가되었으므로 인덱스 위치 2에 있던 ‘item3’이 이제 인덱스 위치 3으로 이동합니다.

개별 항목은 ‘Remove’ 메서드를 사용하여 제거할 수 있습니다.

MyList.Remove "Item"

항목 이름을 찾을 수 없는 경우에도 오류가 발생하지 않습니다. 제거한 항목 이후의 모든 인덱스 번호는 변경됩니다.

항목의 인덱스 위치를 알고 있는 경우 ‘RemoveAt’ 메서드를 사용할 수 있습니다. 다음 코드를 참조해 주세요.

MyList.RemoveAt 2

입력한 인덱스 위치가 ArrayList의 항목 수보다 크면 오류가 발생한다는 점에 유의하세요.

‘RemoveRange’ 메서드를 사용하여 목록에서 여러 값을 제거할 수 있습니다. 매개변수는 시작 인덱스와 제거할 항목의 수입니다. 다음 예제를 참조해 주세요.

MyList.RemoveRange 3, 2

시작 값에서 오프셋된 항목 수가 배열 목록의 항목 수보다 많으면 코드에 오류가 발생합니다.

‘RemoveAt’ 및 ‘RemoveRange’ 메서드를 사용할때 오류 가능성을 차단하기 위해 지정된 인덱스 번호가 ArrayList의 총 항목 수보다 큰지 확인하는 것이 좋습니다. ‘Count’ 속성은 배열 목록의 총 항목 수를 제공합니다.

Sub RemoveExample()
'ArrayList객체를 생성합니다
Dim MyList As New ArrayList
'항목을 ArrayList에 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
MyList.Add "Item1"
MyList.Add "Item4"
MyList.Add "Item5"
'‘Item6’ 를 2번 인덱스 위치에 추가합니다
MyList.Insert 2, "Item6"
'‘Item2’를 삭제합니다
MyList.Remove "Item2"
'‘Item’을 삭제합니다 – ArrayList에 없는 항목이지만 오류가 발생하지 않습니다
MyList.Remove "Item"
'인덱스 2번 위치에 있는 항목을 제거합니다
MyList.RemoveAt 2
'인덱스 2번부터 2개의 연속된 항목을 제거합니다
MyList.RemoveRange 3, 2
'ArryaList를 반복하여 어떤 항목이 남았고 인덱스 번호는 어떻게 변했는지 메시지박스에 표시합니다
For N = 0 To MyList.Count - 1
    MsgBox MyList(N) & " Index " & N
Next N
End Sub

특정 위치에서 항목을 제거하기 위해 ‘RemoveAt’을 사용하여 해당 항목을 제거할 경우 제거한 항목 이후의 모든 항목의 위치가 변경됩니다. 인덱스 위치를 사용하여 여러 항목을 제거하는 경우 가장 높은 인덱스 번호부터 시작하여 0번 위치까지 거꾸로 내려가면 항상 올바른 항목을 제거할 수 있습니다. 이렇게 하면 변경되는 인덱스 번호로 인한 문제가 발생하지 않습니다.

 

ArrayList 정렬하기

Collection과 대비되는 또 다른 큰 장점은 항목을 오름차순 또는 내림차순으로 정렬할 수 있다는 것입니다.

ArrayList 객체는 Excel VBA에서 정렬 메서드가있는 유일한 개체입니다. 정렬 메서드는 매우 빠르므로 ArrayList를 사용할 때 중요한 고려 사항이 될 수 있습니다.

Collection 객체에서는 모든 항목을 정렬하기 위해 창의적인 사고가 필요했지만 ArrayList를 사용하면 매우 간단합니다.

The ‘Sort’ method sorts in ascending order, and the ‘Reverse’ method sorts in descending order.

Sub ArrayListExample()
'ArrayList 객체를 생성합니다
Dim MyList As New ArrayList
'항목들을 정렬이 안된 상태로 추가합니다
MyList.Add "Item1"
MyList.Add "Item3"
MyList.Add "Item2"
'항목을 오름차순으로 정렬합니다
MyList.Sort
'오름차순으로 정렬되었는지 확인하기 위해 항목들을 반복하여 메시지박스에 표출합니다
For Each I In MyList
    '항목 이름을 표시합니다
    MsgBox I
Next I
'항목들을 내림차순으로 정렬합니다
MyList.Reverse
'항목들을 반복하여 내림차순으로 정렬되었는지 확인합니다
For Each I In MyList
    '항목 이름을 표시합니다
    MsgBox I
Next I
End Sub

ArrayList 복제하기

배열 목록에는 자체 복제 또는 복사본을 생성하는 기능이 있습니다. 이 기능은 사용자가 VBA 코드를 사용하여 항목을 변경했지만 백업으로 원래 상태의 항목 사본을 유지해야 하는 경우에 유용합니다.

이렇게 하면 사용자에게 ‘실행 취소’ 기능을 제공할 수 있습니다. 사용자가 변경을 수행한 후 원래 목록으로 되돌리고 싶을 경우 유용합니다.

Sub CloneExample()
'두 객체를 정의합니다– ArrayList와 Object
Dim MyList As New ArrayList, MyList1 As Object
'ArrayList에 항목을 채워넣습니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
'MyList를 MyList1으로 복사합니다
Set MyList1 = MyList.Clone
'MyList1을 반복하여 복제가 성공적으로 되었는지 확인합니다
For Each I In MyList1
    '항목 이름을 표시합니다
    MsgBox I
Next I
End Sub

이제 ‘MyList1’에는 ‘MyList’의 모든 항목이 동일한 순서로 포함됩니다.

 

ArrayList를 일반 VBA 배열 객체로 복사하기

간단한 메서드를 사용하여 배열 목록을 일반 VBA 배열로 복사할 수 있습니다:

Sub ArrayExample()
'ArrayList 객체와 일반 배열 객체를 생성합니다
Dim MyList As New ArrayList, NewArray As Variant
'ArrayList에 항목을 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
'ArrayList를 배열 객체로 복사합니다
NewArray = MyList.ToArray
'배열 객체를 반복합니다 – ArrayList의 Count메서드는 최대 인덱스 번호를 반환한다는 점을 참고해주세요
For N = 0 To MyList.Count – 1
    '항목 이름을 표시합니다
    MsgBox NewArray(N)
Next N
End Sub

ArrayList를 워크시트 범위로 복사하기

배열 목록을 반복할 필요 없이 배열 목록을 특정 워크시트 및 셀 참조로 복사할 수 있습니다. 첫 번째 셀 참조만 지정하면 됩니다.

Sub RangeExample()
'ArrayList 객체를 생성합니다
Dim MyList As New ArrayList
'ArrayList에 항목을 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
'붙여넣을 시트의 모든 내용을 삭제합니다
Sheets("Sheet1").UsedRange.Clear
'항목들을 한 열에 붙여넣습니다
Sheets("Sheet1").Range("A1").Resize(1, MyList.Count).Value = MyList.toArray
'항목들을 한 행에 붙여넣습니다
Sheets("Sheet1").Range("A5").Resize(MyList.Count, 1).Value =  _
WorksheetFunction.Transpose(MyList.toArray)
End Sub

ArrayList에서 모든 항목 삭제하기

ArrayList를 완전히 지우는 간단한 함수(Clear)가 있습니다.

Sub ClearListExample()
'ArrayList 객체를 생성합니다
Dim MyList As New ArrayList
'새로운 항목을 추가합니다
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
'항목의 개수를 표시합니다
MsgBox MyList.Count
'모든 항목을 삭제합니다
MyList.Clear
'항목이 삭제되었는지 확인하기 위해 현재 항목의 개수를 표시합니다
MsgBox MyList.Count
End Sub

이 예제는 배열 목록에 항목을 생성한 다음 배열 목록을 지웁니다. 메시지 상자는 배열 목록의 항목 수 전후를 보여주고 이는 삭제되었음을 증명합니다.

Excel VBA의 ArrayList 메서드 요약

작업 매개변수 예제
항목 추가 MyList.Add “Item1”
MyList(4)= “Item2”
ArrayList 복제 없음 Dim MyList As Object
Set MyList2 = MyList.Clone
일반 배열로 복제 없음 Dim MyArray As Variant
MyArray = MyList.ToArray
워크시트 한 열에 붙여넣기 없음 Sheets(“Sheet1”).Range(“A1”).Resize(1, MyList.Count).Value = MyList.ToArray
워크시트 한 행에 붙여넣기 없음 Sheets(“Sheet1”).Range(“A3”).Resize(MyList.Count, 1).Value = WorksheetFunction.Transpose(MyList.ToArray)
생성하기 “System.Collections.ArrayList” Dim MyList As Object
Set MyList = CreateObject(“System.Collections.ArrayList”)
선언하기 없음 Dim MyList As Object
항목이 존재하는지 확인하기 검색할 항목 이름 MyList.Contains(“Item2”)
ArrayList의 항목의 위치 찾기 1. 검색할 항목. Dim IndexNo As Long
2. 검색을 시작할 인덱스 번호.  IndexNo = MyList.IndexOf(“Item3”, 0)
IndexNo = MyList.IndexOf(“Item5”, 3)
항목의 개수 확인하기 없음 MsgBox MyList.Count
항목 삽입하기 1. 인덱스번호 – 삽입할 위치. MyList.Insert 0, “Item5”
2 값 – 삽입할 값이나 객체. MyList.Insert 4, “Item7”
항목 읽기 인덱스 번호  – 정수 MsgBox MyList.Item(0)
MsgBox MyList.Item(4)
마지막에 추가된 항목 읽기 인덱스 번호  – 정수 MsgBox MyList.Item(list.Count – 1)
첫번째 항목 읽기 인덱스 번호  – 정수 MsgBox MyList.Item(0)
모든 항목 읽기(For Each 반복문) 없음 Dim element As Variant
For Each element In MyList
   MsgBox element
Next element
모든 항목 읽기(For 반복문) 인덱스 번호  – 정수 Dim i As Long
For i = 0 To MyList.Count – 1
   MsgBox i
Next i
모든 항목 제거하기 없음 MyList.Clear
특정 위치의 항목 제거하기 항목이 위치한 인덱스 번호 MyList.RemoveAt 5
항목 이름으로 항목 제거하기 ArrayList에서 제거할 항목이름 MyList.Remove “Item3”
인덱스 범위로 여러 항목 제거하기 1. 인덱스 번호 –  시작 위치. MyList.RemoveRange 4,3
2. 개수 – 삭제할 항목 개수
내림차순으로 정렬하기 없음 MyList.Reverse
오름차순으로 정렬하기 없음 MyList.Sort

 

vba-free-addin

VBA 코드 예시 추가 기능

본 웹사이트에 있는 모든 코드 예시에 쉽게 접근해보세요.

메뉴로 이동하여 클릭만 하면 코드는 모듈에 바로 입력됩니다. .xlam 추가 기능.

(설치가 필요 없습니다!)

무료 다운로드

VBA 코드 예시로 돌아가기