엑셀 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 셀 참조하는 여러가지 방법 |
댓글을 달아 주세요
임형수 2016.07.03 15:26 댓글주소 수정/삭제 댓글쓰기
정말 좋은 정보 감사합니다 장군님 블로그 보면서 열심히 공부하게 되네요 ^^
네 감사합니다. ^^
이은숙 2016.07.04 11:49 댓글주소 수정/삭제 댓글쓰기
안녕하세요. 질문을 어디로 드려야 할지 몰라서 댓글로 남김니다.
늘 덕분에 엑셀을 많이 배우고 있네요..하하
다른게 아니고 엑셀을 1~10줄이 있으면요
홀수줄만 합산 짝수줄만 합산 하는 방법이 없을까요?? 그리고 거기에 홀수줄글씨만 빨간색으로 하는 방법은요?? 예를 들면 1,2,3,4,5,6,7,8,9,10 을 1+3+5+7+9 = 합산을 11번줄에... 2+4+6+8+10 = 합산을 12번줄에...그리고 1.3.5.7.9의 숫자는 빨간색으로 표시.....
너무어렵게 말씀들 드린거 같네요..ㅠㅠ 혹시 이 서식을 도움을 주실수 있을까요?ㅠㅠ
홀수는 {=SUM(IF(MOD(B3:B12,2)=1,B3:B12, ""))} 이며
짝수는 {=SUM(IF(MOD(B3:B12,2)=0,B3:B12, ""))} 입니다. 수식 적용할 때 주의할 것은 배열수식이기 때문에 Ctrl + Shift + Enter 를 눌러야 합니다.
조건부 서식에는 "수식을 사용하여 서식을 지정할 셀 결정" 에 다음 수식을 넣습니다. 그럼 홀수 셀만 색이 칠해지겠죠.
=MOD(B3,2)=1
상세 내용은 내일쯤 포스팅해서 올리겠습니다.
감사합니다.
익명 2016.08.25 22:55 댓글주소 수정/삭제 댓글쓰기
비밀댓글입니다