You are on page 1of 6

01/22/2021 20:52:20 Sheet1 506906196.

xls

LECTURE NO: VB0014(오브젝트와컬렉션제어구조)//By Exceller

Homepage// Exceller's Home


E-mail// exceller@netian.com

Excel Programmer(외국에서 보면, 사실은 외국의 홈페이지, News Group에서 보면) 엑셀 프로그래머 또는
Solution Provider, Spreadsheet Developer라는 말들을 많이 합니다. 단순히 엑셀을 사용하는 것이 아니라
VBA를 사용해서 업무의 특성에 맞도록 여러가지 솔루션을 만드는 별도의 직업이 존재한다고도 하더군요

Excel Programmer가 되면(아마추어든 프로든) 점점 더 많은 시간을 오브젝트와 컬렉션을 가지고 작업을


하게 될 것입니다. 따라서 오브젝트와 컬렉션을 보다 효과적으로 컨트롤 할 수 있는 방법을 알고 있다면
작업하기가 한결 수월할 것입니다.

VBA에서는 오브젝트와 컬렉션의 보다 효과적인 조작을 위한 두가지 중요한 구조(Construct)를 제공합니다


With ~ End With 구조와 For Each ~ Next 구조가 바로 그것이지요.

With ~ End With 구조

With ~ End With 구문은 하나의 오브젝트에 대해 여러 가지 조작을 할 때 코드자체를 매우 간결하게 표현할 수
있도록 해 줍니다. 옆의 버튼을 누르세요.

Sub ChangeFont()
Range("b24").ClearContents
Range("b24").Value = "Learning Visual Basic"
Range("b24").Select
Selection.Font.Name = "Arial"
Selection.Font.FontStyle = "Bold Italic"
Selection.Font.Size = 12
Selection.Font.ColorIndex = Rnd() * 56 + 1
Selection.Font.Underline = xlSingle
End Sub

프로시저에 대해 간단히 설명을 드리자면,

먼저, b24셀의 내용을 지우고


b24셀에 "Learning Visual Basic"이라는 문자열을 삽입합니다.
b24셀을 선택한 다음,
폰트 이름을 "Arial"로, FontStyle을 "굵은 이탤릭체"로, 폰트 크기를 12(포인트)로 지정을 합니다.
글자의 색깔을 임의의 색으로 지정해 준 다음,
글자에 밑줄을 지정해 주는 것이지요.

위의 프로시저는 range 오브젝트에 대해 3개의 프로퍼티를, font 오브젝트에 대해 5개의 프로퍼티를 사용해서
작업을 하고 있는데 매번 오브젝트명을 다 불러서 작업을 하고 있습니다. 이렇게 하면 보기에도 좋지 않을뿐
아니라 수행속도도 느려터지게 됩니다.(지금은 코드가 짧아서 별로 큰 차이는 나지 않겠지만…)

Sub ChangeFont2()
With Range("b50")
.ClearContents
.Value = "Learning Visual Basic"
.Select
End With
With Selection.Font
.Name = "Arial"
.FontStyle = "Bold Italic"

6쪽 중 1쪽
01/22/2021 20:52:20 Sheet1 506906196.xls

.Size = 12
.ColorIndex = Rnd() * 56 + 1
.Underline = xlSingle
End With
End Sub

두 개의 프로시저를 비교해 보시기 바랍니다.

사람에 따라서는 "첫번째 프로시저가 더 보기 편한데"라고 생각할 수도 있습니다. 물론 맨 위 프로시저가


더 직접적으로 코딩을 한 것이기 때문에 그렇게 보일 수도 있습니다만 작업 수행속도 측면에서 보자면 아래의
것이 훨씬 빠른 속도를 보입니다. 뿐만 아니라 나중에 오브젝트명을 수정해야 할 경우를 가정해 보세요
ChangeFont 프로시저는 모든 라인의 오브젝트명을 모두 바꿔 주어야 하나 ChangeFont2 프로시저는 위의
노란색 라인에 있는 오브젝트명만 고쳐주면 되니까 더 쉽겠지요.

For Each ~ Next 구조

Collection is a group of related objects. 즉 컬렉션은 서로 관련있는(비슷한) 오브젝트의 집합체입니다


예를 들어, Workbooks컬렉션은 모든 Workbook 오브젝트의 컬렉션이고, Cells는 모든 Cell의 컬렉션인 것이지요

그렇다면 컬렉션 내의 모든 오브젝트에 대해 어떤 작업을 수행해야 할 경우에는 어떻게 해야 할까요?


이럴 경우에 For Each ~ Next 구문을 사용하면 쉽게 해결책을 찾을 수가 있는 것입니다. 말로해서는 잘 이해가
되시지를 않지요? 옆의 버튼을 누르세요.

현재 워크북에 있는 시트의 이름들이 차례로 메시지 박스안에 나타나지요?

Sub ShowName()
Dim sht As Worksheet
For Each sht In Worksheets
MsgBox sht.Name, , "//Exceller"
Next sht
End Sub

워크북 오브젝트 내의 워크시트 컬렉션을 For Each ~ 라는 구문에 의해 하나씩 접근해 가면서 해당작업을
진행하는 프로시저이지요.
또다른 예를 살펴볼까요?

