- 최초 작성일: 2002-03-07
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: Intersect 메서드에 대하여
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
방명록에 김우수님께서 남기신 글입니다.
먼저 운영자님께 깊은 경의를 표합니다. 저는 나이가 좀 많은(52세) 편이지만 그래도 평소 배움의 욕구를 주체하지 못하는 편이랍니다. 마침 제 업무에 EXCEL을 이용해야 하는 부분이 많아 이걸 좀 배워 보려고 서점에서 책도 사고 또 좀 한다는 주위 동료들에게 물어보고 해도 만족할 만한 답을 얻지 못해 항상 불만이 많았는데 우연히 이곳엘 들러보고... 세상에 이렇게 쉽고 또 실무에서 늘 궁금했던 답이... 정말 놀랍군요. 운영자님 진심으로 감사드립니다. 내내 건강하시고 또 행복하세요.
늦었다고 생각될 때가 가장 빠를 때입니다. 배움에는 나이가 없는 것이지요. 모쪼록 엑셀과 VBA를 즐기면서 열심히 하신다면 좋은 결과가 있을 것입니다.
지난 시간에 OnKey 메서드에 대해 설명을 드릴 때 새로 등장한 Intersect 메서드에 대해 대충 설명하고 넘어갔습니다. 도움말을 다들 참고하셨는지 아니면 별 필요성을 못 느껴서인지 이 메서드에 대해 질문을 주신 분이 아무도 없으시군요. ^^ 사실 Intersect 메서드도 잘 활용하면 여러 가지 경우에 활용할 수 있는 아주 재미있는 방법인데 말입니다.
Intersect 메서드에 대하여
핵심 요약: Intersect로 선택 금지 영역 만들기
Intersect 메서드는 두 범위의 겹치는 영역을 구해 주며, SelectionChange 이벤트에서 선택 영역과 금지 영역의 교집합이 있으면 다음 셀로 이동시켜 선택하지 못하게 할 수 있습니다.
- 1단계: 건드리면 안 되는 셀 영역에 이름(NoTouchArea)을 정의합니다.
- 2단계: 워크시트의 SelectionChange 이벤트 프로시저를 작성합니다.
- 3단계: Intersect 결과가 Nothing이 아니면 Target.Next.Select로 다음 셀로 이동합니다.
Step 1: 노란색 셀을 선택해 보세요
강좌를 보시는 분 중에 엑셀이나 VBA 말고도 손재간이 있다고 자타가 인정하는 분이 계시리라 생각합니다. 어디 그런 분은 아래의 테이블 중에서 노란 색으로 색칠한 부분을 한번 선택해 보세요. 재주가 있거든… ^^
| 2000년 | 2001년 | 2002년 | Average | Difference | |
|---|---|---|---|---|---|
| 1월 | 740 | 888 | 1154.4 | 927.5 | 266.4 |
| 2월 | 44 | 52.8 | 68.6 | 55.1 | 15.8 |
| 3월 | 492 | 590.4 | 767.5 | 616.6 | 177.1 |
| 1/4분기 | 1276 | 1531.2 | 1990.6 | 1599.3 | 459.4 |
| 4월 | 673 | 807.6 | 1049.9 | 843.5 | 242.3 |
| 5월 | 542 | 650.4 | 845.5 | 679.3 | 195.1 |
| 6월 | 430 | 516 | 670.8 | 538.9 | 154.8 |
| 2/4분기 | 1645 | 1974 | 2566.2 | 2061.7 | 592.2 |
| 상반기 | 2921 | 3505.2 | 4556.8 | 3661 | 1051.6 |
| 7월 | 680 | 816 | 1060.8 | 852.3 | 244.8 |
| 8월 | 443 | 531.6 | 691.1 | 555.2 | 159.5 |
| 9월 | 18 | 21.6 | 28.1 | 22.6 | 6.5 |
| 3/4분기 | 1141 | 1369.2 | 1780 | 1430.1 | 410.8 |
| 10월 | 621 | 745.2 | 968.8 | 778.3 | 223.6 |
| 11월 | 564 | 676.8 | 879.8 | 706.9 | 203 |
| 12월 | 83 | 99.6 | 129.5 | 104 | 29.9 |
| 4/4분기 | 1268 | 1521.6 | 1978.1 | 1589.2 | 456.5 |
| 하반기 | 2409 | 2890.8 | 3758 | 3019.3 | 867.2 |
| 년 간 | 5330 | 6396 | 8314.8 | 6680.3 | 1918.8 |
누구 선택에 성공하신 분 계신가요? 워크시트 전체를 범위로 지정하면 되지 않겠느냐구요? 어디 한번 해 보세요! 노란색 셀만 선택하면 달아나고 달아나고… 아마 잘 선택이 안될 것입니다.
이것이 바로 Intersect 메서드를 이용한 것입니다.
Step 2: 만드는 순서
(1) 먼저, 노란색 셀 영역을 지정한 다음 범위명을 지정해 줍니다. 범위명을 어떻게 지정하느냐구요?(이런 분이 있다면 큰 일인데… 농담입니다!) Ctrl 키를 사용하여 범위를 다 지정하신 다음 '삽입-이름-정의' 메뉴에서 적당한 이름을 정해 주시면 됩니다. 또는 수식 입력줄 왼편에 있는 이름 상자(Name Box)에 바로 이름을 입력하고 엔터키를 누르셔도 됩니다.
여기서는 'NoTouchArea'라고 이름을 정의하였습니다. 건들지 말라는 뜻에서…
(2) 그런 다음에 시트 탭을 오른쪽 마우스 버튼으로 누르고 '코드 보기' 메뉴를 선택합니다.
(3) '프로젝트 탐색기'에서 Sheet1(Preface) 오브젝트를 더블 클릭하면 오른쪽에 코드 창이 나타날 것입니다. 코드 창 상단에 있는 드롭다운 버튼을 클릭하여 워크시트 오브젝트의 SelectionChange 이벤트를 선택합니다.
(4) 아래와 같이 코드를 작성합니다.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'''SelectionChange 이벤트는 여러분이 워크시트 내의 어떤 셀(또는 영역)을 선택할 때마다
'''발생하는 이벤트입니다. SelectionChange 이벤트 핸들러 프로시저는 기본적으로 Target,
'''즉 현재 선택된 셀(영역)을 프로시저의 인수로 함께 전달합니다.
Dim rngSelect As Range
On Error Resume Next
Set rngSelect = Intersect(Target, [NoTouchArea])
'''문제의 Intersect 메서드가 드디어 나왔군요! Intersect는 '교차하다, 횡단하다, 가로지르다'
'''라는 의미를 지니고 있습니다. 사전적인 의미에서도 무슨 역할을 하는 메서드인지 짐작이
'''가시지요?
'''학교 다닐 때 수학 시간에 맨 처음 배우게 되는 단원이… '집합'입니다.
'''집합은 또 부분집합, 교집합, 합집합 등으로 나눌 수 있는데 이 중에서 교집합이 바로
'''Intersect 메서드에 의해 구해지는 영역인 것입니다. 먼 소린지 이해가 안 가신다구요?
'''아래 그림을 보세요(참 친절하기도 하다!). A라는 집합과 B라는 집합이 있다고 할 때
'''서로 중복되는 영역(C)이 존재합니다. 서로 겹쳐지는 이 영역을 구해주는 것이 Intersect
'''메서드입니다.
If Not rngSelect Is Nothing Then Target.Next.Select
'''rngSelect가 Nothing 이라는 것은 위의 그림과 같이 서로 겹쳐지는 영역이 없다는 뜻이겠지요?
'''그런데 앞에 Not 이라는 단어가 붙어 있으므로 중복되는 영역이 있을 경우, 그 다음 셀을
'''선택하라는 의미입니다.
End Sub
SelectionChange 이벤트는 여러분이 워크시트 내의 어떤 셀(또는 영역)을 선택할 때마다 발생하는 이벤트입니다. SelectionChange 이벤트 핸들러 프로시저는 기본적으로 Target, 즉 현재 선택된 셀(영역)을 프로시저의 인수로 함께 전달합니다.
Step 3: 문제의 Intersect 메서드
문제의 Intersect 메서드가 드디어 나왔군요! Intersect는 '교차하다, 횡단하다, 가로지르다'라는 의미를 지니고 있습니다. 사전적인 의미에서도 무슨 역할을 하는 메서드인지 짐작이 가시지요? 학교 다닐 때 수학 시간에 맨 처음 배우게 되는 단원이… '집합'입니다. 집합은 또 부분집합, 교집합, 합집합 등으로 나눌 수 있는데 이 중에서 교집합이 바로 Intersect 메서드에 의해 구해지는 영역인 것입니다. 먼 소린지 이해가 안 가신다구요? 아래 그림을 보세요(참 친절하기도 하다!). A라는 집합과 B라는 집합이 있다고 할 때 서로 중복되는 영역(C)이 존재합니다. 서로 겹쳐지는 이 영역을 구해주는 것이 Intersect 메서드입니다.
rngSelect가 Nothing 이라는 것은 위의 그림과 같이 서로 겹쳐지는 영역이 없다는 뜻이겠지요? 그런데 앞에 Not 이라는 단어가 붙어 있으므로 중복되는 영역이 있을 경우, 그 다음 셀을 선택하라는 의미입니다.
응용해 보시면 재미난 것을 많이 만드실 수 있을 것입니다.
다음 시간에 또…
정리 — Intersect 메서드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 이벤트 | Worksheet_SelectionChange(ByVal Target As Range) | 선택할 때마다 발생 |
| 교집합 구하기 | Intersect(Target, [NoTouchArea]) | 겹치는 영역 반환 |
| 오류 대비 | On Error Resume Next | 교차 영역이 없을 때 오류 무시 |
| 판별 | If Not rngSelect Is Nothing | 겹치는 영역이 있는지 확인 |
| 이동 | Target.Next.Select | 다음 셀로 이동 |
자주 묻는 질문 (FAQ)
Q1. Intersect 메서드는 어떤 역할을 하나요?
둘 이상의 범위에서 서로 겹치는 부분, 즉 교집합을 구해 줍니다. 겹치는 부분이 없으면 Nothing을 반환합니다.
Q2. SelectionChange 이벤트는 언제 발생하나요?
워크시트에서 셀이나 영역을 선택할 때마다 발생하며 선택된 영역이 Target 인수로 전달됩니다.
Q3. 여러 곳으로 흩어진 영역에 이름을 정의하려면?
Ctrl 키로 영역을 모두 지정한 다음 삽입-이름-정의 메뉴 또는 이름 상자에서 이름을 지정합니다.
마치며
Intersect 메서드는 잘 활용하면 여러 경우에 응용할 수 있는 아주 재미있는 메서드입니다.