|
|
얼마 전에 필자는 점심시간을 빌어 엑셀을
기반으로 상업용 프로그램을 만드는 분들을 만나 맛있는 순대국을 얻어 먹은 적이 있습니다. 순대국과 더불어
푸짐하게 나오는 돼지고기를 새우젓에 콕콕 찍어 맛있게 먹었습니다. 소주 한 잔 하면 “딱” 일 테지만
근무 중에 그럴 수 있나요?
그 분들이 만드는 프로그램은 거의 완성이 되어 가는데, 몇 가지 문제가 있어 얘기를 하다가
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()함수를 이용하여 배열을 만들고 그 배열의 두 번째 원소를 [직접
실행]창에 뿌려보는 예입니다.
Debug.Print Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)(1)
위 코드 마지막의 ‘(1)’ 은 배열의 인덱스를 지정하는 것이죠. 위의 코드를 실행하면 [직접 실행]창
‘2’라는 결과를 볼 수 있을 겁니다.
|
|
|
|