• 최초 작성일: 2000-05-22
  • 최종 수정일: 2026-09-30
  • 조회수: 17 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 오브젝트와컬렉션제어구조

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

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

Excel Programmer가 되면(아마추어든 프로든) 점점 더 많은 시간을 오브젝트와 컬렉션을 가지고 작업을 하게 될 것입니다. 따라서 오브젝트와 컬렉션을 보다 효과적으로 컨트롤 할 수 있는 방법을 알고 있다면 작업하기가 한결 수월할 것입니다.

VBA에서는 오브젝트와 컬렉션의 보다 효과적인 조작을 위한 두가지 중요한 구조(Construct)를 제공합니다. With ~ End With 구조와 For Each ~ Next 구조가 바로 그것이지요.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

오브젝트와컬렉션제어구조

핵심 요약: With와 For Each

With ~ End With는 코드를 간결하고 빠르게 만들고, For Each ~ Next는 컬렉션 안의 모든 오브젝트에 같은 작업을 수행합니다.

  • With ~ End With: 같은 오브젝트명을 반복해서 쓰지 않아도 됩니다.
  • For Each ~ Next: 컬렉션의 모든 오브젝트를 하나씩 처리합니다.
  • 활용: 시트 이름 표시, 영역의 모든 셀에 임의 색상 채우기

Step 1: 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() * 55 + 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"
        .Size = 12
        .ColorIndex = Rnd() * 55 + 1
        .Underline = xlSingle
    End With
End Sub

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

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

Step 2: 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 내에 있는 모든 개체(오브젝트)에
    '다음의 명령을 수행하라는 것이지요.

        rngCell.Interior.ColorIndex = Rnd * 55 + 1
        '각 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

참고: ColorIndex는 엑셀 2003까지의 56색 팔레트 방식입니다. 엑셀 2007 이후에는 Color 속성에 RGB(r, g, b) 값을 지정해 훨씬 다양한 색을 쓸 수 있습니다. 또한 Rnd는 Randomize를 먼저 실행하지 않으면 엑셀을 켤 때마다 같은 순서의 값이 나오므로, 매번 다른 색을 원하시면 프로시저 처음에 Randomize를 넣어 주세요.

어떻습니까? 생각보다는 간단하지요?(아니라구요?) 생각보다 복잡하다고 해도 너무 걱정하지 마시기 바랍니다. 자꾸 접하다 보면 우리말 하듯이 자연스러워 질 날이 올테니까…

마무리

다음 시간에 또…

정리 — 제어구조 핵심 정리

구조 형태 용도
With ~ End With With Range("b50") ... End With 한 오브젝트에 여러 조작
For Each ~ Next For Each sht In Worksheets 컬렉션 전체 순회
셀 색 채우기 rngCell.Interior.ColorIndex 영역 내 모든 셀 처리

자주 묻는 질문 (FAQ)

Q1. With ~ End With의 장점은 무엇인가요?

코드가 간결해지고 수행속도가 빨라지며, 오브젝트명을 수정할 때 한 곳만 고치면 됩니다.

Q2. For Each ~ Next는 언제 사용하나요?

컬렉션 내의 모든 오브젝트에 대해 어떤 작업을 수행해야 할 때 사용합니다.

Q3. Rnd는 어떤 값을 돌려주나요?

0과 1 사이의 임의의 숫자를 돌려줍니다. 워크시트의 =RAND() 함수와 비슷합니다.

마치며

처음에는 복잡해 보여도 자꾸 접하다 보면 우리말 하듯이 자연스러워질 날이 옵니다.