Range 개체
Range 개체는 VBA로 프로그래밍을 할 때 가장 빈번하게 사용되는 중요한 개체입니다. 엑셀에 입력되는 대부분의 데이터들이 Range 오브젝트에 보관됩니다. 레인지 오브젝트의 개념만 잘 이해하면 나머지 오브젝트에 대한 것은 거저먹기나 마찬가지입니다. Range 오브젝트는 워크시트 오브젝트의 하위 오브젝트로, 한 개 또는 복수 개의 셀들로 이루어집니다.
Range 오브젝트에 접근하는 방법은 여러 가지가 있습니다. 다음은 대표적인 몇 가지 방법입니다. 이런 방법들 말고도 더 많이 있습니다.
- Range 속성 사용
- Cells 속성 사용
- Offset 속성 사용
- Union 메서드 사용
앞 강의 마지막 부분에서 워크시트 개체의 크기에 대해 소개해드린 적이 있습니다. 다음 코드를 실행시켜 보면 하나의 워크시트에는 몇 개의 셀이 있는지 알 수 있습니다.
Sub HowManyCells()
Dim lngRow As Long
Dim intColumn As Integer
Dim lngCell As Long
Dim strMsg As String
lngRow = ActiveSheet.Rows.Count ' 시트의 행 수를 카운팅하여 lngRow 변수에 저장
intColumn = ActiveSheet.Columns.Count ' 시트의 열 수를 카운팅하여 intColumn 변수에 저장
lngCell = lngRow * intColumn ' 행 수와 열 수를 곱한 결과값을 lngCell 변수에 저장
strMsg = "시트 내 행의 수 : " & lngRow & vbCr
strMsg = strMsg & "시트 내 열의 수 : " & intColumn & vbCr & vbCr
strMsg = strMsg & "전체 셀의 수 : " & lngCell
MsgBox strMsg
End Sub
CODE
VBA에서 가장 중요한 오브젝트 중 하나인 레인지 오브젝트에 자유자재로 접근하기 위한 첫 번째 과제는 우선 셀을 선택하는 것입니다. 그러기 위해서는 Range 속성과 Cells 속성의 특성을 잘 이해하고 있어야 합니다. 두 속성에는 각각 어떤 장단점이 있는 지, 어떤 경우에 사용하면 좋은지 잘 정리해 두시기 바랍니다.
Range 속성
다음 코드를 실행하면 Sheet1 시트의 A1 셀에 '100'이라는 값이 입력됩니다.
Worksheets("Sheet1").Range("A1").Value = 100
이것은 1) Worksheets("Sheet1")이라는 워크시트 오브젝트의, 2) Range("A1")이라는 레인지 오브젝트의, 3) Value 속성값을 '100'이라고 지정하라는 명령입니다.
Range 오브젝트의 디폴트 default 속성값은 Value입니다. 자동차를 살 때에도 기본으로 딸려나오는 것이 있고 옵션으로 추가하는 것이 있지요? 디폴트 속성은 속성명을 따로 붙이지 않아도 붙인 것으로 해석하는 것입니다. 자동차에서 별도로 주문하지 않아도 함께 제공되는 것과 마찬가지로 말이죠.
이번에는 여러 셀에 동일한 값을 넣어볼까요. 입력하려는 위치에 다른 값이 들어있으면 메시지를 표시하고 실행합니다.
Sub WriteData_2()
Worksheets("Sheet1").Range("A1").Select
If Selection <> "" Then ' 선택된 셀이 공란이 아니면 If 구문 내부의 명령을 실행
MsgBox "입력된 값이 있으나 지우겠습니다"
Selection.ClearContents ' 선택된 영역의 데이터를 지움
End If
Worksheets("Sheet1").Range("A1:A10").Value = "엑셀 VBA"
MsgBox "A1:A10 영역에 값을 입력하였습니다"
MsgBox strMsg
End Sub
CODE
셀에 입력된 내용을 지울 때 위 코드에서는 ClearContents 메서드를 사용했습니다만 몇 가지 방법이 있습니다.
메서드 | 설명 |
---|---|
Clear | 내용과 서식을 모두 지웁니다. |
ClearContents | 내용만 지웁니다. |
ClearFormats | 서식만 지웁니다. |
이번에는 불연속적인 여러 개의 셀에 값을 넣는 방법에 대해 살펴봅니다.
Sub WriteData_3()
Worksheets("Sheet1").Range("A1").Select
Worksheets("Sheet1").Range("A1").Select
Range("A1").CurrentRegion.Select
MsgBox Selection.Address & " 영역을 선택하였습니다. 값을 지우겠습니다"
Selection.ClearContents
With Range("A1,A3,A5,A7,A9,B2,B4,B6,B8,B10")
.Select
.Value = "엑셀 VBA"
End With
MsgBox """A1,A3,A5,A7,A9,B2,B4,B6,B8,B10"" 셀에 값을 입력하였습니다"
End Sub
CODE
CurrentRegion은 현재 영역, 즉 인접해 있는 상/하/좌/우의 영역을 반환해 주는 속성입니다. 먼 소리냐 하면, 다음 그림에서 현재 A1 셀이 선택된 상태에서 Range("A1").CurrentRegion.Select라고 하면 A1 셀과 인접해 있는 주변 셀이 모두 선택됩니다.
CurrentRegion 속성
Cells 속성
Cells 속성을 사용해도 셀에 접근할 수 있습니다. 다음 코드를 실행하면 현재 시트의 B5 셀에 숫자 '100'을 입력합니다.
Cells(5,2) = 100
Cells 속성은 Cells(행, 열)의 형식으로 표기합니다. 이것은 Range 속성의 표현 방법과는 순서가 반대이므로 주의하시기 바랍니다.
Cells 속성으로 셀 범위(하나 이상의 셀)에 접근하고자 할 때에는 Range 속성과 조합해서 아래와 같은 형태로 사용합니다.
Range(Cells(3, 2), Cells(10, 5)).Select
Cells 속성(Range 속성도 마찬가지) 앞에 아무 것도 붙이지 않으면 현재 워크시트를 대상으로 합니다. 워크시트 이름을 앞에 명기하면 당연히 지정한 워크시트로 가서 후속 작업을 진행합니다. 다음은 MySheet 시트의 A2 셀에 'VBA Programming'이라는 문자열을 입력하는 코드입니다.
Worksheets("MySheet").Cells(2, 1).Value = "VBA Programming"
여기서 한 가지 주의할 점이 있습니다. 만약 Cells(3, 2)라고 하면 어느 셀을 지정한다고 생각하십니까? 아마도 지금까지 공부를 제대로 해 온 분이라면,
"그것도 질문이라고... 행 방향으로 3, 열 방향으로 2만큼 이동한 곳의 셀이니까 당연히 B3 셀이죠!"
아마 이렇게 답하시겠죠? 하지만 정답은, '그럴 수도 있고 아닐 수도 있다!'입니다. 먼 소린지 알 듯 모를 듯 하죠? 어떤 범위 내에서 명령을 사용하느냐에 따라 달라진다는 뜻입니다. 즉 Cells 속성 앞에 아무 것도 없이 그냥 Cells(3, 2)라고 한다면 3행과 2열이 만나는 B3 셀을 의미합니다. 하지만 앞에 단서가 붙어 있으면 사정은 달라집니다. 다음과 같은 코드가 있다면 어느 셀에 100이라는 값을 넣어주게 될까요?
Range("B2:E9").Cells(3, 2) = 100
Range("B2:E9").Cells(3, 2)라는 것은 B2:E9 영역 내에서 행 방향으로 3번째, 열 방향으로 2번째에 있는 셀을 말합니다. 따라서 C4 셀에 숫자 100을 입력하게 됩니다.
상대적인 위치에 따라 달라지는 결과값
Range 속성과 Cells 속성은 각각 어떤 경우 사용하면 좋은가?
지금까지 Range 속성과 Cells 속성에 대해 살펴보았습니다. 그런데 Cells 속성의 경우, 정의된 이름을 사용할 수 없고, 셀 범위를 설정할 때에도 단독으로는 사용할 수 없으며 Range 속성과 조합해서 써야 합니다.
잘못된 사용 예 (X) | 올바른 사용 예 (O) |
---|---|
Cells("지역별_매출").Select | Range("지역별_매출").Select |
Cells(Cells(2, 1), Cells(5, 7)).Select | Range(Cells(2, 1), Cells(5, 7)).Select |
그렇다면 불편하게만 보이는 Cells 속성은 뭐하러 만들어 놓았을까요?Cells 속성의 가장 큰 장점은 인수에 숫자값을 사용할 수 있다는 것입니다. 다음과 같은 구구단 테이블을 만든다고 생각해 보세요.
인수에 숫자를 써야할 경우 편리한 Cells 속성
만약 Range 속성만으로 이런 것을 만들어야 한다면? 머리가 심하게 아파 옵니다(물론 불가능한 것은 아닙니다). For ~ Next 반복문과 Cells 속성을 조합하면 간단히 해결할 수 있습니다. 어떻게 하면 될 지 3분 정도 생각해 보고 나서 코드를 보시기 바랍니다.
Sub 구구단_테이블()
Dim i As Integer
Dim j As Integer
For i = 2 To 9
For j = 1 To 9
Cells(j + 1, i - 1) = i & " X " & j & " = " & i * j
Next j
Next i
Columns("A:H").AutoFit
End Sub
CODE
어떤가요? 생각보다는 간단하죠? ...잠잠~~...
다음 시간에는 레인지 개체를 생성하는 또 다른 방법들에 대해 소개해 드리겠습니다.