레인지 오브젝트에 대한 마지막 시간입니다. 레인지 오브젝트에 접근하는 방법은 더 있습니다만, 지금까지 소개해 드린 것과 함께 오늘 알려드리는 것까지해서 10여 가지 남짓 되는 속성이나 메서드만 잘 이해하시면 웬만한 것은 거의 이해했다고 생각해도 좋습니다. 자, 눈에 힘을 주고 시작해 볼까요?
이번 강좌도 Exceller의 책 "VBA로 엑셀에 날개달기"에서 인용했습니다.
SpecialCells 메서드
셀(레인지 오브젝트)에는 여러 종류의 정보가 들어갈 수 있습니다. 상수(Constant) 변하지 않는 수가 들어있는 셀, 내용이 아예 들어있지 않은 셀, 수식이 입력되어 있는 셀 등과 같이 말이지요.
이 중에서 특정한 타입의 영역을 선택해야 할 경우에 SpecialCells 메서드를 사용합니다. 이것은 워크시트 상태에서 [편집] - [찾기 및 선택] - [이동 옵션] 메뉴를 클릭하면 나타나는 [이동 옵션] 대화상자를 통해 조작한 것과 같은 기능을 수행합니다.
SpecialCells 메서드로 특정한 조건을 충족하는 셀에 접근하는 것은 [이동 옵션] 대화상자에서 어떤 조건을 지정하여 특정한 셀에 접근하는 것과 같은 과정입니다. SpecialCells 메서드의 기본적인 사용법은 다음과 같습니다.
작업 대상 영역.SpecialCells (Type, Value)
여기에서 Type, value 같은 것을 인수 argument라고 합니다.
Type 인수
상수 | 셀 타입 |
---|---|
xlCelltypeAllFormatConditions | 표시 형식이 설정되어 있는 셀 |
xlCelltypeValidations | 유효성 조건이 설정된 셀 |
xlCelltypeBlanks | 빈 문자열이 들어있는 셀 |
xlCelltypeComments | 메모가 들어있는 셀 |
xlCelltypeConstants | 상수가 포함되어 있는 셀 |
xlCelltypeFormulas | 수식이 들어있는 셀 |
xlCelltypeLastCell | 사용된 범위 내의 마지막 셀 |
xlCelltypeSameFormatConditions | 같은 서식을 가진 셀 |
xlCelltypeSameValidation | 같은 유효성 조건을 가진 셀 |
xlCelltypeVisible | 화면에 보이는(표시되어 있는) 모든 셀 |
Type 인수
상수 | 셀 타입 |
---|---|
xlErrors | 에러값 |
xlLogical | 논리값 |
xlNumbers | 숫자값 |
xlTextValues | 문자열값 |
예를 들어 현재 워크시트에서 데이터가 입력되어 있는 마지막 셀을 선택하려면 다음과 같이 표현합니다.
Sub SpecialCells_Method()
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Select
MsgBox "마지막 데이터 셀 주소는 " & Selection.Address & "이고" & vbCr & _
"입력된 값은 " & Selection.Value & " 입니다"
End Sub
CODE
이 코드를 실행하면 아래와 같은 결과가 나타납니다.
기본적인 사용법을 알았으니 이번에는 보다 실용적인 예제를 만들어 볼까요? 시트 내에서 수식이 입력된 셀의 배경색을 노란색으로 칠해 보도록 하지요. 다음 그림처럼 말입니다.
어떻게 하면 위와 같이 할 수 있을까요? 정상적인 예습/복습을 철저히 하고 정규 교과 과정을 제대로 이수하신 분이라면 능히 해결하실 수 있으리라 생각됩니다...는 농담이고, 앞에서 설명드린 SpecialCells_Method 프로시저를 이해한 분이라면 응용할 수 있어야 합니다.
Sub SpecialCells_Method2()
Dim rngMyRange As Range
Set rngMyRange = _
Worksheets("Sheet7").Cells.SpecialCells(xlCellTypeFormulas)
rngMyRange.Interior.ColorIndex = 6
MsgBox "수식이 입력된 모든 셀을 노란색으로 표시하였습니다!"
End Sub
CODE
End 속성
End 속성이라고 하니까 뭔지 정확히는 알 수 없지만 '마지막'과 관련된 것이 아닐까 하는 짐작은 어렴풋이 드시지요? 바로 그렇습니다. End 속성은 '영역의 마지막 셀'을 구해주는 속성입니다. 마지막 셀은 알겠는데 '영역의' 마지막 셀이란 무엇을 말하는 것일까요?
짐작하시겠지만, 현재 셀을 기준으로 상/하/좌/우 방향의 맨 끝에 있는 셀을 의미합니다. 말로 하니까 이해가 될듯 말듯 하시지요? 그러실 줄 알고 그림을 준비했습니다.
End 속성
이 시점에서... 수수께끼 하나 내 드릴까요?
"아니, VBA 공부하다 말고 집중력 떨어지게 왠 수수께끼?"
라고 하시겠지요? 다 이유가 있으니까 한번 맞춰 보세요.
집집마다 4개씩 가지고 있는데 동네를 다 털어도 4개 밖에 없고, 온 나라를 다 뒤져도 4개 밖에 없는 것은 무엇일까~요?
그것은 바로... '동서남북'이랍니다. 영역의 마지막 셀도 동서남북과 비슷합니다. 위 그림에서 D8 셀을 기준으로 해서 위쪽 방향 마지막 셀은 D4 셀, 아래쪽 마지막 셀은 D13 셀입니다. 또한 왼쪽으로 마지막 셀은 B8 셀, 오른쪽으로 마지막 셀은 F8 셀입니다. 이것을 컴퓨터(엑셀)가 알아들을 수 있게 VBA 코드로 표현하면 이렇게 됩니다.
Range("D8").End(xlUp).Select
Range("D8").End(xlDown).Select
Range("D8").End(xlToLeft).Select
Range("D8").End(xlToRight).Select
조금 응용을 해 봅시다. 다음 코드를 실행해서 직접 확인해 보시면 아마도 End 속성에 대해서는 더 이상의 설명이 필요 없으리라 생각합니다. 물론 코드를 실행하기 전에 Sheet1에 위 그림과 비슷한 형태의 데이터는 미리 만들어 두어야겠지요?
Sub End_Property()
Dim rngStart As Range
Dim strAddress As String
Set rngStart = Sheets("Sheet1").Range("D8")
With rngStart.End(xlUp).Select
strAddress = Selection.Address(rowabsolute:=False, columnabsolute:=False)
MsgBox "D8 셀의 위쪽 끝 셀인 [" & strAddress & "]셀을 선택하였습니다"
.End(xlDown).Select
strAddress = Selection.Address(rowabsolute:=False, columnabsolute:=False)
MsgBox "D8 셀의 아래 끝 셀인 [" & strAddress & "]셀을 선택하였습니다"
.End(xlToLeft).Select
strAddress = Selection.Address(rowabsolute:=False, columnabsolute:=False)
MsgBox "D8 셀의 왼쪽 끝 셀인 [" & strAddress & "]셀을 선택하였습니다"
.End(xlToRight).Select
strAddress = Selection.Address(rowabsolute:=False, columnabsolute:=False)
MsgBox "D8 셀의 오른쪽 끝 셀인 [" & strAddress & "]셀을 선택하였습니다"
End With
End Sub
CODE
End 속성의 인수 및 단축 키 정리
이동 방향 | 인수 | 단축 키(워크시트에서 사용) |
---|---|---|
위쪽 끝 | End(xlUp) | Ctrl + ↑ |
아래쪽 끝 | End(xlDown) | Ctrl + ↓ |
왼쪽 끝 | End(xlToLeft) | Ctrl + ← |
오른쪽 끝 | End(xlToRight) | Ctrl + → |
End 속성은 실무에서 어떤 경우에 사용될까요? 여러 가지 경우에 적용할 수 있겠지만 다음과 같이 데이터를 계속 입력할 때 마지막으로 입력된 셀이 어디인지를 파악하는 경우에 흔히 사용됩니다.
Sub End_Property_2()
Range("A65536").End(xlUp).Offset(1, 0).Select
MsgBox "데이터가 새로 입력될 위치는 " & Selection.Address & "입니다"
End Sub
CODE
이 코드를 실행한 결과는 아래와 같습니다. 셀 포인터의 위치를 눈여겨 보세요.
뿐만 아니라 특정한 영역을 지정하여 색상을 지정할 때에도 사용할 수 있습니다.
위 그림처럼 급여 부분에 접근하여 서식을 지정해 주는 코드입니다.
Sub End_Property_3()
Range(Range("E2"), Range("E2").End(xlDown)).Select
Selection.Interior.ColorIndex = 3
Selection.Font.ColorIndex = 2
MsgBox "급여 영역의 데이터에 대한 서식 변경을 완료하였습니다!"
End Sub
CODE
이렇게 해서 올해 강의는 모두 마칩니다. 새해에는 더욱 알찬 내용을 가지고 다시 찾아오겠습니다. 모쪼록 2005년에는 웃을 일이 많이 생기기를 기원해 봅니다.
아듀 2004년, 아듀 여러분~~