배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   이벤트, change
제목:   Change 이벤트를 이용하여 특정 셀 영역에 입력 확인하기
     
 

새 페이지 5

  STEP 1>
개발자는 워크시트의 특정 영역에 사용자가 데이터를 입력하리라 기대하지만, 사실 워크시트라는 영역은 제한이 없는 영역입니다. 숫자 대신 문자를 입력할 수도 있고 행이나 열을 삽입하여 특정 영역의 위치를 바꿀 수도 있죠.

그래서 사용자가 입력하는 내용을 유효성검사기능을 이용하여 검사하거나 행열머리글을 감추거나 셀 포인터가 이동하는 영역을 제한하기도 합니다.

오늘은 이와 관련한 여러 가지 내용 중에서 사용자가 입력하는 위치가 개발자가 원하는 위치인가를 확인하는 내용입니다. Worksheet_ Change이벤트의 매개변수에는 Target매개변수를 보면 데이터형이 Range임을 알 수 있습니다. 즉 이 매개변수는 변경되는 셀 영역을 의미합니다.

이 영역과 개발자가 지정한 영역 중 하나인가 또는 일치하는 가를 확인하는 또 다른 메소드가 Application.Intersect 메소드입니다. 도움말의 정의에 따르면 “둘 이상의 범위에서 사각형 모양의 겹치는 부분을 나타내는 Range 개체를 반환합니다.”라고 되어 있습니다.

다음의 Change이벤트 프로시저를 보시죠.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngTest As Range
On Error Resume Next

Set rngTest = Application.Intersect(Me.Range("D4"), Target)
On Error GoTo 0
If Not rngTest Is Nothing Then
MsgBox "Cell D4 was changed."
End If
End Sub

Set rngTest = Application.Intersect(Me.Range("D4"), Target)는 D4라는 셀 영역이 변경 되었는 가를 확인합니다. 그래서 D4라는 영역이 변경되었다면 rngTest라는 Range변수가 만들어집니다. 이것은 range Is Nothing으로 검사합니다. 개체변수에게 Nothing은 특별한 의미입니다.

개체의 생성여부를 검사하기도 하지만 Set 개체변수=Nothing으로 개체변수를 선언수준으로 되돌리기도 합니다.

만일 전체 통합문서의 모든 시트를 확인하려면 통합문서의 수준에서 이벤트 프로시저를 작성해야 합니다. 다음의 이벤트 프로시저는 통합문서의 수준에서 시트가 변경 되었는 가를 확인하는 겁니다.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

여기에서는 눈 여겨 봐둬야 하는 부분은 Sh와 Target입니다. Sh는 데이터형이 막연하게 Object 로만 선언되어 있어 무슨 개체인지를 알 수 없어 보이지만 이름으로 봐서는 Sheet를 의미하는 것 같죠. Target은 이미 아실 겁니다.

  STEP 2>
위에서 Application.Intersect 메소드를 A라는 영역이 B라는 영역에 속해 있는 가를 확인하기 위해 검사했지만, 비슷한 얘기인지는 모르겠지만 공통의 분모영역을 돌려준다는 것이 원래의 용도일 것입니다. 다음은 VBA도움말의 예제입니다.

Intersect 메서드 예제

다음은 Sheet1에 있는 범위 rg1과 rg2의 겹치는 부분을 선택하는 예제입니다. 범위가 서로 겹치지 않으면 메시지를 표시합니다.

Worksheets("Sheet1").Activate
Set isect = Application.Intersect(Range("rg1"), Range("rg2"))
If isect Is Nothing Then
MsgBox "Ranges do not intersect"
Else
isect.Select
End If