특정 영역 내의 모든 셀이 임의의 색상으로 채워지지요? 이것도 range 오브젝트 내의 cells 컬렉션을 제어


함으로써 가능한 것입니다. 아래의 코드를 보세요.

Sub ColoringCells()
Dim rngCell As Range
'rngCell이라는 변수를 하나 정의해 주고,

Range("Stage").Clear
'Stage라는 영역의 내용을 없앤 다음,

For Each rngCell In Range("Stage")


'이 부분이 중요합니다. For Each OOO In XXX라고 하게 되면 XXX 내에 있는 모든 개체(오브젝트)
'다음의 명령을 수행하라는 것이지요.

6쪽 중 2쪽
01/22/2021 20:52:21 Sheet1 506906196.xls

rngCell.Interior.ColorIndex = Rnd * 56
'각 rngCell(즉 Stage라는 영역 내의 각각의 셀)에 대해 ColorIndex(셀에 색깔을 입히는 속성입니다
'지정해 주라는 명령이지요. 가만있자 Rnd라는 명령에 대해 설명을 드렸던가요? 세가지 강좌를 병행
'하려니까 마구 헷갈리네요. 또 하지요 뭐!
'Rnd는 0과 1사이의 임의의 숫자를 발생시켜 주는 Visual Basic 명령어 입니다. Excel에서도 이와 유사한
'함수가 있습니다. 워크시트 내의 아무 셀에나 가서 =rand()라고 입력하고 엔터키를 쳐 보세요. 0~1
'에 있는 임의의 수가 나타날 것입니다.
'그리고 ColorIndex는 1에서 56까지의 값을 갖습니다. 즉,
'ColorIndex가 1이면 검정색,
'ColorIndex가 2이면 흰색,
'ColorIndex가 3이면 빨간색,
'ColorIndex가 4이면 연두색,… 등 총 56가지의 색상값이 숫자 형태로 저장이 되어 있습니다.
'각 색상값에 대해서는 도움말을 참고하시기 바랍니다.
Next rngCell
End Sub

어떻습니까? 생각보다는 간단하지요?(아니라구요?)


생각보다 복잡하다고 해도 너무 걱정하지 마시기 바랍니다. 자꾸 접하다 보면 우리말 하듯이 자연스러워
질 날이 올테니까…

다음 시간에 또…

5/22/2000

6쪽 중 3쪽
01/22/2021 20:52:21 Sheet1 506906196.xls

실은 외국의 홈페이지, News Group에서 보면) 엑셀 프로그래머 또는


eloper라는 말들을 많이 합니다. 단순히 엑셀을 사용하는 것이 아니라
록 여러가지 솔루션을 만드는 별도의 직업이 존재한다고도 하더군요.

든 프로든) 점점 더 많은 시간을 오브젝트와 컬렉션을 가지고 작업을


컬렉션을 보다 효과적으로 컨트롤 할 수 있는 방법을 알고 있다면

효과적인 조작을 위한 두가지 중요한 구조(Construct)를 제공합니다.

젝트에 대해 여러 가지 조작을 할 때 코드자체를 매우 간결하게 표현할 수

해 3개의 프로퍼티를, font 오브젝트에 대해 5개의 프로퍼티를 사용해서


다 불러서 작업을 하고 있습니다. 이렇게 하면 보기에도 좋지 않을뿐

6쪽 중 4쪽
01/22/2021 20:52:21 Sheet1 506906196.xls

더 보기 편한데"라고 생각할 수도 있습니다. 물론 맨 위 프로시저가


에 그렇게 보일 수도 있습니다만 작업 수행속도 측면에서 보자면 아래의
아니라 나중에 오브젝트명을 수정해야 할 경우를 가정해 보세요.
오브젝트명을 모두 바꿔 주어야 하나 ChangeFont2 프로시저는 위의

cts. 즉 컬렉션은 서로 관련있는(비슷한) 오브젝트의 집합체입니다.


Workbook 오브젝트의 컬렉션이고, Cells는 모든 Cell의 컬렉션인 것이지요.

사용하면 쉽게 해결책을 찾을 수가 있는 것입니다. 말로해서는 잘 이해가

을 For Each ~ 라는 구문에 의해 하나씩 접근해 가면서 해당작업을

으로 채워지지요? 이것도 range 오브젝트 내의 cells 컬렉션을 제어

OO In XXX라고 하게 되면 XXX 내에 있는 모든 개체(오브젝트)에

6쪽 중 5쪽
01/22/2021 20:52:21 Sheet1 506906196.xls

내의 각각의 셀)에 대해 ColorIndex(셀에 색깔을 입히는 속성입니다)를


있자 Rnd라는 명령에 대해 설명을 드렸던가요? 세가지 강좌를 병행

를 발생시켜 주는 Visual Basic 명령어 입니다. Excel에서도 이와 유사한


아무 셀에나 가서 =rand()라고 입력하고 엔터키를 쳐 보세요. 0~1 사이

지 마시기 바랍니다. 자꾸 접하다 보면 우리말 하듯이 자연스러워

6쪽 중 6쪽

You might also like