• 최초 작성일: 2000-03-27
  • 최종 수정일: 2026-09-30
  • 조회수: 21 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 사각형그리기Ⅱ

들어가기 전에

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

Visual Basic을 왜 배워야 하는지, 배우면 무엇을 할 수 있는지 질문하신 분이 있더군요. 가장 중요한 질문인 것 같습니다. 목적이 분명하지 않다면 쉽게 포기하거나 표류하기 십상이니까요. 앞으로 강좌를 따라 하시다 보면 저절로 느끼시게 될 것입니다만, VB로 어떤 일을 할 수 있는지 개략적인 것은 오늘 함께 띄운 파일을 참고하시기 바랍니다. "인터넷의 한계는 인간의 창의력"이라면 VB의 한계는… 상상력의 한계라고 해 둘까요. 수작업으로 할 수 있는 것이면 거의 대부분 가능합니다.

VB를 제대로 공부하지 않고 그냥 수박 겉핥기로만 배운 사람들이 "비주얼 베이직은 BASIC 언어에서 비롯되었기 때문에 한계가 많아서 …" 운운하는 경향이 있습니다.

절대 그렇지 않습니다!!! 비주얼베이직은 마이크로소프트사에서 정책적으로 키우는 언어입니다. VB 본연의 라이브러리 외에 DAO(Data Access Object)의 각종 오브젝트들, 각종 DLL(Dynamic Link Library) 파일들, API 함수 등을 모두 불러와서 쓰면 그 확장성은 거의 무한대 입니다.

뿐만 아니라 ODBC(Open DataBase Connectivity)를 활용하여 오라클이나 SyBase 같은 각종 데이터 베이스들도 (거의) 완벽하게 불러와서 쓸 수 있다고 합니다(요부분은 Exceller가 테스트 해 본 사항은 아니고... MS社의 매뉴얼에 보면 그렇게 나와 있습니다).

지구상에 없는 새로운 것을 만들려면 C언어나 그 밖의 언어를 배우시고 이 세상에 이미 존재하는 것들을 잘 조합해서 더 성능이 뛰어난 어떤 것을 만들려면 VB(VBA)를 배우시기를 권합니다(더 중요한 것! VBA를 배우려고 추가 비용을 들여 프로그램을 구입할 필요가 없다는 것이지요).

본론으로 돌아와서… 지난 시간에 워크시트에 사각형 그리는 것에 대해 설명을 드렸지요? 왜 허구많은 예제 다 놔두고 업무적으로 별 도움이 안되는(안될 것 같은) 사각형을 그리라고 하는 것이야!' 하고 생각하시는 분 없으신지?

제가 경험한 바에 의하면 순환, 반복문을 몸에 붙이는 가장 좋은 방법이 사각형 그리는 것이 더군요. 아무 이유없이 그저 보기 좋으라고 사각형을 그리는 것이 아님을 아시고…

이번 강좌에서는 사각형그리기 코드에 대해 하나하나 설명을 드립니다.

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

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

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


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

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

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

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

사각형그리기Ⅱ

핵심 요약: 변수와 반복문

변수는 수시로 변하는 값을 담는 그릇이고, 크기(타입)에 맞게 선언해야 합니다. For ~ Next는 같은 명령을 반복해서 수행합니다.

  • Dim: 변수를 선언하는 명령입니다(Dimension의 줄임말).
  • 변수 타입: 값이 너무 크면 Integer에서 오버플로가 발생하므로 Double 등으로 바꿉니다.
  • Set: Range 같은 오브젝트를 변수에 담을 때 사용합니다.
  • For ~ Next: 지정한 횟수만큼 명령을 반복합니다.

Step 1: 변수선언 (Dim)

먼저 사각형그리기 코드의 앞부분입니다.

    Dim intX As Integer
    Dim intY As Integer
    Dim rngAdd As Range

Dim OOO As Integer/Object 이런 것들이 도대체 무엇인지 의문이 들지요? Dim은 Dimension의 줄임말로 '변수선언'이라고 합니다. 프로그래밍을 배울 때 가장 신경쓰이지만 또한 가장 중요한 것이 바로 이 변수선언 입니다. 변수란 무엇이고 이것을 선언한다는 것은 무엇인가? 백문이 불여일견! 직접 확인해 보도록 하지요.

B55, B56 셀에 적당한 숫자(예: 50, 35)를 각각 입력한 후 버튼을 누르세요.(너무 큰 수는 말고!)

답이 탁 나왔지요? 다른 값으로 바꾸어 넣고 다시 위의 버튼을 눌러 보세요. 마찬가지로 답이 나오지요? 위의 버튼은 아래의 코드를 실행시켜 주는 것입니다.

Sub 변수란무엇인가()
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer

    i = Sheets("Sheet1").Range("b55").Value
    j = Sheets("Sheet1").Range("b56").Value
    k = i * j
    Sheets("Sheet1").Range("b57") = k
End Sub

위의 예에서 보듯이 변수라는 것은 "수시로 변화하는 어떤 값을 담아두는 그릇"이라고 할 수 있습니다. 그런데 이 그릇에는 싸이즈가 정해져 있고 각 싸이즈별로 많은 종류의 그릇, 즉 변수가 준비되어 있습니다. 슬슬 신경질이 날라구 하지요? 변수도 잘 모르겠는데 한 종류의 변수만 있는 게 아니고 종류별로 있다니!!!

쉽게 설명하자면... 여러분의 집 주방에 있는 그릇들을 한번 떠올려 보세요. 밥을 담는 밥그릇, 국을 담는 국그릇, 반찬 그릇, 간장 종지, 큰 대접 등등등… 얼마나 많은 그릇이 있습니까? 간장을 국그릇에 부어놓고 먹는 사람은 없겠지요.

