엑셀 VBA 영역(Range)을 배열(Array) 로 변경하는 방법

엑셀(Excel)/VBA

엑셀 VBA 영역(Range)을 배열(Array) 로 변경하는 방법

 

환경: Microsoft Excel 2013

 

엑셀 VBA 에서 프로그램을 할 때 데이터 영역에 접근하기 위해서 사용하는 객체가 Range 입니다. 그런데 Range 로 하다 보면 안에 있는 데이터가 무엇이 있는지 파악하기가 쉽지 않습니다. 디버그 할 때 Range 변수를 조사식에 추가해 보세요. 어떤 것들이 셀에서 가져온 데이터인지 도저히 찾기가 함들 겁니다.

 

이런 경우 Range 객체에 있는 데이터를 배열로 변환하는 것입니다. 다차원 배열도 가능하기 때문에 셀에 있는 위치와 동일하게 배치할 수 있습니다. 그리고 무엇보다 데이터 파악이 쉽습니다. 내가 제대로 시트에서 데이터를 가져왔는지 한 눈에 알 수가 있죠. 먼저 샘플에서 C 열에 있는 수량 값을 VBA 로 가져와서 배열로 변환해 보도록 하겠습니다.

엑셀 VBA 영역(Range)을 배열(Array) 로 변경하는 방법

 

수량에 데이터 위치는 C4:C13 입니다. ActiveSheet.Range() 함수를 사용해 Range 객체를 저장합니다. 그리고 배열의 영역을 지정하기 위해서는 Range 에 저장된 데이터 개수를 알아야 합니다. rngList.Cells.Count 속성으로 셀의 개수를 알아 옵니다.

 

Dim varValues As Variant

Dim rngList As Range

Sheets("Sheet1").Activate

Set rngList = ActiveSheet.Range("C4:C13")

varValues = rngList.Cells.Count

 

다음은 배열을 재정의 해야 합니다. 처음에 정의했던 배열에서 저장해야 할 데이터 개수가 얼마인지 모르기 때문에 아래에서 ReDim 지시어를 사용했습니다.

 

'' 배열의 크기를 재정의 한다.

Dim stringValues () As String

ReDim stringValues(varValues - 1)

 

아래 소스는 Text 속성을 이용해서 Range 에 값을 하나씩 꺼낸 후 배열에 저장하는 것입니다. 그리고 배열 요소에 대한 숫자 값을 하나씩 증가 시켜야겠죠.

 

'' 배열에 값을 넣는다.

Dim columnCounter As Long

For Each c In rngList

stringValues(idx) = c.Text

    idx = idx + 1

Next c

 

위에서 설명한 전체 소스입니다.

 

Sub range_array()

 

    Dim c As Range

    Dim idx As Long

  

    '' 데이터를 선택한다.

    Dim varValues As Variant

    Dim rngList As Range

    Sheets("Sheet2").Activate

    Set rngList = ActiveSheet.Range("C4:C13")

    varValues = rngList.Cells.Count

          

    '' 배열의 크기를 재정의 한다.

    Dim stringValues () As String

    ReDim stringValues(varValues - 1)

 

    '' 배열에 값을 넣는다.

    Dim columnCounter As Long

    For Each c In rngList

          stringValues(idx) = c.Text

          idx = idx + 1

    Next c

 

End Sub

 

2차원 배열 넣는 방법

 

다음은 시트에 있는 코드와 수량을 넣는 2차원 배열에 대해 알아 보겠습니다. 배열의 차원은 좀 복잡하지만 2차원뿐만 아니라 다차원으로 생성해서 저장할 수 있습니다

엑셀 VBA 영역(Range)을 배열(Array) 로 변경하는 방법

 

코드와 수량 데이터를 저장하기 위한 2차원 배열에서 필요한 것은 행/열의 크기입니다. Rows.Count Columns.Count 를 이용해서 값을 가져옵니다.

 

Sheets("Sheet2").Activate

Set rngList = ActiveSheet.Range("B4:C13")

rowsCount = rngList.Rows.Count

colsCount = rngList.Columns.Count

 

위에서 가져온 행/열 개수를 2차월 배열의 첫 번째, 두 번째 인수로 넣고 배열 재정의를 하게 됩니다. 배열의 인수는 0 부터 시작하지만 개수는 1부터 시작하기 때문에 전체 개수에서 -1 을 해 줘야 합니다.

 

'' 2차원 배열의 크기를 재정의 한다.

Dim stringValues() As String

ReDim stringValues(rowsCount - 1, colsCount - 1)

 

2차원 배열이기 때문에 For 문을 두 번 돌아야 합니다. 행과 열을 반복해서 돌며 데이터를 2차원 배열에 집어 넣습니다.

'' 배열에 값을 넣는다.

For colNum = 1 To colsCount Step 1

For rowNum = 1 To rowsCount Step 1

       stringValues(rowNum - 1, colNum - 1) = rngList(rowNum, colNum)

  Next rowNum

Next colNum

 

위에서 설명한 내용을 합친 전체 소스 입니다.

 

Sub range_array2()

  

    '' 데이터를 선택한다.

    Dim rowsCount As Integer

    Dim colsCount As Integer

    Dim rngList As Range

   

    Sheets("Sheet2").Activate

    Set rngList = ActiveSheet.Range("B4:C13")

    rowsCount = rngList.Rows.Count

    colsCount = rngList.Columns.Count

 

    '' 2차원 배열의 크기를 재정의 한다.

    Dim stringValues() As String

    ReDim stringValues(rowsCount - 1, colsCount - 1)

 

    '' 배열에 값을 넣는다.

    For colNum = 1 To colsCount Step 1

       For rowNum = 1 To rowsCount Step 1

          stringValues(rowNum - 1, colNum - 1) = rngList(rowNum, colNum)

       Next rowNum

    Next colNum

   

End Sub

 

소스 작업이 끝나고 조사식으로 2차원 배열에 제대로 들어갔는지 테스트 해 보았습니다. 조사식에 추가한 변수는 2차월 배열입니다. 그림처럼 시트와 동일한 형태로 들어간 것을 확인 할 수 있습니다

엑셀 VBA 영역(Range)을 배열(Array) 로 변경하는 방법

Posted by 녹두장군