본문 바로가기
언어 참조

배열 선언 및 사용

2023. 8. 1.

이 글은 도움말을 번역한 글입니다.

배열(配列) : 『정보·통신』 동일한 성격의 데이터를 관리하기 쉽도록 하나로 묶는 일

배열 선언

배열은 다른 변수와 동일한 방식으로 Dim, Static, Private 또는 Public 문을 사용하여 선언합니다. 스칼라 변수(배열이 아닌 변수)와 배열 변수의 차이점은 일반적으로 배열의 크기를 지정해야 한다는 점입니다. 크기가 지정된 배열은 고정 크기 배열입니다. 프로그램이 실행되는 동안 크기를 변경할 수 있는 배열은 동적 배열입니다.

배열의 인덱스가 0에서 시작되는지 1에서 시작되는지는 Option Base 문의 설정에 따라 다릅니다. 옵션 베이스 1을 지정하지 않으면 모든 배열 인덱스는 0에서 시작합니다.

고정 배열 선언하기

다음 코드 행에서 고정 크기 배열은 11개의 행과 11개의 열이 있는 정수 배열로 선언됩니다.

Dim MyArray(10, 10) As Integer

첫 번째 인수는 행을 나타내고, 두 번째 인수는 열을 나타냅니다.

다른 변수 선언과 마찬가지로 배열에 대한 데이터 유형을 지정하지 않는 한 선언된 배열에 있는 요소의 데이터 유형은 Variant 입니다 . 배열의 각 숫자 Variant 요소는 16바이트를 사용합니다. 각 문자열 Variant 요소는 22바이트를 사용합니다. 가능한 한 간결한 코드를 작성하려면 배열이 Variant 이외의 데이터 유형이 되도록 명시적으로 선언하십시오 .

다음 코드 라인은 여러 배열의 크기를 비교합니다.

' Integer array uses 22 bytes (11 elements * 2 bytes). 
ReDim MyIntegerArray(10) As Integer 
 
' Double-precision array uses 88 bytes (11 elements * 8 bytes). 
ReDim MyDoubleArray(10) As Double 
 
' Variant array uses at least 176 bytes (11 elements * 16 bytes). 
ReDim MyVariantArray(10) 
 
' Integer array uses 100 * 100 * 2 bytes (20,000 bytes). 
ReDim MyIntegerArray (99, 99) As Integer 
 
' Double-precision array uses 100 * 100 * 8 bytes (80,000 bytes). 
ReDim MyDoubleArray (99, 99) As Double 
 
' Variant array uses at least 160,000 bytes (100 * 100 * 16 bytes). 
ReDim MyVariantArray(99, 99)

배열의 최대 크기는 운영 체제와 사용 가능한 메모리의 양에 따라 달라집니다. 시스템에서 사용 가능한 RAM 용량을 초과하는 배열을 사용하면 데이터를 디스크에서 읽고 디스크에 써야 하므로 속도가 느려집니다.

동적 배열 선언하기

동적 배열을 선언하면 코드가 실행되는 동안 배열의 크기를 조정할 수 있습니다. 다음 예제와 같이 괄호를 비워둔 채 Static, Dim, Private 또는 Public 문을 사용하여 배열을 선언합니다.

Dim sngArray() As Single

Note

프로시저 내에서 암시적으로 배열을 선언하려면 ReDim 문을 사용합니다. ReDim 문을 사용할 때 배열 이름의 철자가 틀리지 않도록 주의하세요. Option Explicit 문이 모듈에 포함되어 있더라도 두 번째 배열이 생성됩니다.

배열 범위 내의 프로시저에서 ReDim 문을 사용하여 차원 수를 변경하고, 요소 수를 정의하고, 각 차원의 상한 및 하한을 정의할 수 있습니다. ReDim 문을 사용하여 동적 배열을 필요한 만큼 자주 변경할 수 있습니다. 그러나 이 작업을 수행할 때마다 배열의 기존 값이 손실됩니다. 배열의 기존 값을 유지하면서 배열을 확장하려면 ReDim Preserve를 사용합니다.

ReDim Preserve varArray(UBound(varArray) + 10)

동적 배열에서 Preserve 키워드를 사용하면 마지막 차원의 상한을 변경할 수 있지만 차원의 개수는 변경할 수 없습니다.

도움말 출처

Declaring arrays (VBA)

Office VBA reference topic

learn.microsoft.com

배열 사용

배열은 동일한 데이터 유형의 값들을 다루기 위해 사용하는 것으로, 하나의 변수에 여러 개의 구획(compartment)이 있어 값을 저장할 수 있습니다. 일반적인 변수는 하나의 저장 구획에 단 하나의 값만을 저장할 수 있지만, 배열은 많은 값을 저장할 수 있습니다. 배열 전체를 가리키고자 할 때는 배열 자체를 참조하면 되며, 또는 각각의 개별 요소를 가리키고자 할 때는 개별 요소들을 참조할 수 있습니다.

예를 들어 연중 각 날짜의 일일 비용을 저장하려면 365개의 변수를 선언하는 대신 365개의 요소로 구성된 하나의 배열 변수를 선언하면 됩니다. 배열의 각 요소에는 하나의 값이 포함됩니다. 다음 문은 365개의 요소로 배열 변수를 선언합니다. 기본적으로 배열은 0부터 인덱싱되므로 배열의 상한은 365가 아니라 364입니다.

Dim curExpense(364) As Currency

개별 요소의 값을 설정하려면 요소의 인덱스를 지정합니다. 다음 예제에서는 배열의 각 요소에 초기 값 20을 할당합니다.

Sub FillArray() 
 Dim curExpense(364) As Currency 
 Dim intI As Integer 
 For intI = 0 to 364 
 curExpense(intI) = 20 
 Next 
End Sub

예제 코드

Sub ArrayExample()
    ' 배열 선언 및 값 할당
    Dim shoppingListPrices(1 To 5) As Double
    shoppingListPrices(1) = 10.5
    shoppingListPrices(2) = 15.3
    shoppingListPrices(3) = 8.9
    shoppingListPrices(4) = 12#
    shoppingListPrices(5) = 22.2

    ' 배열 전체를 참조하고 출력
    Dim i As Long
    Debug.Print "배열 전체 요소 출력:"
    For i = LBound(shoppingListPrices) To UBound(shoppingListPrices)
        Debug.Print shoppingListPrices(i)
    Next i

    ' 개별 요소 참조하여 합을 구하고 출력
    Dim totalPrice As Double
    totalPrice = shoppingListPrices(1) + shoppingListPrices(2)
    Debug.Print "첫 번째와 두 번째 요소의 합:"
    Debug.Print totalPrice
End Sub

하한 변경하기

Option Base 문

배열 첨자에 대한 기본 하한을 선언하기 위해 모듈 수준에서 사용됩니다.

Syntax
Option Base { 0 | 1 }

비고
기본 기준은 0이므로 Option Base 문은 필요하지 않습니다. 사용되는 경우 명령문은 모듈에서 절차 전에 나타나야 합니다. Option Base는 모듈에서 한 번만 나타날 수 있으며 차원을 포함하는 배열 선언 앞에 있어야 합니다.

Option Explicit

Option Base 1 ' 배열의 기본 하한을 1로 설정

Sub ArrayExample()
    Dim i As Integer
    Dim myArray(5) As Integer ' 1부터 5까지의 1차원 배열을 선언

    For i = 1 To 5 ' 1부터 5까지 반복
        myArray(i) = i * 10 ' 각 요소에 10을 곱하여 값을 할당
    Next i

    For i = 1 To 5 ' 1부터 5까지 반복
        Debug.Print "myArray(" & i & ") = " & myArray(i) ' 각 요소의 값을 출력
    Next i
End Sub

Note

Dim, Private, Public, ReDim 및 Static 문의 To 절은 배열의 첨자 범위를 보다 유연하게 제어할 수 있는 방법을 제공합니다. 그러나 To 절로 하한을 명시적으로 설정하지 않은 경우 Option Base를 사용하여 기본 하한을 1로 변경할 수 있습니다. ParamArray 키워드로 생성된 배열의 기본값은 0이며, Option Base는 ParamArray(또는 해당 유형 라이브러리 이름으로 한정된 경우, 예: VBA.Array)에 영향을 미치지 않습니다.

Option Explicit

Option Base 1 ' 배열의 기본 하한을 1로 설정

