글목록

2021년 4월 2일

엑셀 시트 데이터 읽기/쓰기 (2)

워크시트의 데이터를 변수에 한꺼번에 입력받는 것과 마찬가지로 배열 변수의 데이터를 한꺼번에 쓰는 것도 가능합니다. 한꺼번에 입력을 받을 때,


Sub Test1()
  Dim a()
  a = Range(Cells(5, 2), Cells(10, 100)).Value
End Sub

와 같이 배열 변수를 선언해주고, 워크시트의 행,열 범위를 지정해서 Value를 가져오도록 하면 배열변수의 크기를 자동으로 할당한 후, 값을 입력해줍니다.

이때, 배열 a의 크기는 (5 to 10, 2 to 100)이 아니라, (1 to 6, 1 to 99)가 됩니다. 즉, 

Cells(5,2) → a(1,1)
Cells(5,3) → a(1,2)
....
Cells(10,99) → a(6,98)
Cells(10,100) → a(6,99)

에 배열이 만들어집니다. 배열 변수의 첫번째 주소는 항상 a(1,1)로 정해지고, 그 크기는 지정한 Range의 행과 열 갯수로 정해집니다.

반대로 2차원 배열의 값을 워크시트의 원하는 위치에 출력하고 싶다면, Range를 정확하게 지정해주어야 합니다. 예를 들어, 위의 배열 a()를 다음과 같이 출력한다면,


Sub Test2()
  Dim a()
  a = Range(Cells(5, 2), Cells(10, 100)).Value
  Range(Cells(20, 1), Cells(21, 2)).Value = a
End Sub


라고 한다면, Range(Cells(5, 2), Cells(10, 100)) 범위의 값을 읽어와서, Range(Cells(20, 1), Cells(21, 2)) 범위에 a(1,1)부터 순차적으로 채워줍니다. 만약, 출력하려는 범위가 a() 배열의 크기보다 작다면 a()의 일부만 출력하고, 반대로 출력하려는 범위가 a()보다 크다면, 반복해서 a()를 채워넣게 됩니다. 따라서, 위의 Test2를 실행시키면, 아래와 같이 a()의 일부만 엑셀 시트의 Range에 값이 채워지게 되죠.

Cell(20,1), Cell(20,2) → a(1,1)=Cells(5,2), a(1,2)=Cells(5,3)
Cell(21,1), Cell(21,2) → a(2,1)=Cells(6,2), a(2,2)=Cells(6,3)

굳이 이렇게 셀 값을 한꺼번에 읽어와서, 다른 셀에 값을 집어넣을 필요가 있을까요? 일반적인 경우에 이런 작업은 엑셀 시트에서 Ctrl+C / V로 작업하면 되는데 말이지요.

당연히 동일한 값을 복사해서 다른 셀에 넣는 작업이라면, 이러한 일을 수행할 필요가 없습니다. 그러나, 제가 앞으로 설명드리려는 내용들은 원본데이터를 읽어와서 어떠한 방식으로 데이터를 가공하고, 그 결과물을 다른 셀에 출력하는 과정을 자동화시키는 매크로를 작성하는 것을 목적으로 하고 있습니다. 그러기 위해서는 원본 데이터를 읽고, 가공된 데이터를 출력하는 것이 가장 기본이 되며, 두 데이터는 동일한 데이터가 되지 않습니다.

이전 글의 마지막에 말씀드린 것처럼, 수십~수백개 정도의 데이터라면, 그냥 셀에서 하나씩 읽고 출력해도 인지가능한 수준으로 속도가 느리지 않습니다만, 각 열마다 수만개의 데이터를 포함하는 수십~수백개 열 데이터를 처리하려면, 엑셀 작업이 매우 느려집니다. 따라서, 내가 선택한 범위의 원본 데이터를 가공하고 임의의 위치에 넣을 수 있도록 입출력 함수를 작성해두면 대량의 데이터를 빠르게 처리할 수 있습니다.

물론, 수백만~수억개의 데이터를 처리해야한다면, 어차피 엑셀에서 처리할 수도 없고, 엑셀로 처리하는 범위를 넘어서기 때문에 다른 툴을 사용하시기를 권합니다. 다만, 엑셀로 처리가능한 수준의 데이터를 처리할 때, 입/출력 때문에 느려서 작업이 안된다면 곤란하겠지요.

다음 시간에는 원하는 범위의 데이터를 선택해서 데이터를 배열에 할당하고, 가공된 데이터를 원하는 위치로 한꺼번에 출력하는 함수를 만들어보도록 하겠습니다.

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :