• 최초 작성일: 2000-05-08
  • 최종 수정일: 2026-09-30
  • 조회수: 17 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 매크로 기록 기능에 대하여

들어가기 전에

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

VB0007 강좌에서 "매크로 기록"에 대해 간단하게 설명을 하였습니다. "매크로 기록"에 대한 정의를 내려 본다면, "Excel에서의 거의 모든 동작을 VBA 코드로 Converting, 즉 자동 변환시키는 것"이라 할 수 있을 것입니다.

이것은 매우 유용한 도구임에는 틀림이 없지만 한계가 존재한다는 사실은 분명히 알고 넘어가는 것이 좋겠습니다.

  1. 매크로 기록은 간단한 매크로만 기록하도록 합니다.
  2. 매크로 기록은 순환문(Loop문), 변수지정, 조건 분기 실행(If문 등) 등의 작업은 할 수가 없습니다. MsgBox나 InputBox도 사용할 수 없지요.
권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

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

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


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

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

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

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

매크로 기록 기능에 대하여

핵심 요약: 매크로 기록 코드 최적화

매크로 기록은 유용하지만 코드가 효율적이지 않으므로, 기본 형태만 참고해 Offset과 With ~ End With로 최적화해야 합니다.

  • 한계: 반복문, 변수 지정, If 분기, MsgBox, InputBox는 기록할 수 없습니다.
  • Offset: ActiveCell.Offset(1, 2)는 아래로 1칸, 오른쪽으로 2칸 이동합니다.
  • With ~ End With: 반복되는 오브젝트명을 줄여 읽기 쉽고 빠르게 만듭니다.
  • 대입: A=B는 오른쪽 값을 왼쪽에 대입한다는 뜻입니다.

Step 1: 매크로 기록 따라해 보기

백문이 불여일견, 백견이 불여일타지요? 직접 해 보도록 하지요.

  1. 새로운 워크북(파일)을 하나 만듭니다.
  2. 만약 창크기가 최대로 되어 있다면 크기를 줄여 적당한 크기로 만듭니다.
  3. VB Editor를 활성화 시킵니다.(Alt + F11키를 누르거나 "도구-매크로-Visual Basic Editor"를 선택하면 되겠지요?)
  4. 그런 다음에 엑셀창과 VBE 창의 크기를 아래와 같이 적당히 조절하여 두 창의 내용이 모두 잘 보이도록 설정해 줍니다.
엑셀 창과 VBE 창을 나란히 배치한 화면
아이엑셀러
  1. 엑셀창을 활성화시키고(요 부분을 마우스로 클릭해 주면 되겠지요?), "도구-매크로-새 매크로 기록" 메뉴를 선택합니다.
  2. VB Editor를 활성화시키고 Module1을 더블클릭 합니다. 그러면 모듈시트의 내용이 화면에 나타납니다. 물론 아직 기록된 게 없으므로 그냥 흰 화면만 나타나지요.
  3. 다시 엑셀창을 활성화시키고 기록을 시작합니다. 지금부터 기록하는 것은 이 부분에 하나씩 하나씩 기록이 되어질 것입니다(당연히 자동으로 기록이 됩니다).
  4. a1셀에 "1월"이라고 입력을 합니다(인용부호는 빼고!). 나머지 셀에 대해서도 아래의 그림과 같이 입력을 합니다.
A1:C2 셀에 1월~3월과 값을 입력한 화면
아이엑셀러
  1. 입력이 끝났으면 기록중지 버튼을 누르거나 "도구-매크로-기록 중지" 메뉴를 선택합니다.

참고: 최근 버전의 Excel에서는 [개발 도구] 탭의 [매크로 기록]/[기록 중지]를 사용합니다. [개발 도구] 탭이 보이지 않으면 [파일-옵션-리본 사용자 지정]에서 체크하세요.

Step 2: 기록된 코드 살펴보기

제대로 기록이 되었다면 아마 아래와 같은 형태의 코드가 기록이 되어져 있을 것입니다.

Sub Macro1()
'
' Macro1 Macro
' 권현욱이(가) 2000-04-30에 기록한 매크로
'
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "1월"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "2월"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "3월"
    Range("A2").Select
    ActiveCell.FormulaR1C1 = 1000
    Range("B2").Select
    ActiveCell.FormulaR1C1 = 900
    Range("C2").Select
    ActiveCell.FormulaR1C1 = 1500
    Range("C3").Select
End Sub

생각보다 복잡하지요? 사실 이 코드는 불필요한 요소들이 많이 포함되어 있습니다. 그다지 효율적인 코드라고는 할 수가 없는 것이지요. 이것과 똑같은 기능을 수행하지만 보다 간단한 형태로 직접 입력을 해 보지요.

Sub Modified1()
    Range("a1").Select
    ActiveCell.Offset(0, 0) = "1월"
    ActiveCell.Offset(0, 1) = "2월"
    ActiveCell.Offset(0, 2) = "3월"
    ActiveCell.Offset(1, 0) = 1000
    ActiveCell.Offset(1, 1) = 900
    ActiveCell.Offset(1, 2) = 1500