Sub ArrayExample()
    ' 정적 배열 선언 (기본 하한: 1)
    Dim myArray(1 To 5) As Integer

    ' 동적 배열 선언 (기본 하한: 1)
    Dim dynamicArray() As Integer
    ReDim dynamicArray(1 To 3)

    ' ParamArray를 사용한 배열 (기본값: 0)
    Call SumValues(10, 20, 30, 40) ' SumValues 함수에서 ParamArray로 받은 배열의 기본값은 0이 됨
End Sub

Sub SumValues(ParamArray values() As Variant)
Dim i As Integer
    Dim sum As Integer
    For i = LBound(values) To UBound(values)
        sum = sum + values(i)
    Next i
    Debug.Print "Sum: " & sum
End Sub

Option Base 문은 해당 문이 위치한 모듈의 배열 하한에만 영향을 줍니다.

도움말 출처

Option Base statement (VBA)

Office VBA reference topic

learn.microsoft.com

Variant값을 배열에 저장

Variant 값의 배열을 만드는 방법에는 여러 가지가 있습니다

1. 정적 배열 선언 및 초기화

Dim varData(1 To 3) As Variant
varData(1) = "Value1"
varData(2) = 42
varData(3) = True

2. 동적 배열 선언 및 초기화

Dim varData() As Variant
ReDim varData(1 To 3)
varData(1) = "Value1"
varData(2) = 42
varData(3) = True

3. Array 함수 사용하기

Dim varData() As Variant
varData = Array("Value1", 42, True, "AnotherValue", 100)

4. 워크시트의 값을 배열에 저장하기

Dim varData() As Variant
varData = Range("A1:A5").Value ' 엑셀의 특정 범위 값을 배열에 저장
' 배열 요소들이 A1부터 A5의 값으로 설정됩니다.

배열을 만드는 데 어떤 기술을 사용하든 인덱스를 기준으로 Variant 값 배열의 요소를 식별할 수 있습니다. 예를 들어, 앞의 예제 중 하나에 다음 문을 추가할 수 있습니다.

MsgBox "Data for " & varData(0) & " has been recorded."

다차원 배열 사용

Visual Basic에서는 최대 60차원의 배열을 선언할 수 있습니다. 예를 들어 다음 명령문은 2차원 5x10 배열을 선언합니다.

Dim sngMulti(1 To 5, 1 To 10) As Single

배열을 행렬로 생각하면 첫 번째 인수는 행을 나타내고 두 번째 인수는 열을 나타냅니다.

다차원 배열을 처리하려면 중첩된 For...Next 문을 사용합니다. 다음 프로시저는 2차원 배열을 단일 값으로 채웁니다.

Sub FillArrayMulti()
    Dim intI As Integer, intJ As Integer
    Dim sngMulti(1 To 5, 1 To 10) As Single
 
    ' Fill array with values.
    For intI = 1 To 5
        For intJ = 1 To 10
            sngMulti(intI, intJ) = intI * intJ
            Debug.Print sngMulti(intI, intJ)
        Next intJ
    Next intI
End Sub

도움말 출처

Using arrays (VBA)

Office VBA reference topic

learn.microsoft.com

배열과 관련된 구문

Erase 문

고정 크기 배열의 요소를 다시 초기화하고 동적 배열의 저장 공간을 해제합니다.

Syntax
Erase arraylist

arraylist : 필수입니다.지워질 하나 이상의 쉼표로 구분된 배열 변수입니다.

Erase는 배열이 고정 크기(일반)인지 동적인지에 따라 다르게 작동합니다. 고정 크기 배열의 경우 지우기는 메모리를 복구하지 않습니다. Erase는 고정 배열의 요소를 다음과 같이 설정합니다.

Erase는 동적 배열에서 사용하는 메모리를 해제합니다. 프로그램에서 동적 배열을 다시 참조하려면 ReDim 문을 사용하여 배열 변수의 차원을 다시 선언해야 합니다.

예제 코드 - 1 (고정 숫자 배열)

Sub FixedNumericArrayExample()
    ' 고정 크기의 숫자 배열 선언과 초기화
    Dim i As Integer
    Dim numArray(1 To 5) As Integer
    
    numArray(1) = 10
    numArray(2) = 15
    numArray(3) = 30
    numArray(4) = 40
    
    ' 배열의 값 출력 (초기값 확인)
    Debug.Print "초기 값:"
    For i = 1 To 5
        Debug.Print "numArray(" & i & ") = " & numArray(i)
    Next i
    
    ' 배열 초기화
    Erase numArray
    
    ' 구분선 출력
    Debug.Print "----------------"
    
    ' 배열의 값 출력 (모두 0으로 초기화됨을 확인)
    Debug.Print "초기화 후:"
    For i = 1 To 5
        Debug.Print "numArray(" & i & ") = " & numArray(i)
    Next i
End Sub

예제 코드 - 2 (고정 문자열 배열 (가변 길이))

Sub FixedStringArrayVariableLengthExample()
    ' 고정 크기의 문자열 배열 (가변 길이) 선언과 초기화
    Dim i As Long
    Dim strArray(1 To 3) As String
    
    strArray(1) = "Excel"
    strArray(2) = "VBA"
    strArray(3) = "Programming"
    
    ' 배열의 값 출력 (초기값 확인)
    Debug.Print "초기 값:"
    For i = LBound(strArray) To UBound(strArray)
        Debug.Print "strArray(" & i & ") = " & strArray(i)
    Next i
    
    ' 배열 초기화
    Erase strArray
    
    ' 구분선 출력
    Debug.Print "---------------------------"
    
    ' 배열의 값 출력 (모두 빈 문자열로 초기화됨을 확인)
    Debug.Print "초기화 후:"
    For i = LBound(strArray) To UBound(strArray)
        Debug.Print "strArray(" & i & ") = " & strArray(i)
    Next i
End Sub

예제 코드 - 3 ( 고정 문자열 배열 (고정 길이) )

Sub FixedStringArrayFixedLengthExample()
    ' 고정 크기의 문자열 배열 (고정 길이) 선언과 초기화
    Dim i As Integer
    Dim fixedStrArray(1 To 3) As String * 10
    
    fixedStrArray(1) = "Hello"
    fixedStrArray(2) = "World"
    fixedStrArray(3) = "VBA"
    
    ' 배열의 값 출력 (초기값 확인)
    Debug.Print "초기 값:"
    For i = LBound(fixedStrArray) To UBound(fixedStrArray)
        Debug.Print "fixedStrArray(" & i & ") = " & fixedStrArray(i)
    Next i
    
    ' 배열 초기화
    Erase fixedStrArray
    
    ' 구분선 출력
    Debug.Print "------------------------"
    
    ' 배열의 값 출력 (모두 Null 문자열로 초기화됨을 확인)
    Debug.Print "초기화 후:"
    For i = LBound(fixedStrArray) To UBound(fixedStrArray)
        Debug.Print "fixedStrArray(" & i & ") = " & fixedStrArray(i)
    Next i
End Sub

위 그림에서 이상한 문자처럼 보이는 것은 아래 그림에서 보듯이 아스키코드 0인 Null을 의미합니다.

예제 코드 - 4 ( 고정 Variant 배열 )

Sub FixedVariantArrayExample()
    ' 크기가 5인 고정된 Variant 배열 선언
    Dim fixedArray(1 To 5) As Variant
    
    ' 배열 초기화
    fixedArray(1) = "Apple"
    fixedArray(2) = "Banana"
    fixedArray(3) = "Orange"
    fixedArray(4) = "Grapes"
    fixedArray(5) = "Mango"
    
    ' 배열 요소 출력
    Dim i As Integer
    For i = 1 To 5
        Debug.Print "fixedArray(" & i & ") = " & fixedArray(i)
    Next i
    
    ' 배열을 Erase를 사용하여 초기화
    Erase fixedArray
    
    ' 초기화 후 배열 요소 출력 (값이 비어있음)
    For i = 1 To 5
        Debug.Print "fixedArray(" & i & ") = " & fixedArray(i)
    Next i
End Sub

예제 코드 - 5 (사용자 정의 형식의 배열)

' 사용자 정의 형식 정의
Type Person
    Name As String
    Age As Integer
    Email As String
    BirthDate As Date
    Salary As Currency
End Type

