엑셀 VBA 영역(Range)을 배열(Array) 로 변경하는 방법 |
환경: Microsoft Excel 2013 |
엑셀 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 |
◎ 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차월 배열입니다. 그림처럼 시트와 동일한 형태로 들어간 것을 확인 할 수 있습니다.
'엑셀(Excel) > VBA' 카테고리의 다른 글
엑셀 VBA 시트 테두리 선 그리는 방법 (0) | 2019.06.16 |
---|---|
엑셀 VBA 문서에 포함된 하이퍼링크 한번에 삭제하는 방법 (0) | 2019.06.08 |
엑셀 VBA 영역(Range)을 배열(Array) 로 변경하는 방법 (5) | 2019.05.24 |
엑셀 VBA 다른 셀에 일치하는 코드 값에 데이터를 찾아 추가하는 방법 (2) | 2019.04.22 |
엑셀 VBA 반복문으로 여러 컨트롤 한번에 제어하는 방법 (0) | 2019.03.31 |
엑셀 VBA 반복문을 이용해서 폼에 있는 전체 컨트롤 제어하기 (0) | 2019.03.26 |
댓글을 달아 주세요
임형수 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 댓글주소 수정/삭제 댓글쓰기
비밀댓글입니다