Exceller Home > VBA 강좌 > VBA 입문강좌

Exceller's VBA 입문강좌

최초 작성일 : 2004-12-14
최종 수정일 : 2004-12-14
강좌 읽음수 : 74,985회

작성자 : Exceller (권현욱, exceller@amorepacific.com)

강좌 제목 : 레인지 오브젝트 - Union, Intersect 메서드

지난 시간에 잭 니클라우스의 얘기를 소개해 드렸습니다. 스펜서 존슨의 <선물>이라는 책에도 이와 비슷한 구절이 나옵니다.
"멋진 미래의 모습은 어떠한지 그림을 그려라.
현실적인 계획을 세워 그것을 달성할 수 있게 하라.
계획을 지금 이 순간 행동으로 옮겨라."

크리스마스 이브가 열흘 앞으로 다가 왔습니다. 좀 이른 감이 없지 않지만, 미리 메리 크리스마스!! 입니다. ^^


VBA 입문강좌 : 중요한 오브젝트 몇 가지


가. 워크북 오브젝트(Workbook Object)

나. 워크시트 오브젝트(Worksheet Object)

다. 레인지 오브젝트(Range Object)


레인지 오브젝트 그 세번째 시간으로 Union 메서드와 Intersect 메서드에 대해 살펴보겠습니다.

이번 강좌도 Exceller의 책 <VBA로 엑셀에 날개달기>에서 발췌하여 싣습니다.


Union 메서드

수학에서 집합을 배울 때 집합에는 합집합, 교집합, 부분집합, 차집합, 여집합, 공집합, 유한집합, 무한집합 등 여러 종류가 있다고 들으셨을 것입니다(참으로 많기도 하지요? ^^). 이 중에서 Union 메서드는 서로 떨어져 있는 여러 영역(Range 오브젝트)의 합집합을 구하고자 할 때 사용합니다. 다음과 같은 데이터가 있다고 할 경우, 합집합에 해당하는 영역은 무엇일까요?

그림에서 선택한 영역, 즉 A1:E16 그리고 G11:J16 영역이 되겠지요.

이것을 어떻게 구하느냐 하면... 바로 Union 메서드를 이용하면 된다는 것입니다.

Sub Union_Method()

    Dim shtSheet As Worksheet
    Dim rngFirst As Range
    Dim rngSecond As Range
    Dim rngUnion As Range

    Set shtSheet = Sheets("Sheet6")
    Set rngFirst = shtSheet.Range("A1").CurrentRegion
    Set rngSecond = shtSheet.Range("G11").CurrentRegion
    Set rngUnion = Application.Union(rngFirst, rngSecond)

    rngUnion.Select
    MsgBox "두 영역의 합집합 : " & Selection.Address(rowabsolute:=False, _
                columnabsolute:=False)

End Sub

아! 상당히 복잡해 보입니다. 하지만 엑셀이나 VBA 강좌 시간에 여러 차례 말씀드린 것처럼 복잡한 것과 복잡해 보이는 것과는 차이가 있습니다. 위의 코드는 지금껏 우리가 VBA 기초강좌 시간에 보아왔던 것에 비해 길이가 조금 길어 복잡해 보이는 것일 뿐 실제로 복잡한 것은 아닙니다. 실제로 복잡한 것의 진수(?)를 보여 드릴까요?

"그가 생각하는 것을 나도 생각한다고 그가 생각하리라는 것을 나는 생각한다."John F. Nash Jr.

지정한 영역(A1 셀과 G11 셀)의 CurrentRegion 값을 rngFirst와 rngSecond 변수에 담아 둔 다음, 이것을 Union 메서드를 이용하여 합치는 것입니다.

황모군 : 그렇다면... 질문이 하나 있는데요... 이딴거는 배워서 어디다 써 먹나요?

좋은 질문입니다. 이것을 조금 응용해 보도록 하지요. A1:A100 영역 중에서 짝수 행 데이터만을 선택한 다음 녹색으로 칠하는 예제를 만들어 보도록 하지요.