Sub UDTArrayExample()
    ' 크기가 3인 Person 형식의 배열 선언
    Dim personArray(1 To 3) As Person
    
    ' 배열 요소 초기화
    personArray(1).Name = "John"
    personArray(1).Age = 30
    personArray(1).Email = "john@example.com"
    personArray(1).BirthDate = #8/15/1991#
    personArray(1).Salary = 55000
    
    personArray(2).Name = "Jane"
    personArray(2).Age = 28
    personArray(2).Email = "jane@example.com"
    personArray(2).BirthDate = #5/10/1993#
    personArray(2).Salary = 60000
    
    personArray(3).Name = "Mike"
    personArray(3).Age = 35
    personArray(3).Email = "mike@example.com"
    personArray(3).BirthDate = #11/30/1988#
    personArray(3).Salary = 50000
    
    ' 배열 요소 출력
    Dim i As Integer
    For i = LBound(personArray) To UBound(personArray)
        Debug.Print "Person " & i & ":"
        Debug.Print "Name: " & personArray(i).Name
        Debug.Print "Age: " & personArray(i).Age
        Debug.Print "Email: " & personArray(i).Email
        Debug.Print "Birth Date: " & personArray(i).BirthDate
        Debug.Print "Salary: " & personArray(i).Salary
        Debug.Print "-----------------"
    Next i
    
    ' 배열을 Erase를 사용하여 초기화
    Erase personArray
    
    ' 초기화 후 배열 요소 출력 (값이 비어있음)
    For i = LBound(personArray) To UBound(personArray)
        Debug.Print "Person " & i & ":"
        Debug.Print "Name: " & personArray(i).Name
        Debug.Print "Age: " & personArray(i).Age
        Debug.Print "Email: " & personArray(i).Email
        Debug.Print "Birth Date: " & personArray(i).BirthDate
        Debug.Print "Salary: " & personArray(i).Salary
        Debug.Print "-----------------"
    Next i
End Sub

예제 코드 - 6 (개체 배열)

Sub MixedObjectArrayExample()
    ' Object 데이터 유형의 배열 선언
    Dim objArray(1 To 3) As Object

    ' 배열 요소 초기화 (다른 유형의 개체 포함)
    Set objArray(1) = CreateObject("Scripting.Dictionary")
    Set objArray(2) = CreateObject("ADODB.Connection")
    Set objArray(3) = CreateObject("ADODB.Recordset")

    ' 배열 요소 출력
    Dim i As Integer
    For i = 1 To 3
        Debug.Print "objArray(" & i & ") TypeName: " & TypeName(objArray(i))
    Next i

    ' 배열을 Erase를 사용하여 초기화
    Erase objArray

    ' 초기화 후 배열 요소 출력 (값이 비어있음)
    For i = 1 To 3
        Debug.Print "objArray(" & i & ") TypeName: " & TypeName(objArray(i))
    Next i
End Sub

ReDim 문

프로시저 수준에서 동적 배열 변수에 대한 저장 공간을 재할당하는 데 사용됩니다.

Syntax
ReDim [ Preserve ] varname ( subscripts ) [ As type ], [ varname ( subscripts ) [ As type ]] . . .

Preserve : 선택 사항입니다. 마지막 차원의 크기를 변경할 때 기존 배열의 데이터를 보존하는 데 사용되는 키워드입니다.

varname : 필수 항목입니다. 변수명; 표준 변수 명명 규칙을 따릅니다.subscripts : 필수 항목입니다. 배열 변수의 차원; 최대 60개의 다중 차원이 선언될 수 있습니다. "subscripts" 인수는 다음과 같은 구문을 사용합니다:.

[lower To] upper [ , [lower To] upper ] . . .

lower가 명시적으로 지정되지 않은 경우, 배열의 하한(하한값)은 Option Base 문으로 제어됩니다. Option Base 문이 없는 경우 하한(하한값)은 0입니다.
type : 선택사항입니다. 변수의 데이터 유형입니다. Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (현재 지원되지 않음), Date, String (가변 길이 문자열용), String 길이 (고정 길이 문자열용), Object, Variant, 사용자 정의 유형 또는 개체 유형일 수 있습니다.

정의되는 각 변수에 대해 별도의 As type 절을 사용합니다.

Sub MultipleArraysRedim()
    Dim numbers() As Integer, fruits() As String
    Dim i As Integer

    ' numbers와 fruits라는 두 개의 배열에 둘 다 크기를 할당합니다.
    ReDim numbers(0 To 4) As Integer, fruits(0 To 2) As String

    ' 배열 numbers에 정수 값을 할당합니다.
    For i = 0 To 4
        numbers(i) = i + 1
    Next i

    ' 배열 fruits에 문자열 값을 할당합니다.
    fruits(0) = "apple"
    fruits(1) = "banana"
    fruits(2) = "cherry"

    ' 배열 numbers를 출력합니다.
    Debug.Print "Numbers Array:"
    For i = 0 To UBound(numbers)
        Debug.Print numbers(i);
    Next i
    
    ' 배열 fruits를 출력합니다.
    Debug.Print vbCrLf & "Fruits Array:"
    For i = 0 To UBound(fruits)
        Debug.Print fruits(i);
    Next i
End Sub

배열을 포함하는 Variant의 경우 type은 배열의 각 요소 유형을 설명하지만 Variant를 다른 유형으로 변경하지는 않습니다.

Sub VariantArrayWithElementType()
    Dim myArray As Variant
    Dim i As Integer

    ' myArray는 Variant 타입입니다.

    ' ReDim 문에서 As type 절을 사용하여 배열 요소의 타입을 Integer로 지정합니다.
    ReDim myArray(1 To 5) As Integer

    ' 배열 내 각 요소에 정수 값을 할당합니다.
    For i = 1 To 5
        myArray(i) = i * 10
    Next i

    ' 배열의 값을 출력합니다.
    For i = 1 To 5
        Debug.Print myArray(i)
    Next i

    ' 변수의 타입을 확인하고 출력합니다.
    Debug.Print TypeName(myArray) ' 출력 결과: Integer()
    
    ' ReDim 문으로 배열 요소의 타입을 String으로 변경합니다.
    ReDim myArray(1 To 5) As String

    ' 배열 내 각 요소에 문자열 값을 할당합니다.
    For i = 1 To 5
        myArray(i) = "String" & (i * 10)
    Next i

    ' 새로운 요소의 타입을 갖는 배열 값을 출력합니다.
    For i = 1 To 5
        Debug.Print myArray(i)
    Next i

    ' 변수의 타입을 확인하고 출력합니다.
    Debug.Print TypeName(myArray) ' 출력 결과: String()

End Sub

비고
ReDim 문은 빈 괄호(차원 첨자 없음)로 Private, Public 또는 Dim 문을 통해 공식적으로 선언된 동적 배열의 크기를 조정하거나 변경하는 데 사용됩니다.

Sub Example()
    Dim i As Integer
    Dim myArray() As Integer ' Integer 형식의 동적 배열 선언
    
    ' 배열 크기 초기화
    ReDim myArray(2) ' 0부터 2까지 3개의 요소를 가진 배열로 크기 조정
    
    ' 배열에 값 할당
    myArray(0) = 10
    myArray(1) = 20
    myArray(2) = 30
    
    ' 배열 출력
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

ReDim 문을 여러 번 사용하여 배열의 요소 및 차원 수를 변경할 수 있습니다.

Sub Example()
    Dim i As Integer
    Dim j As Integer
    Dim myArray() As Integer ' Integer 형식의 동적 배열 선언
    
    ' 배열 크기 초기화
    ReDim myArray(2) ' 0부터 2까지 3개의 요소를 가진 배열로 크기 조정
    
    ' 배열에 값 할당
    myArray(0) = 10
    myArray(1) = 20
    myArray(2) = 30
    
    ' 배열 크기 변경
    ReDim Preserve myArray(4) ' 0부터 4까지 5개의 요소를 가진 배열로 크기 조정하며, 기존 데이터 보존
    
    ' 추가된 배열 요소에 값 할당
    myArray(3) = 40
    myArray(4) = 50
    
    ' 배열 출력
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
    
    ' 배열 크기 다시 변경
    ReDim myArray(1, 3) ' 2차원 배열로 크기 조정 (0부터 1까지 행, 0부터 3까지 열)
    
    ' 2차원 배열에 값 할당
    myArray(0, 0) = 1
    myArray(0, 1) = 2
    myArray(0, 2) = 3
    myArray(0, 3) = 4
    myArray(1, 0) = 5
    myArray(1, 1) = 6
    myArray(1, 2) = 7
    myArray(1, 3) = 8
    
    ' 2차원 배열 출력
    For i = 0 To 1
        For j = 0 To 3
            Debug.Print myArray(i, j)
        Next j
    Next i
End Sub

그러나 배열이 Variant에 포함되어 있지 않은 경우, 한 데이터 유형의 배열을 선언한 후에는 ReDim을 사용하여 배열을 다른 데이터 유형으로 변경할 수 없습니다.