변수도 마찬가지입니다. 각 상황에 맞는 그릇들을 모두 준비해 두었기 때문에 종류가 많은 것이지요.

B55, B56 셀에 큰 숫자를 한번 넣고 "변수란 도대체 무엇인가" 코드를 다시 한번 실행시켜 보세요.

"오버플로(Overflow)"라는 에러 메시지가 나타나지요?

이것은 준비한 그릇싸이즈보다 더 큰 값이 들어오니까 넘쳐서 나타나는 에러입니다. Dim OOO As Integer에서 Integer 대신에 Double이라고 고쳐 넣고 다시 실행시켜 보시기 바랍니다. 이제는 아무리 큰 값을 넣어도 제대로 실행이 되지요? 이것이 바로 변수의 타입, 즉 종류인 것입니다.

그러면 또 이런 의문이 또 들지요? "그렇다면 처음 시작할 때 부터 큰 변수타입을 선언하면 될텐데 무엇 때문에 작은 변수를 선언하나요?"

라면하나 끓이는 데 가마솥 걸어놓고 끓이는 사람은 없겠지요? 이유는 바로 비경제적이기 때문입니다. 컴퓨터에서 그릇은 메모리와 직결됩니다. 즉 큰 그릇을 많이 준비하면 할수록 시스템의 성능 저하로 연결될 수 있기 때문이지요. 변수에 대해서는 여기까지만 이해하시고 넘어가도록 합니다. 앞으로 계속해서 귀가 아프도록, 아니 눈이 아프도록 반복될 테니까요.

Step 2: 셀 위치를 변수에 담기

    Set rngAdd = ActiveSheet.Range("e5")

다음으로 ActiveSheet라는 것은 말 그대로 Active 즉, 현재 시트라는 뜻이므로 현재 시트의 e5 셀의 위치를 rngAdd라는 변수에 담아둡니다.

Step 3: For ~ Next 구문

    For intX = 20 To 120 Step 10
        For intY = 20 To 120 Step 10
            ActiveSheet.Rectangles.Add(rngAdd.Left + intY, _
                rngAdd.Top + intX, 8, 8).Select
            Selection.Interior.ColorIndex = Int(Rnd * 56) + 1
        Next intY
    Next intX

중요한 For … Next 구문이 나왔네요.

For I = 1 To 100
    …… 어쩌구 저쩌구 ……
Next

라고 하게 되면 "…… 어쩌구 저쩌구 …… "라는 명령을 1에서 100 즉 100번 수행하라는 것입니다.

만약 For … Next라는 구문이 없다면 어떻게 될까요? "…… 어쩌구 저쩌구 …… "라는 문장을 100번 적어주어야 겠지요?

Step 4: 프로시저 마무리

    Range("d4").Select

d4셀을 Select 즉 선택하고 프로시저를 종료합니다.

전체 코드를 이어 붙이면 다음과 같습니다.

Sub MakeRectangles1()
    Dim intX As Integer
    Dim intY As Integer
    Dim rngAdd As Range

    Set rngAdd = ActiveSheet.Range("e5")

    For intX = 20 To 120 Step 10
        For intY = 20 To 120 Step 10
            ActiveSheet.Rectangles.Add(rngAdd.Left + intY, _
                rngAdd.Top + intX, 8, 8).Select
            Selection.Interior.ColorIndex = Int(Rnd * 56) + 1
        Next intY
    Next intX

    Range("d4").Select
End Sub

참고: Rectangles 컬렉션은 Excel 97 시절부터 쓰던 옛 방식입니다. 지금도 동작하지만, 새로 작성하실 때는 ActiveSheet.Shapes.AddShape(msoShapeRectangle, Left, Top, 8, 8)처럼 Shapes 컬렉션을 사용하시는 것이 좋습니다. 또한 ColorIndex는 1~56 범위이므로 Int(Rnd * 56) + 1처럼 0이 나오지 않게 해야 오류가 나지 않습니다.

마무리

실제 코드는 몇 줄 안되는데 이것 저것 설명을 드리다 보니 좀 복잡하게 되어 버렸네요. 위의 내용들 중에서 정작 중요한 것은 검게 색칠된 부분들입니다.

프로그래밍은 반복입니다. 중요한 몇 개의 구문을 가지고 이렇게도 해보고 저렇게도 해보고 하면서 이해하게 되는 것이니까 처음에 잘 이해가 안된다고 해서 "난 안돼!!!" 하지 마시기를…

오늘은 여기까지…

정리 — 변수와 반복문 요약

구분 코드 설명
변수 선언 Dim i As Integer 정수형 변수 선언
오브젝트 대입 Set rngAdd = ActiveSheet.Range("e5") e5 셀 위치를 변수에 저장
반복문 For intX = 20 To 120 Step 10 20부터 120까지 10씩 증가
난수 색상 Int(Rnd * 56) + 1 1~56 사이 색상 번호

자주 묻는 질문 (FAQ)

Q1. 변수 타입이 여러 가지인 이유는 무엇인가요?

담을 값의 크기에 맞는 그릇을 준비하는 것으로, 큰 변수를 많이 쓰면 메모리를 낭비해 시스템 성능이 저하될 수 있기 때문입니다.

Q2. 오버플로(Overflow) 에러는 왜 발생하나요?

변수 타입이 담을 수 있는 크기보다 큰 값이 들어오면 발생합니다. Integer 대신 Double 등으로 바꾸면 해결됩니다.

Q3. 왜 사각형 그리기로 반복문을 배우나요?

순환·반복문을 몸에 붙이는 가장 좋은 방법이 사각형을 반복해서 그리는 것이기 때문입니다.

마치며

프로그래밍은 반복입니다. 처음에 잘 이해가 안 된다고 해서 "난 안돼!!!" 하지 마시기 바랍니다.