대상 영역이 A1:A100 영역 정도밖에 되지 않으니 다행이지 A1:A1000 혹은 A1:A10000 영역쯤 된다고 생각해 보세요. Ctrl 키를 누른 채 마우스를 눌러대려면... 손가락에 쥐가 납니다. 하지만 우리는 다음과 같은 간단한 코드 몇 줄로 해결할 수 있습니다(이래도 VBA 안 배운다고 버팅기는 분이 계실래나...).

Sub Union_Method_2()

    Dim i As Integer
    Dim rngUnion As Range
    Set rngUnion = Cells(2, 1)

    For i = 2 To 100 Step 2
        Set rngUnion = Union(rngUnion, Cells(i, 1))
    Next i
    rngUnion.Select
    Selection.Interior.ColorIndex = 10

    MsgBox "짝수 행 셀에만 녹색을 칠하였습니다", , "www.iExceller.com"

End Sub

황모군 : 에이~~ 그것도 그다지 실용적이지 못한 것 같은데요...

Exceller : (정색을 하고 가까이 다가서며) 과연 그럴까요?

황모군 : (뜻밖의 강한 반응에 순간 움찔하다 다시 따지듯) 그게 아니라... 실무에서 그렇게 딥다 색칠만 하는 경우가 어디 있어요!

황모군처럼 앞의 예제도 전혀 실용성이 없다고 생각하는 분들을 위해 한 가지 예를 더 보여드리도록 하지요. 다음과 같은 성적표가 있다고 할 때 등급이 '합격'인 사람만 녹색으로 표시하는 예제입니다.

Sub Union_Method_3()

    Dim rngCell As Range
    Dim rngAverage As Range
    Dim rngSource As Range
    Dim rngUnion As Range
   

    Set rngAverage = Range("평균")
    Set rngSource = Range("Source")

    With rngSource
        .Interior.ColorIndex = xlNone
        .Font.ColorIndex = 1
    End With
    MsgBox "기존 서식을 지웠습니다. 이제 합격자들에 대해 표시를 합니다."

    For Each rngCell In rngAverage
        With rngCell
            If .Offset(0, 1) = "합격" Then
                If rngUnion Is Nothing Then
                    Set rngUnion = Range(.Offset(0, -4), .Offset(0, 1))
                Else
                    Set rngUnion = Union(rngUnion, Range(.Offset(0, -4), .Offset(0, 1)))
                End If
            End If
        End With
    Next rngCell
    rngUnion.Select

    With Selection
        .Interior.ColorIndex = 10
        .Font.ColorIndex = 2
    End With

End Sub

 


Intersect 메서드

Intersect 메서드와는 반대로 Intersect 메서드를 사용하면 두 개 이상의 영역 중에서 서로 겹쳐지지 않는 영역의 주소를 알아낼 수 있습니다. 수학으로 치면 교집합에 해당하는 영역을 구해주는 것입니다.

Sub Intersect_Method()

    Dim rngFirst As Range
    Dim rngSecond As Range
    Dim rngIntersect As Range
    Dim i As Integer
   

    Set rngFirst = ActiveSheet.Range("A1:D8")
    Set rngSecond = ActiveSheet.Range("C5:G12")

    rngFirst.Select
    MsgBox "첫번째 영역입니다", , "www.iExceller.com"

    rngSecond.Select
    MsgBox "두번째 영역입니다. 이제 교차영역을 표시합니다.", , "www.iExceller.com"

    Set rngIntersect = Application.Intersect(rngFirst, rngSecond)
    rngIntersect.Select

    For i = 1 To 1000
        rngIntersect.Interior.ColorIndex = Rnd * 56
    Next i

End Sub
 

어느 곳에 어떻게 활용할 것인가 하는 것은 결국은 응용력의 문제이며, 응용력은 평소에 (자신의 문제를) 얼마나 문제의식을 갖고 깊이 있게 고민해 보았느냐에 따라 결정됩니다. 그래서 VBA 프로그래밍의 경우, 신입사원이나 업무에 익숙하지 않은 분들보다 해당 업무에 노련한 분들이 대체로 빨리 습득하시더군요. 어떻게 응용할 것인지에 대해 많이 고민해 보세요.


Previous

Next

Creative Commons License