Sub NonVariantArrayExample()
    Dim myArray() As Integer
    ReDim myArray(1 To 5)
    ' ...
    ' ReDim을 사용하여 데이터 유형을 변경하려고 시도할 경우 오류가 발생한다.
    ReDim myArray(1 To 5) As String
End Sub

배열이 Variant에 포함된 경우, As 유형 절을 사용하여 요소의 유형을 변경할 수 있습니다.

Sub VariantArrayExample()
    Dim myArray As Variant
    ReDim myArray(1 To 5) As Integer
    ' ...
    ' ReDim을 사용하여 데이터 유형을 변경한다. 이 경우 오류가 발생하지 않는다.
    ReDim myArray(1 To 5) As String ' 정상적으로 작동함
End Sub

단, Preserve 키워드를 사용하는 경우 데이터 유형 변경은 허용되지 않습니다.

Sub PreserveKeywordExample()
    Dim myArray As Variant
    ReDim myArray(1 To 5) As Integer
    ' ...
    ' Preserve 키워드를 사용하여 데이터 유형을 변경하려고 시도할 경우 오류가 발생한다.
    ReDim Preserve myArray(1 To 5) As String ' 오류 발생: 런타임 에러 '13', 타입 불일치
End Sub


Preserve 키워드를 사용하면 마지막 배열 차원만 크기를 조정할 수 있고 차원 수는 전혀 변경할 수 없습니다.

Sub PreserveKeywordErrorExample()
    Dim myArray() As Variant

    ' 2차원 배열을 정의합니다.
    ReDim myArray(1 To 3, 1 To 2)

    ' 마지막 차원외의 차원을 변경하려고 시도합니다.
    ReDim Preserve myArray(1 To 4, 1 To 2) ' 오류 발생: 런타임 에러 '9', 인덱스 범위를 벗어남

    ' 차원 수를 변경려고 시도합니다.
    ReDim Preserve myArray(1 To 2) ' 오류 발생: 런타임 에러 '9', 인덱스 범위를어남
End Sub

예를 들어 배열에 차원이 하나만 있는 경우 해당 차원은 마지막이자 유일한 차원이므로 크기를 조정할 수 있습니다. 그러나 배열에 2차원 이상이 있는 경우 마지막 차원의 크기만 변경할 수 있으며, 배열의 내용은 그대로 유지됩니다.

예제 코드 - 1

Sub OneDimensionalArrayExample()
    Dim oneDimArray() As Integer
    ReDim oneDimArray(1 To 3) ' 배열의 크기를 설정합니다.

    oneDimArray(1) = 10
    oneDimArray(2) = 20
    oneDimArray(3) = 30

    ' 출력 결과: 10 20 30
    Debug.Print oneDimArray(1) & " " & oneDimArray(2) & " " & oneDimArray(3)

    ReDim Preserve oneDimArray(1 To 6) ' 배열의 크기를 변경합니다.
    oneDimArray(4) = 40
    oneDimArray(5) = 50
    oneDimArray(6) = 60
    ' 출력 결과: 10 20 30 40 50 60
    Debug.Print oneDimArray(1) & " " & oneDimArray(2) & " " & oneDimArray(3) & " " & _
        oneDimArray(4) & " " & oneDimArray(5) & " " & oneDimArray(6)
End Sub

예제 코드 - 2

Sub Resize1DArray()
    Dim arr1D() As Integer ' 정수형 1차원 배열을 선언합니다.
    Dim newSize As Integer ' 새 배열 크기를 저장할 변수를 선언합니다.
    Dim i As Integer ' 반복문에 사용될 인덱스 변수를 선언합니다.
    
    ' 배열의 크기를 5로 설정합니다.
    ReDim arr1D(1 To 5)
    arr1D(1) = 1
    arr1D(2) = 2
    arr1D(3) = 3
    arr1D(4) = 4
    arr1D(5) = 5

    ' 출력 결과: 원래 배열 출력
    Debug.Print "Original Array:"
    For i = LBound(arr1D) To UBound(arr1D)
        Debug.Print arr1D(i);
    Next i

    ' newSize 변수에 설정하려는 새로운 크기값을 할당합니다.
    newSize = 8
    ' 배열 크기를 새로 설정하고 기존 값은 보존합니다.
    ReDim Preserve arr1D(1 To newSize)
    arr1D(6) = 6
    arr1D(7) = 7
    arr1D(8) = 8

    ' 출력 결과: 크기가 변경된 배열 출력
    Debug.Print vbCrLf & "Resized Array:"
    For i = LBound(arr1D) To UBound(arr1D)
        Debug.Print arr1D(i);
    Next i
End Sub

예제 코드 - 3

Sub TwoDimensionalArrayExample()
    Dim twoDimArray() As Integer
    ReDim twoDimArray(1 To 2, 1 To 3) ' 초기 2차원 배열의 크기를 설정합니다.

    ' 배열 값 할당
    twoDimArray(1, 1) = 11
    twoDimArray(1, 2) = 12
    twoDimArray(1, 3) = 13
    twoDimArray(2, 1) = 21
    twoDimArray(2, 2) = 22
    twoDimArray(2, 3) = 23

    ' 출력 결과: 11 12 13 21 22 23
    Debug.Print twoDimArray(1, 1) & " " & twoDimArray(1, 2) & " " & twoDimArray(1, 3) & " " & _
           twoDimArray(2, 1) & " " & twoDimArray(2, 2) & " " & twoDimArray(2, 3)

    ReDim Preserve twoDimArray(1 To 2, 1 To 5) ' 마지막 차원(2번째 차원)의 크기를 변경합니다.

    ' 추가된 새로운 열에 값 할당
    twoDimArray(1, 4) = 14
    twoDimArray(1, 5) = 15
    twoDimArray(2, 4) = 24
    twoDimArray(2, 4) = 25

    ' 출력 결과: 11 12 13 14 15 21 22 23 24 25
    Debug.Print twoDimArray(1, 1) & " " & twoDimArray(1, 2) & " " & twoDimArray(1, 3) & " " & twoDimArray(1, 4) & " " & twoDimArray(1, 5) & _
           twoDimArray(2, 1) & " " & twoDimArray(2, 2) & " " & twoDimArray(2, 3) & " " & twoDimArray(2, 4) & " " & twoDimArray(1, 5)
End Sub

예제 코드 - 4

Sub AddressBookExample()
    Dim AddressBook As Object
    Set AddressBook = CreateObject("Scripting.Dictionary")

    Dim Contact1() As String
    ReDim Contact1(1 To 2)
    Contact1(1) = "John Doe"
    Contact1(2) = "123-456-7890"
    AddressBook.Add "johndoe", Contact1

    Dim Contact2() As String
    ReDim Contact2(1 To 2)
    Contact2(1) = "Jane Smith"
    Contact2(2) = "987-654-3210"
    AddressBook.Add "janesmith", Contact2

    ' 다음과 같이 Dictionary 객체에 저장된 연락처를 조회할 수 있습니다.
    Debug.Print "John Doe's phone number is: " & AddressBook.Item("johndoe")(2)
    Debug.Print "Jane Smith's phone number is: " & AddressBook.Item("janesmith")(2)
    
    ' 배열의 크기를 변경하여 추가 정보를 저장할 수 있습니다.
    ReDim Preserve Contact1(1 To 3)
    Contact1(3) = "john@example.com"
    AddressBook("johndoe") = Contact1
    Debug.Print "John Doe's email is: " & AddressBook.Item("johndoe")(3)
End Sub

예제 코드 - 5