End Sub

ActiveCell이라는 것은 현재 셀포인터가 위치해 있는 셀을 가리키는 것입니다. 그리고 Offset() 함수는 "이런 기능 아세요?" 시간에 몇번 설명을 드렸던 기억이 나는데 이해하시는지? ActiveCell.Offset(1,2)라고 하게 되면 현재 셀에서 밑으로 한칸, 오른쪽으로 2칸 옮겨가라"는 명령입니다.

만약 현재셀(즉 ActiveCell)이 A1이라면, ActiveCell.Offset(1,2)라고 하게 되면 결과는 C2, 즉 셀 포인터는 C2 셀로 이동이 되어 있겠지요?

여기서 또 한가지 주의해야 할 점! 보통 수학에서 A=B라고 하게 되면 "A와 B는 같다"라는 것을 의미하지요? 그런데 프로그래밍 언어에서는 그렇지 않습니다. 이것을 어떻게 받아들이느냐 하면 "오른쪽에 있는 (변수)값을 왼쪽에 대입(assign)하라"로 인식을 하게 되지요. 물론 예외는 있습니다. If 구문에서 조건식 부분에 쓰게 되면 서로 같은지를 비교하는 형태가 되긴 하지만 그것은 말그대로 예외적인 경우이고 그 이외의 경우에는 우변의 값을 좌변의 변수에 대입하라는 의미입니다.

그런데 위와 같이 코딩을 하는 사람은 아마 아무도 없을 것입니다. 우리는 지금 배우는 단계니까 이렇게 하지만... 이렇게 짜서는 어디가서 프로그램 짠다고 명함도 못내밀 것입니다. ^^ 왜냐하면 위의 동그라미 친 부분, 즉 ActiveCell이라는 문장이 계속 반복이 되어 나타나지요? 이렇게 되면 모양도 모양이지만 수행속도도 느려터지게 됩니다. 조직에서도 반복되는 요소가 많으면 비효율적인 것이 되듯이 프로그래밍에서도 이것은 마찬가지이지요.

Step 3: With ~ End With로 단축하기

위의 코드는 With ~ End With 구문을 사용하여 아래와 같이 또 단축시킬 수가 있습니다.

Sub Modified2()
    Range("a1").Select
    With ActiveCell
        .Offset(0, 0) = "1월"
        .Offset(0, 1) = "2월"
        .Offset(0, 2) = "3월"
        .Offset(1, 0) = 1000
        .Offset(1, 1) = 900
        .Offset(1, 2) = 1500
    End With
End Sub

훨씬 읽기도 용이하지요? 실제 프로그래밍을 할 때는 대개 위 Modified2와 같은 형태로 코딩을 합니다.

참고: 위 코드는 셀을 Select하며 입력하는 방식이지만, 실무에서는 Select 없이 범위에 값을 한 번에 넣는 것이 더 빠르고 간단합니다. 예를 들어 다음과 같이 쓸 수 있습니다.

Sub Modified3()
    Range("A1:C1").Value = Array("1월", "2월", "3월")
    Range("A2:C2").Value = Array(1000, 900, 1500)
End Sub

정리

오늘의 내용을 요약하자면, 매크로 기록에 의해 작성된 코드는 항상 효율적인 것은 아니라는 것! 따라서 기본적인 형태만 참고한 후 가독성과 수행속도를 높일 수 있도록 코드를 최적화(전문용어로 Optimizing 이라고 합니다) 시켜야 한다는 것! 이것을 명심하도록 하세요.

또 한가지 중요한 Offset() 함수와 With ~ End With 구문의 사용법을 명확히 이해하고 넘어 가시도록!(Offset() 함수는 X0024 강좌에 상세히 설명되어 있습니다)

마무리

오늘은 여기까지…

정리 — 매크로 기록 최적화 요약

구분 코드 설명
기록된 코드 Range("B1").Select / ActiveCell.FormulaR1C1 = "2월" 불필요한 요소가 많음
Offset 사용 ActiveCell.Offset(0, 1) = "2월" 현재 셀 기준 이동
With 사용 With ActiveCell ... End With 반복 제거
참고 Range("A1:C1").Value = Array(...) Select 없이 한 번에 입력

자주 묻는 질문 (FAQ)

Q1. 매크로 기록의 한계는 무엇인가요?

순환문, 변수 지정, 조건 분기 실행(If문 등)은 할 수 없고 MsgBox나 InputBox도 사용할 수 없습니다.

Q2. ActiveCell.Offset(1,2)는 무슨 뜻인가요?

현재 셀에서 아래로 한 칸, 오른쪽으로 두 칸 이동하라는 명령입니다. 현재 셀이 A1이면 C2가 됩니다.

Q3. With ~ End With를 쓰면 무엇이 좋은가요?

반복되는 오브젝트명(ActiveCell)을 줄여 읽기 쉽고 수행속도도 빨라집니다.

마치며

매크로 기록으로 만든 코드는 기본적인 형태만 참고하고, 가독성과 수행속도를 높이도록 최적화하는 것을 명심하시기 바랍니다.