얼마 전에 필자는 점심시간을 빌어 엑셀을
기반으로 상업용 프로그램을 만드는 분들을 만나 맛있는 순대국을 얻어 먹은 적이 있습니다. 순대국과 더불어
푸짐하게 나오는 돼지고기를 새우젓에 콕콕 찍어 맛있게 먹었습니다. 소주 한 잔 하면 “딱” 일 테지만
근무 중에 그럴 수 있나요?
그 분들이 만드는 프로그램은 거의 완성이 되어 가는데, 몇 가지 문제가 있어 얘기를 하다가
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()를 사용하여 배열의 형식을 바꾸어준 것이죠. 혹시 이 뉴스레터를 그 분이 보신다면
“제가 밥 값을 해드렸죠?” 라고 말씀 드리고 싶습니다. |