Sub FruitDataExample()
    Dim FruitData As Object
    Set FruitData = CreateObject("Scripting.Dictionary")

    ' 첫 번째 과일 정보(색깔과 가격)를 추가합니다.
    Dim AppleData() As Variant
    ReDim AppleData(1 To 2, 1 To 2)
    AppleData(1, 1) = "Red"
    AppleData(2, 1) = 1.5
    AppleData(1, 2) = "Green"
    AppleData(2, 2) = 1.2
    FruitData.Add "Apple", AppleData

    ' 두 번째 과일 정보(색깔과 가격)를 추가합니다.
    Dim BananaData() As Variant
    ReDim BananaData(1 To 2, 1 To 1)
    BananaData(1, 1) = "Yellow"
    BananaData(2, 1) = 0.8
    FruitData.Add "Banana", BananaData

    ' 과일 데이터를 검색합니다.
    Debug.Print "Apple colors: " & Join(Array(FruitData.Item("Apple")(1, 1), FruitData.Item("Apple")(1, 2)), ", ")
    Debug.Print "Banana color: " & FruitData.Item("Banana")(1, 1)

    Debug.Print "Red apple price: " & FruitData.Item("Apple")(2, 1) & " USD"
    Debug.Print "Green apple price: " & FruitData.Item("Apple")(2, 2) & " USD"
    Debug.Print "Yellow banana price: " & FruitData.Item("Banana")(2, 1) & " USD"
    
    ' 배열의 크기를 변경하여 추가 정보를 저장할 수 있습니다.
    ReDim Preserve AppleData(1 To 2, 1 To 3)
    AppleData(1, 3) = "Yellow"
    AppleData(2, 3) = 1.8
    FruitData("Apple") = AppleData
    Debug.Print "Updated apple colors: " & Join(Array(FruitData.Item("Apple")(1, 1), FruitData.Item("Apple")(1, 2), FruitData.Item("Apple")(1, 3)), ", ")
    Debug.Print "Yellow apple price: " & FruitData.Item("Apple")(2, 3) & " USD"
End Sub

예제 코드 - 6

Sub ListFilesInDirectory()
    Dim folderPath As String
    Dim fileName As String
    Dim fileList() As String
    Dim fileCount As Integer

    ' 폴더 경로를 설정합니다. 마지막에 역슬래시(\)를 포함해야 합니다.
    folderPath = "C:\ExampleFolder\"

    ' 파일들을 순회하며 카운트를 세고 배열을 만듭니다.
    fileName = Dir(folderPath & "*.*")
    fileCount = 0
    Do While fileName <> ""
        fileCount = fileCount + 1
        ReDim Preserve fileList(1 To fileCount)
        fileList(fileCount) = fileName
        fileName = Dir
    Loop
    
    If fileCount = 0 Then
        Debug.Print "No files found"
    Else
        ' 배열에 있는 파일 목록을 출력합니다.
        Dim i As Integer
        For i = 1 To fileCount
            Debug.Print fileList(i)
        Next i
    End If
End Sub


다음 예제에서는 기존 데이터를 유지하면서 동적 배열의 마지막 차원 크기를 늘리는 방법을 보여줍니다.

ReDim X(10, 10, 10) 
. . . 
ReDim Preserve X(10, 10, 15)

마찬가지로, Preserve를 사용할 때에는 배열의 크기를 변경하려면 상한값을 변경해야 합니다. 하한값을 변경하면 오류가 발생합니다.

Sub PreserveKeywordLowerBoundError()
    Dim myArray() As Variant
    Dim i As Integer

    ' 배열을 정의하고 값들을 할당합니다.
    ReDim myArray(1 To 5)
    For i = 1 To 5
        myArray(i) = i * 10
    Next i
    
    ' Preserve 키워드를 사용하여 상한값을 변경합니다. 정상 작동합니다.
    ReDim Preserve myArray(1 To 7)

    ' 하한값을 변경하는 경우 오류 발생합니다.
    On Error Resume Next ' 다음 줄에서 발생하는 오류를 무시합니다.
    ReDim Preserve myArray(0 To 7) ' 오류 발생
    If Err.Number <> 0 Then
        Debug.Print "Error: 변경된 하한값으로 인한 오류"
    End If
    On Error GoTo 0 ' 오류 처리를 다시 기본값으로 변경합니다.
    
End Sub

배열을 이전보다 작게 만들면 제거된 요소의 데이터가 손실됩니다.

Sub ArrayShrinkDataLoss()
    Dim myArray() As Variant
    Dim i As Integer

    ' 배열을 정의하고 값들을 할당합니다.
    ReDim myArray(1 To 5)
    For i = LBound(myArray) To UBound(myArray)
        myArray(i) = i * 10
    Next i

    ' 원본 배열의 값을 출력합니다.
    Debug.Print "Original array:"
    For i = 1 To 5
        Debug.Print myArray(i)
    Next i

    ' 배열을 작게 만들어 배열의 크기를 줄입니다.
    ReDim Preserve myArray(1 To 3)

    ' 변경된 배열의 값을 출력합니다.
    Debug.Print "Shrunk array:"
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

ReDim 문은 선언하는 변수가 모듈 수준 또는 프로시저 수준에 존재하지 않는 경우 선언문 역할을 합니다.

Sub ReDimAsDeclarationExample()
    ' 아래 ReDim 문으로 myArray 변수를 선언하고 배열의 크기를 정의합니다.
    ReDim myArray(1 To 5) As Integer
    Dim i As Integer

    ' 배열에 값을 할당합니다.
    For i = 1 To 5
        myArray(i) = i * 10
    Next i

    ' 배열의 내용을 출력합니다.
    For i = 1 To 5
        Debug.Print myArray(i)
    Next i
End Sub

나중에 같은 이름의 다른 변수가 만들어지면 더 넓은 범위에서도 ReDim은 이후 변수를 참조하며 Option Explicit가 적용되더라도 반드시 컴파일 오류를 발생시키지는 않습니다. 이러한 충돌을 방지하려면 ReDim을 선언문으로 사용하지 말고 배열의 크기를 다시 지정하는 데만 사용해야 합니다.

Note

Variant에 포함된 배열의 크기를 조정하려면 해당 배열의 크기를 조정하기 전에 Variant 변수를 명시적으로 선언해야 합니다.

Sub VariantArrayResize()
    Dim myArray As Variant ' Variant 변수를 명시적으로 선언

    myArray = Array(1, 2, 3) ' Variant에 배열을 할당

    ' ReDim을 사용하여 Variant에 포함된 배열의 크기를 변경
    ReDim Preserve myArray(0 To 4)

End Sub

도움말 출처

ReDim statement (VBA)

Office VBA reference topic

learn.microsoft.com

배열과 관련된 함수

LBound 함수

배열의 지정된 차원에 대해 사용 가능한 가장 작은 첨자를 포함하는 Long을 반환합니다.

Syntax
LBound(arrayname, [ dimension ])

arrayname : 배열 변수의 이름입니다. 표준 변수 명명 규칙을 따릅니다.
dimension : Variant (Long). 하한이 반환될 차원을 나타내는 정수입니다. 첫 번째 차원에 대해서는 1, 두 번째 차원에 대해서는 2와 같이 사용합니다. 만약 차원이 생략되면, 1로 가정됩니다.

Sub Example()
    ' 첫 번째 차원의 하한 인덱스 1과 두 번째 차원의 하한 인덱스 2를 가지는 배열을 생성합니다.
    Dim myArray(1 To 3, 2 To 4) As Integer

    ' 배열에 값을 할당합니다.
    Dim i As Integer, j As Integer
    For i = 1 To 3
        For j = 2 To 4
            myArray(i, j) = i * j
        Next j
    Next i

    ' 차원을 생략하고 LBound 함수를 사용하면 하한 인덱스 1로 가정합니다.
    Debug.Print "생략된 차원의 myArray 하한 인덱스: " & LBound(myArray) ' 출력값: 생략된 차원의 myArray 하한 인덱스: 1
    Debug.Print "1차원의 myArray 하한 인덱스: " & LBound(myArray, 1) ' 출력값: 1차원의 myArray 하한 인덱스: 1
    Debug.Print "2차원의 myArray 하한 인덱스: " & LBound(myArray, 2) ' 출력값: 2차원의 myArray 하한 인덱스: 2

    ' 배열의 값을 출력합니다.
    For i = 1 To 3
        For j = 2 To 4
            Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
        Next j
    Next i
End Sub

비고

LBound 함수는 UBound 함수와 함께 배열의 크기를 결정하는 데 사용됩니다. 배열 차원의 상한을 찾으려면 UBound 함수를 사용합니다.

LBound는 다음 차원의 배열에 대해 다음 표의 값을 반환합니다.

Sub Example()
    Dim A(1 To 3, 0 To 4, -3 To 3) As Integer
    Debug.Print LBound(A, 1) ' 출력값: 1
    Debug.Print LBound(A, 2) ' 출력값: 0
    Debug.Print LBound(A, 3) ' 출력값: -3
End Sub

모든 차원의 기본 하한은 Option Base 문의 설정에 따라 0 또는 1입니다. Array 함수로 만든 배열의 기준값은 0이며 옵션 기준의 영향을 받지 않습니다.

Dim, Private, Public, ReDim 또는 Static 문에서 To 절을 사용하여 차원을 설정하는 배열은 하한으로 모든 정수 값을 사용할 수 있습니다.

