배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   range, Range, array(),array,array함수
제목:   순대국과 Range개체
     
 

  STEP> 순대국과 Range개체

얼마 전에 필자는 점심시간을 빌어 엑셀을 기반으로 상업용 프로그램을 만드는 분들을 만나 맛있는 순대국을 얻어 먹은 적이 있습니다. 순대국과 더불어 푸짐하게 나오는 돼지고기를 새우젓에 콕콕 찍어 맛있게 먹었습니다. 소주 한 잔 하면 “딱” 일 테지만 근무 중에 그럴 수 있나요?

그 분들이 만드는 프로그램은 거의 완성이 되어 가는데, 몇 가지 문제가 있어 얘기를 하다가 Range개체를 사용하면 동일한 값만 들어가는 걸로 아시더군요. 아마도 다음과 같은 코드 때문에 그런 오해를 하시는 것 같더군요. 

Dim rng As Range
         Set rng=Range(Sheet1.Cells(1,1),Sheet1.Cells(1,10))
         rng.Value=”VBA”

많은 VBA책에서 Range 개체를 설명하면서 위와 같이 코딩한 내용을 보여주기 때문에 Range개체에 동일한 값만 들어 갈 수 있는 걸로 생각하는 것이죠.

순간 배열을 통째로 넣어주면 할 텐데 하는 생각이 들었지만, 필자가 직접 코딩 해보고 확인해야 말을 꺼내는 습관 덕분에, 확실한 답변은 드리질 못했죠.

         Dim rng As Range
         Dim arrValue   
         Set rng = Range(Sheet1.Cells(1, 1), Sheet1.Cells(1, 10))   
         arrValue = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)   
         rng.Value = arrValue

위의 코드를 실행하면 A1:J1 셀 영역에 1,2,3,...8,9,10의 값이 각 셀에 입력됩니다.  

           Set rng = Range(Sheet1.Cells(1, 1), Sheet1.Cells(10, 1))          
           arrValue = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)   
            rng.Value = arrValue

그러나 위와 같이 rng의 셀 영역을 세로 방향으로 바꾸어 A1:A10 셀 영역을 위와 같이 입력하면 A1:A10 셀 영역의 각 셀은 ‘1’값만 가집니다. 즉 배열의 첫 번째 원소만 들어가는 거죠.

이는 배열은 가로 방향 즉 1 x N 형식의 행렬이고 A1:A10 셀 영역은 N x 1 형식의 행렬(벡터)이기 때문에 당연히 ‘1’ 만 들어갑니다. 따라서 배열 아니면 Range개체의 형식을 바꾸어 주어야 합니다.

다음과 같이 코드를 바꾸어 보면 어떨까요?

rng.Value =
Application.WorksheetFunction.Transpose(arrValue)

원하는 대로 A1:A10셀 영역에 1,2,3,...,8,9,10이 각 셀에 들어갈 겁니다.

엑셀의 워크시트 함수중 Transpose()를 사용하여 배열의 형식을 바꾸어준 것이죠. 혹시 이 뉴스레터를 그 분이 보신다면 “제가 밥 값을 해드렸죠?” 라고 말씀 드리고 싶습니다.

 
  참고> Array함수의 배열원소 참조
Array()함수는 간단히 배열을 만들 수 있어 종종 배열을 가지고 무언가 설명하는 경우 편리하게 사용합니다.

다음과 같은 코드는 Array()함수를 이용하여 배열을 만들고 그 배열의 두 번째 원소를 [직접 실행]창에 뿌려보는 예입니다.
Debug.Print Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)(1)

위 코드 마지막의 ‘(1)’ 은 배열의 인덱스를 지정하는 것이죠. 위의 코드를 실행하면 [직접 실행]창 ‘2’라는 결과를 볼 수 있을 겁니다.