엑셀 VBA 에서 프로그램을 할 때 데이터 영역에 접근하기 위해서 사용하는 객체가 Range 입니다. 그런데 Range 로 하다 보면 안에 있는 데이터가 무엇이 있는지 파악하기가 쉽지 않습니다. 디버그 할 때 Range 변수를 조사식에 추가해 보세요. 어떤 것들이 셀에서 가져온 데이터인지 도저히 찾기가 함들 겁니다.
▼ 이런 경우 Range 객체에 있는 데이터를 배열로 변환하는 것입니다. 다차원 배열도 가능하기 때문에 셀에 있는 위치와 동일하게 배치할 수 있습니다. 그리고 무엇보다 데이터 파악이 쉽습니다. 내가 제대로 시트에서 데이터를 가져왔는지 한 눈에 알 수가 있죠. 먼저 샘플에서 C 열에 있는 수량 값을 VBA 로 가져와서 배열로 변환해 보도록 하겠습니다.
▼ 수량에 데이터 위치는 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차원뿐만 아니라 다차원으로 생성해서 저장할 수 있습니다.
▼ 코드와 수량 데이터를 저장하기 위한 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 매크로 실행 버튼으로 코드 실행하기 ▶ 엑셀 VBA 개발을 위한 개발 도구 탭 추가하는 방법 ▶ 엑셀 VBA 매크로 디버깅, 디버그 코드 분석하기 ▶ 엑셀 VBA 개발 도구를 이용해서 버튼 삽입하고 함수 연결하기 ▶ 엑셀 VBA 셀 참조하는 여러가지 방법 |
'엑셀(Excel) > VBA' 카테고리의 다른 글
엑셀 VBA 주민번호, 이메일 문자열 잘라 내는 방법 (8) | 2024.07.01 |
---|---|
엑셀 VBA 값 숫자 여부 판단하는 IsNumberic 함수 사용하기 (2) | 2024.06.29 |
엑셀 VBA 리스트 박스(ListBox) 사용하기 (0) | 2024.06.29 |
엑셀 VBA For Each 반복문 이용해서 셀 영역 병합 및 합계 구하기 (0) | 2024.06.15 |
엑셀 VBA 데이터 분리해서 다른 시트에 붙여 넣기 (3) | 2024.06.13 |
엑셀 VBA 웹브라우저(인터넷 익스플로러) 띄우는 방법 (0) | 2024.06.12 |
엑셀 VBA 통합 문서 문서가 열리는 순간 기능 구현하기 (0) | 2024.06.05 |
엑셀 VBA 날짜 관련 함수, 개체 사용하는 방법 (0) | 2024.06.02 |