도움말 출처

LBound function (Visual Basic for Applications)

Office VBA reference topic

learn.microsoft.com

UBound 함수

배열의 지정된 차원에 대해 사용 가능한 가장 큰 첨자를 포함하는 Long을 반환합니다.

Syntax
UBound(arrayname, [ dimension ])

arrayname : 배열 변수의 이름입니다. 표준 변수 명명 규칙을 따릅니다.
dimension : Variant (Long). 상한이 반환될 차원을 나타내는 정수입니다. 첫 번째 차원에 대해서는 1, 두 번째 차원에 대해서는 2와 같이 사용합니다. 만약 차원이 생략되면, 1로 가정됩니다.

Sub Main()
    Dim i As Integer
    ' 예제 배열
    Dim SampleArray(1 To 3, 1 To 4) As Integer

    For i = 1 To 2
        Debug.Print "[" & i & "] 차원의 상한값은: " & GetUpperBound(SampleArray, i)
    Next i

    ' 차원이 생략되었을 때 (기본값으로 첫 번째 차원)
    Debug.Print "차원이 생략된 경우 첫 번째 차원의 상한값은: " & GetUpperBound(SampleArray)
End Sub

Function GetUpperBound(ByRef arr As Variant, Optional ByVal ArrayDimension As Integer = 1) As Long
    GetUpperBound = UBound(arr, ArrayDimension)
End Function

비고
UBound 함수는 LBound 함수와 함께 사용되어 배열의 크기를 결정합니다. LBound 함수를 사용하여 배열 차원의 하한을 찾습니다.

다음과 같은 차원을 가진 배열에 대해 UBound 함수는 아래와 같은 값을 반환합니다.

Sub Example()
    Dim A(1 To 100, 1 To 3, 1 To 4) As Integer
    Debug.Print UBound(A, 1) ' 출력값: 100
    Debug.Print UBound(A, 2) ' 출력값: 3
    Debug.Print UBound(A, 3) ' 출력값: 4
End Sub

이 예제에서는 UBound 함수를 사용하여 배열의 표시된 차원에 대해 사용 가능한 가장 큰 첨자를 확인합니다.

Sub ArrayExample()
    Dim MyArray(1 To 10, 5 To 15, 10 To 20) As Variant ' Declare array variable.
    Dim AnyArray(10) As Variant

    Debug.Print "첫 번째 차원의 상한 값: " & GetUpperBound(MyArray, 1)
    Debug.Print "두 번째 차원의 상한 값: " & GetUpperBound(MyArray, 2)
    Debug.Print "세 번째 차원의 상한 값: " & GetUpperBound(MyArray, 3)
    
End Sub

Function GetUpperBound(arr As Variant, Optional ArrayDimension As Integer = 1) As Long
    On Error Resume Next
    Dim UpperBound As Long
    UpperBound = UBound(arr, ArrayDimension)
    If Err.number <> 0 Then
        GetUpperBound = 0 ' 배열이 아닌 경우
    Else
        GetUpperBound = UpperBound ' 배열인 경우 해당 차원의 상한 값 반환
    End If
    On Error GoTo 0
End Function

도움말 출처

UBound function (Visual Basic for Applications)

Office VBA reference topic

learn.microsoft.com

Array 함수

배열을 포함하는 Variant을 반환합니다.

Syntax
Array(arglist)

arglist : 필수입니다. arglist 인수는 Variant에 포함된 배열의 요소에 할당되는 쉼표로 구분된 값 목록입니다. 인수를 지정하지 않으면 길이가 0인 배열이 생성됩니다.

arglist = Array(10, "Hello", True, 3.14)

배열의 요소를 참조하는 데 사용되는 표기법은 변수 이름 뒤에 원하는 요소를 나타내는 인덱스 번호가 포함된 괄호로 구성됩니다.

Sub Example()
    ' 배열 선언과 값 할당
    Dim myArray(1 To 5) As Integer
    myArray(1) = 10
    myArray(2) = 20
    myArray(3) = 30
    myArray(4) = 40
    myArray(5) = 50

    ' 배열의 요소를 참조하여 값을 출력
    Debug.Print "첫 번째 요소: " & myArray(1)
    Debug.Print "두 번째 요소: " & myArray(2)
    Debug.Print "세 번째 요소: " & myArray(3)
    Debug.Print "네 번째 요소: " & myArray(4)
    Debug.Print "다섯 번째 요소: " & myArray(5)
End Sub

Array 함수를 사용하여 생성된 배열의 하한은 Array가 유형 라이브러리 이름(예: VBA.Array)으로 한정되지 않는 한 Option Base 문으로 지정된 하한에 의해 결정됩니다. 유형 라이브러리 이름으로 한정된 경우 Array는 Option Base의 영향을 받지 않습니다.

Option Explicit

Option Base 1

Sub Example()
    Dim arr1 As Variant ' 배열 변수 선언
    Dim arr2 As Variant ' 배열 변수 선언

    ' Array 함수로 배열 생성 (Option Base에 따라 하한이 0 또는 1로 설정됨)
    arr1 = Array("A", "B", "C")
    
    ' VBA.Array로 배열 생성 (Option Base에 영향받지 않고 항상 0부터 시작됨)
    arr2 = VBA.Array("A", "B", "C")
    
End Sub

Note

배열로 선언되지 않은 변수는 여전히 배열을 포함할 수 있습니다.

Sub ArrayInVariantExample()
    Dim myVariable As Variant ' Variant 변수 선언 (배열로 선언되지 않음)
    Dim myArray(1 To 3) As Integer ' 정수형 배열 변수 선언

    ' 배열에 값 할당
    myArray(1) = 10
    myArray(2) = 20
    myArray(3) = 30

    ' Variant 변수에 배열 할당
    myVariable = myArray

    ' Variant 변수에 할당된 배열 출력
    Dim i As Integer
    For i = LBound(myVariable) To UBound(myVariable)
        Debug.Print "myVariable(" & i & ") = " & myVariable(i)
    Next i
End Sub

Variant 변수는 고정 길이 문자열 및 사용자 정의 유형을 제외한 모든 유형의 배열을 포함할 수 있습니다.

Sub VariantArrayExample()
    Dim myVariable As Variant ' Variant 변수 선언

    ' 정수형 배열
    Dim intArray(1 To 3) As Integer
    intArray(1) = 10
    intArray(2) = 20
    intArray(3) = 30

    ' 실수형 배열
    Dim doubleArray(1 To 2) As Double
    doubleArray(1) = 3.14
    doubleArray(2) = 2.71

    ' 문자열 배열
    Dim stringArray(1 To 5) As String
    stringArray(1) = "Apple"
    stringArray(2) = "Banana"
    stringArray(3) = "Orange"
    stringArray(4) = "Grapes"
    stringArray(5) = "Mango"

    ' Variant 변수에 다양한 유형의 배열 할당
    myVariable = intArray
    myVariable = doubleArray
    myVariable = stringArray

    ' Variant 변수에 할당된 배열 출력
    Dim i As Integer
    For i = LBound(myVariable) To UBound(myVariable)
        Debug.Print "myVariable(" & i & ") = " & myVariable(i)
    Next i
End Sub

배열을 포함하는 Variant는 요소가 Variant 유형인 배열과 개념적으로 다르지만 배열 요소는 동일한 방식으로 액세스됩니다.

Sub VariantArrayExample()
    Dim myArray As Variant ' Variant 변수 선언

    ' 정수형 배열 할당
    Dim intArray(1 To 3) As Integer
    intArray(1) = 10
    intArray(2) = 20
    intArray(3) = 30

    ' 문자열 배열 할당
    Dim stringArray(1 To 5) As String
    stringArray(1) = "Apple"
    stringArray(2) = "Banana"
    stringArray(3) = "Orange"
    stringArray(4) = "Grapes"
    stringArray(5) = "Mango"

    ' Variant 변수에 정수형 배열 할당
    myArray = intArray

    ' 정수형 배열 출력
    Debug.Print "=== 정수형 배열 출력 ==="
    Dim i As Integer
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print "myArray(" & i & ") = " & myArray(i)
    Next i

 
    ' Variant 변수에 문자열 배열 할당
    myArray = stringArray

    ' 문자열 배열 출력
    Debug.Print
    Debug.Print "=== 문자열 배열 출력 ==="
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print "myArray(" & i & ") = " & myArray(i)
    Next i
End Sub

이 예제에서는 Array 함수를 사용하여 배열이 포함된 Variant를 반환합니다.

