Please Enable JavaScript!
Gon[ Enable JavaScript ]

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

엑셀(Excel)/VBA
반응형

엑셀 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

 

 ※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다.
엑셀 VBA 매크로 실행 버튼으로 코드 실행하기
엑셀 VBA 개발을 위한 개발 도구 추가하는 방법
엑셀 VBA 매크로 디버깅, 디버그 코드 분석하기
엑셀 VBA 개발 도구를 이용해서 버튼 삽입하고 함수 연결하기
셀 VBA 참조하는 여러가지 방법

 

 

 

 

 

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) 로 변경하는 방법

 ※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다.
엑셀 VBA 매크로 실행 버튼으로 코드 실행하기
엑셀 VBA 개발을 위한 개발 도구 추가하는 방법
엑셀 VBA 매크로 디버깅, 디버그 코드 분석하기
엑셀 VBA 개발 도구를 이용해서 버튼 삽입하고 함수 연결하기
셀 VBA 참조하는 여러가지 방법
반응형
Posted by 녹두장군1
,