Sub VariantWithArrayExample()
    Dim myVariant As Variant

    ' Array 함수를 사용하여 배열이 포함된 Variant 생성
    myVariant = Array("A", "B", "C", 1, 2, 3)

    ' Variant 변수에 할당된 배열의 요소 출력
    Dim i As Integer
    For i = LBound(myVariant) To UBound(myVariant)
        Debug.Print "myVariant(" & i & ") = " & myVariant(i)
    Next i
End Sub

도움말 출처

Array function (Visual Basic for Applications)

Office VBA reference topic

learn.microsoft.com

Filter 함수

지정된 필터 조건에 따라 문자열 배열의 하위 집합을 포함하는 0 기반 배열을 반환합니다.

Syntax
Filter(sourcearray, match, [ include, [ compare ]])

sourcearray : 필수 항목입니다. 검색할 문자열의 1차원 배열입니다.
match : 검색할 문자열입니다.
include : 일치 항목을 포함하는 하위 문자열을 반환할지 제외할지를 나타내는 Boolean 값입니다. include가 True인 경우 필터는 일치 항목을 포함하는 배열의 하위 집합을 하위 문자열로 반환합니다. include가 False인 경우 필터는 일치 항목을 포함하지 않는 배열의 하위 집합을 하위 문자열로 반환합니다.
compare : 사용할 문자열 비교의 종류를 나타내는 숫자 값입니다.

예제 코드 - 1 (include가 True)

Sub FilterExample()
    ' 배열 생성
    Dim fruits(5) As String
    fruits(0) = "apple"
    fruits(1) = "blueberry"
    fruits(2) = "cacao"
    fruits(3) = "cherry"
    fruits(4) = "jambul"
    fruits(5) = "lime"
    ' 필터링 조건 설정
    Dim filterString As String
    filterString = "a"
    
    ' Filter 함수를 사용하여 필터링된 결과 얻기
    Dim filteredFruits() As String
    filteredFruits = Filter(fruits, filterString, True)
    
    ' 필터링된 결과 출력
    Dim i As Integer
    For i = LBound(filteredFruits) To UBound(filteredFruits)
        Debug.Print filteredFruits(i)
    Next i
End Sub

예제 코드 - 2 (include가 False)

Sub FilterExample()
    ' 배열 생성 및 문자열 분리
    Dim animals() As String
    animals = Split("cat,dog,elephant,lion", ",")
    
    ' 필터링 조건 설정
    Dim filterString As String
    filterString = "e"
    
    ' Filter 함수를 사용하여 필터링된 결과 얻기
    Dim filteredAnimals() As String
    filteredAnimals = Filter(animals, "e", False)
    
    ' 필터링된 결과 출력
    Dim i As Integer
    For i = LBound(filteredAnimals) To UBound(filteredAnimals)
        Debug.Print filteredAnimals(i)
    Next i
End Sub

예제 코드 - 3 (compare : vbBinaryCompare)

Sub FilterExample()
    ' 배열 생성 및 데이터 할당
    Dim fruits() As String
    fruits = Split("Flotemysost,Geitost,Ikura,Konbu,Lakkalikoori,Maxilaku,Pavlova,Tofu,Tourtiere,Tunnbrod", ",")
    
    ' 대/소문자를 구분하여 "t"를 포함하는 요소 필터링
    Dim filteredFruits() As String
    filteredFruits = Filter(fruits, "t", True, vbBinaryCompare) ' 대/소문자 구분
    
    ' 필터링된 결과 출력
    Dim i As Integer
    For i = LBound(filteredFruits) To UBound(filteredFruits)
        Debug.Print filteredFruits(i)
    Next i
End Sub

예제 코드 - 4 (compare : vbBinaryCompare)

Sub FilterExample()
    ' 배열 생성 및 데이터 할당
    Dim fruits() As String
    fruits = Split("Flotemysost,Geitost,Ikura,Konbu,Lakkalikoori,Maxilaku,Pavlova,Tofu,Tourtiere,Tunnbrod", ",")
    
    ' 대/소문자를 무시하여 "t"를 포함하는 요소 필터링
    Dim filteredFruits() As String
    filteredFruits = Filter(fruits, "t", True, vbTextCompare) ' 대/소문자 무시
    
    ' 필터링된 결과 출력
    Dim i As Integer
    For i = LBound(filteredFruits) To UBound(filteredFruits)
        Debug.Print filteredFruits(i)
    Next i
End Sub

Join 함수

배열에 포함된 여러 하위 문자열을 결합하여 만든 문자열을 반환합니다.

Syntax
Join(sourcearray, [ delimiter ])

sourcearray : 결합할 substring을 포함하는 1차원 배열입니다.

delimiter : 반환된 문자열에서 하위 문자열을 구분하는 데 사용되는 문자입니다. 생략된 경우, 공백 문자(" ")가 사용됩니다. 만약 구분 기호(delimiter)가 길이가 0인 문자열("")인 경우, 목록에 있는 모든 항목이 구분 기호 없이 연결됩니다.
예제 코드 - 1

Sub JoinExample()
    Dim fruits() As String
    fruits = Split("apple,banana,orange,grape", ",")
    
    ' Join 함수를 사용하여 배열의 요소들을 하나의 문자열로 결합합니다.
    Dim joinedFruits As String
    joinedFruits = Join(fruits, "-")
    
    ' 결과 출력
    Debug.Print "결합된 과일들: " & joinedFruits
End Sub

' 출력 결과
'결합된 과일들: apple-banana-orange-grape

예제 코드 - 2

Sub FilterAndJoinExample()
    Dim fruits() As String
    fruits = Split("apple,blueberry,cacao,cherry,jambul,lime", ",")
    
    ' Filter 함수를 사용하여 배열에서 "a"를 포함하는 하위 문자열만 필터링합니다.
    Dim filteredFruits() As String
    filteredFruits = Filter(fruits, "a", True)
    
    ' Join 함수를 사용하여 필터링된 하위 문자열들을 하이픈으로 결합합니다.
    Dim joinedFruits As String
    joinedFruits = Join(filteredFruits, "-")
    
    ' 결과 출력
    Debug.Print "필터링된 과일들: " & joinedFruits
End Sub

'출력 결과
'필터링된 과일들: apple-cacao-jambul

예제 코드 - 3

Sub FilterAndJoinExample()
    Dim fruits() As String
    fruits = Split("apple,blueberry,cacao,cherry,jambul,lime", ",")
    
    ' Filter 함수를 사용하여 배열에서 "a"를 포함하는 하위 문자열만 필터링합니다.
    Dim filteredFruits() As String
    filteredFruits = Filter(fruits, "a", False)
    
    ' Join 함수를 사용하여 필터링된 하위 문자열들을 쉼표로 결합합니다.
    Dim joinedFruits As String
    joinedFruits = Join(filteredFruits, ",")
    
    ' 결과 출력
    Debug.Print "필터링된 과일들: " & joinedFruits
    '출력 결과
End Sub

'출력 결과
'필터링된 과일들: blueberry,cherry,lime

예제 코드 - 4

Sub JoinWithoutDelimiterExample()
    Dim fruits() As String
    fruits = Split("apple,banana,orange,grape", ",")
    
    ' Join 함수를 사용하여 배열의 모든 하위 문자열을 구분자 없이 결합합니다.
    Dim joinedFruits As String
    joinedFruits = Join(fruits, "")
    
    ' 결과 출력
    Debug.Print "모든 과일들: " & joinedFruits
End Sub

'출력 결과
'모든 과일들: applebananaorangegrape

예제 코드 - 5

Sub ArrayAndJoinExample()
    ' Array 함수를 사용하여 과일 배열을 생성합니다.
    Dim fruits() As Variant
    fruits = Array("사과", "바나나", "오렌지", "포도")
    
    ' Join 함수를 사용하여 배열 요소를 구분자 ","로 연결한 문자열을 생성합니다.
    Dim concatenatedFruits As String
    concatenatedFruits = Join(fruits, ", ")
    
    ' 연결된 문자열을 출력합니다.
    Debug.Print "과일들: " & concatenatedFruits
End Sub

'출력 결과
'과일들: 사과, 바나나, 오렌지, 포도

예제 코드 - 6

Sub AnotherExample()
    Dim arr As Variant
    Dim combined As String
    Dim filtered As Variant

    ' Array 함수로 숫자 배열 생성
    arr = Array(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)

    ' Join 함수로 배열의 요소들을 문자열로 변환 (구분자: " - ")
    combined = Join(arr, " - ")

    ' 메시지 박스로 병합된 배열 출력
    Debug.Print "배열의 요소들: " & combined

    ' Filter 함수를 사용하여 1이 포함된 숫자만 추출
    filtered = Filter(arr, "1", True, vbTextCompare)

    ' 메시지 박스로 필터링된 결과 출력
    Debug.Print "필터된 요소들: " & Join(filtered, " - ")
End Sub

'출력 결과
'배열의 요소들: 1 - 3 - 5 - 7 - 9 - 11 - 13 - 15 - 17 - 19
'필터된 요소들: 1 - 11 - 13 - 15 - 17 - 19

도움말 출처

Join function (Visual Basic for Applications)

Office VBA reference topic

learn.microsoft.com

Split 함수

지정된 수의 하위 문자열을 포함하는 0부터 시작하는 1차원 배열을 반환합니다.

Syntax
Split(expression, [ delimiter, [ limit, [ compare ]]])

expression : 필수입니다. 하위 문자열과 구분 기호가 포함된 문자열 표현식입니다. expression이 길이가 0인 문자열("")인 경우 Split은 빈 배열, 즉 요소와 데이터가 없는 배열을 반환합니다.

delimiter : 선택 사항입니다. 하위 문자열 제한을 식별하는 데 사용되는 문자열 문자입니다. 생략하면 공백 문자(" ")가 구분 기호로 간주됩니다. 구분 기호가 길이가 0인 문자열인 경우 전체 표현식 문자열을 포함하는 단일 요소 배열이 반환됩니다.

limit : 선택 사항입니다. 반환할 하위 문자열 수. -1은 모든 하위 문자열이 반환됨을 나타냅니다.

compare : 선택 사항입니다. 하위 문자열을 평가할 때 사용할 비교의 종류를 나타내는 숫자 값입니다.

예제 코드 - 1

Sub ExampleSplit()
    Dim inputString As String
    Dim resultArray() As String
    
    ' 입력 문자열 설정
    inputString = "apple,banana,orange,grape"
    
    ' 문자열을 구분 기호인 쉼표로 분리하여 배열로 저장
    resultArray = Split(inputString, ",")
    
    ' 결과 배열 출력
    Dim i As Integer
    For i = LBound(resultArray) To UBound(resultArray)
        Debug.Print "Element " & i & ": " & resultArray(i)
    Next i
End Sub

' 출력 결과
' Element 0: apple
' Element 1: banana
' Element 2: orange
' Element 3: grape

예제 코드 - 2

Sub ExampleSplitEmptyString()
    Dim inputString As String
    Dim resultArray() As String
    
    ' 입력 문자열 설정 (빈 문자열)
    inputString = ""
    
    ' 문자열을 구분 기호인 쉼표로 분리하여 배열로 저장
    resultArray = Split(inputString, ",")
    
    ' 결과 배열의 크기 출력
    Debug.Print "Result Array Size: " & UBound(resultArray) - LBound(resultArray) + 1
End Sub

' 출력 결과
' Result Array Size: 0

예제 코드 - 3

Sub SplitExample()
    Dim Text As String
    Dim Words() As String
    Dim Word As Variant
    
    Text = "Hello, this is an example."
    Words = Split(Text)
    
    For Each Word In Words
        Debug.Print Word
    Next Word
End Sub

'출력 결과
' Hello,
' this
' is
' an
' example.

예제 코드 - 4

Sub SplitExample()
    Dim Text As String
    Dim Words() As String
    Dim Word As Variant

    Text = "Hello, this is an example."
    Words = Split(Text, "")

    Debug.Print "Array Length: " & UBound(Words) + 1

    Debug.Print Words(0)
End Sub


' 출력 결과
' Array Length: 1
' Hello, this is an example.

예제 코드 - 5

Sub ExampleSplitWithLimit()
    Dim str As String
    Dim arr() As String
    
    str = "apple_banana_orange_grape"
    arr = Split(str, "_", 2) ' 구분 기호를 "_"로 설정하고 Limit을 2로 설정합니다.
    
    Dim i As Long
    For i = 0 To UBound(arr)
        Debug.Print "arr(" & i & ") = " & arr(i)
    Next i
End Sub


' 출력 결과
' arr(0) = apple
' arr(1) = banana_orange_grape

예제 코드 - 6

Sub SplitExample()
    Dim Text As String
    Dim Words1() As String
    Dim Words2() As String
    Dim Word As Variant

    Text = "Hello, THIS is an Example."

    Words1 = Split(Text, "IS", -1, vbBinaryCompare)  ' 대소문자 구별 함
    Words2 = Split(Text, "IS", -1, vbTextCompare)  ' 대소문자 구별 안 함

    ' 대소문자 구별하는 vbBinaryCompare 결과 출력
    Debug.Print "Output with vbBinaryCompare:"
    For Each Word In Words2
        Debug.Print Word
    Next Word
    
     ' 구분선 출력
    Debug.Print String(30, "-")
    
    ' 대소문자 구별하지 않는 vbTextCompare 결과 출력
    Debug.Print "Output with vbTextCompare:"
    For Each Word In Words1
        Debug.Print Word
    Next Word
End Sub

IsArray 함수

주어진 변수가 배열인지를 판단하여 그 결과를 Boolean값으로 반환합니다.

Syntax
IsArray(varname)

varname : 필수입니다.변수를 지정하는 식별자입니다.

IsArray 함수는 변수가 배열인지를 판단하고, 배열이면 True를 반환하며, 그렇지 않으면 False를 반환합니다. 특히, IsArray는 배열을 포함하는 Variant 변수에서 유용하게 사용됩니다.

예제 코드 - 1

Sub CheckMultipleArrays()
    Dim arr1 As Variant
    Dim arr2 As Variant
    Dim nonArray As Integer
    Dim combinedArr As Variant
    
    ' 배열을 정의합니다.
    arr1 = Array("apple", "banana", "orange")
    arr2 = Range("A1:A3").Value ' 셀 범위를 배열로 가져옵니다.
    
    ' 배열이 아닌 변수를 정의합니다.
    nonArray = 10
    
    ' 배열을 합칩니다.
    combinedArr = Array(arr1, arr2)
    
    ' 배열인지 확인합니다.
    If IsArray(arr1) Then
        Debug.Print "arr1은 배열입니다!"
    Else
        Debug.Print "arr1은 배열이 아닙니다!"
    End If
    
    If IsArray(arr2) Then
        Debug.Print "arr2는 배열입니다!"
    Else
        Debug.Print "arr2는 배열이 아닙니다!"
    End If
    
    If IsArray(nonArray) Then
        Debug.Print "nonArray는 배열입니다!"
    Else
        Debug.Print "nonArray는 배열이 아닙니다!"
    End If
    
    If IsArray(combinedArr) Then
        Debug.Print "combinedArr는 배열입니다!"
    Else
        Debug.Print "combinedArr는 배열이 아닙니다!"
    End If
End Sub

' 출력 결과
' arr1은 배열입니다!
' arr2는 배열입니다!
' nonArray는 배열이 아닙니다!
' combinedArr는 배열입니다!

예제 코드 - 2

Function IsArrayCheck(arr As Variant) As Boolean
    IsArrayCheck = IsArray(arr)
End Function

Sub Example()
    Dim arr1 As Variant
    Dim arr2(1 To 3) As Integer
    Dim nonArray As String
    
    ' 배열을 정의합니다.
    arr1 = Array("apple", "banana", "orange")
    arr2(1) = 10
    arr2(2) = 20
    arr2(3) = 30
    
    ' 배열이 아닌 변수를 정의합니다.
    nonArray = "Hello"
    
    ' 함수를 호출하여 배열 여부를 확인합니다.
    Debug.Print "arr1은 배열인가요? " & IsArrayCheck(arr1) ' True
    Debug.Print "arr2는 배열인가요? " & IsArrayCheck(arr2) ' True
    Debug.Print "nonArray는 배열인가요? " & IsArrayCheck(nonArray) ' False
End Sub

' 출력 결과
' arr1은 배열인가요? True
' arr2는 배열인가요? True
' nonArray는 배열인가요? False

도움말 출처

IsArray function (Visual Basic for Applications)

Office VBA reference topic

learn.microsoft.com

'언어 참조' 카테고리의 다른 글

매개변수 배열 이해  (0) 2023.08.04
명명된 인수 및 선택적 인수 이해  (0) 2023.08.03
속성을 설정할 때 코드 실행  (0) 2023.08.01
Property 프로시저 호출  (0) 2023.08.01
Property 프로시저 작성  (0) 2023.08.01