• 최초 작성일: 2025-01-25
  • 최종 수정일: 2026-09-27
  • 조회수: 38 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: VBA 파워 코딩 253회 - 매크로 실행 취소

들어가기 전에

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

버린 서류를 다시 출력하며 든 생각

VBA로 코딩을 하다 보면, 이런 기능은 현실에서도 있으면 좋겠다, 싶은 것들이 있습니다. 대표적인 것으로 On Error Resume Next와 Undo가 있습니다.

On Error Resume Next는 "프로그램 실행 도중 오류가 발생하더라도 잔소리하지 말고 다음으로 넘어가라"는 의미입니다. (참고: 권현욱, <VBA 파워 코딩의 정석>, 282p, 2017)

On Error Resume Next의 의미를 나타낸 그림: 오류가 나도 잔소리하지 말고 다음으로 넘어가라
아이엑셀러

Undo는 '실행 취소' 기능입니다. 더는 볼 일이 없을 것 같아 그동안 보관해오던 100쪽 가까이 되는 서류를 자신 있게(!) 파기하자마자 다시 출력해야 하는 불상사가 생긴 이런 날 특히나 떠올리게 되는 기능입니다.

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

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

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


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

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

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

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

매크로 실행 취소 관련 아이디어 두 가지

핵심 요약: 매크로로 지운 내용을 되돌리는 두 가지 방법

매크로(VBA)로 작업하면 '실행 취소(Undo)'가 되지 않습니다. SendKeys 메서드로 키 입력을 흉내 내거나, 지우기 전에 셀 값을 배열에 저장해 두었다가 복구하면 됩니다.

  • 문제: ClearContents로 지운 내용은 Ctrl+Z로 되돌릴 수 없음
  • 방법 1: SendKeys "{DELETE}"로 지우고 SendKeys "^z"(또는 Application.Undo)로 복구
  • 방법 2: 셀 값을 배열에 저장 후 지우고, MsgBox에서 '예'를 선택하면 배열 값으로 복구
  • 특수 키 표기: Ctrl은 ^, Shift는 +, Alt는 %

내용을 지우는 매크로와 실행 취소 문제

어쩌다보니 최근에는 Excel 강좌를, 그것도 차트에 대한 것들만 주야장천(?)으로 올렸습니다. 해서 모처럼 만에 VBA 강좌를 올립니다. 그렇다고 'VBA로 차트 건드리기'를 주제로 할까요?(설마...)

아래와 같은 데이터가 있다고 할 때, 빨간 네모 안의 내용을 삭제하려면 ClearContents 메서드를 이용합니다. 빨간 네모 영역에 'MyRange'라는 이름을 미리 정의해 두었습니다.

"내용 지우기" 버튼을 클릭하면 지정한 영역 안의 내용이 말끔히 지워집니다. "내용 지우기" 버튼에 연결된 코드는 이렇습니다. 코드는 따로 설명을 하고 말고 할 것도 없을 만큼 단순합니다.

MyRange로 이름을 정의한 빨간 네모 영역과 내용 지우기 버튼
아이엑셀러
Sub ClearData()
    Range("MyRange").ClearContents
End Sub

참고: 원문 코드 수정

원문 코드에는 Range("MyRange").ClearContent로 되어 있었지만, 올바른 메서드 이름은 ClearContents(끝에 s)입니다. 본문 설명과 같은 이름으로 바로잡았습니다.

문제는 이렇게 매크로(VBA도 마찬가지)를 이용하여 작업을 한 경우, '실행 취소(UnDo)'가 되지 않는다는 겁니다. 어떻게 하면 좋을까요?

방법 1: SendKeys 메서드 이용

예제 파일에서 "지우기: SendKeys"와 "복구하기: SendKeys" 버튼을 차례로 눌러 보세요. 빨간 네모 상자 안(MyRange)의 내용이 지워졌다가 다시 나타나지요?

지우기: SendKeys 버튼으로 내용을 지우고 복구하기: SendKeys 버튼으로 되돌린 모습
아이엑셀러

버튼에 연결된 코드입니다.

Sub ClearBySendKeys()                ' [지우기: SendKeys] 버튼에 연결된 코드
    Range("MyRange").Select          ' MyRange 영역을 선택하고...
    Application.SendKeys "{DELETE}"  ' SendKeys 메서드를 이용하여 <Del> 키를
End Sub                              ' 누른 것과 같은 효과를 줍니다.

Sub RecoverBySendKeys()              ' [복구하기: SendKeys] 버튼에 연결된 코드
    Application.SendKeys "^z"        ' SendKeys 메서드를 이용하여 <Ctrl>+z 키를
End Sub                              ' 누른 것과 같은 효과를 줍니다.

Application.SendKeys "^z" 대신 Undo 메서드를 사용하여 다음과 같이 해도 됩니다.

Application.Undo

<Ctrl> 키뿐만 아니라 다른 특수 키를 사용할 수도 있습니다. <Shift> 키는 +, <Alt> 키는 %와 조합하면 됩니다.

방법 2: 배열(Array) 이용

이번에는 맨 아래에 있는 "지우기/복구하기" 버튼을 눌러 보세요. MyRange 범위 내의 데이터가 지워진 다음 MsgBox가 나타납니다. "예" 버튼을 클릭하면 지워졌던 데이터가 다시 나타납니다.

지우기/복구하기 버튼을 누르면 데이터가 지워지고 원래대로 돌릴지 묻는 MsgBox가 나타난 모습
아이엑셀러

"지우기/복구하기" 버튼에 연결된 코드를 살펴볼까요.

Sub ClearAndRecoverData()
    Dim i As Integer                    ' For~Next 문에서 사용할 변수
    Dim intNum As Integer               ' 선택 영역의 셀 수를 카운팅하기 위한 변수
    Dim strCell() As String             ' 각 셀의 내용을 저장할 동적 배열 변수
    Dim strYesNo As String              ' MsgBox의 선택 결과를 저장할 변수
    Dim rngTarget As Range              ' 작업 대상 범위를 지정할 변수(빨간 네모 부분)

    Set rngTarget = Range("MyRange")    ' 작업 대상 범위를 변수에 할당
    intNum = rngTarget.Cells.Count      ' 작업 대상 범위의 셀 수 카운팅
    ReDim strCell(intNum)               ' 동적 배열의 크기 지정

    For i = 1 To intNum                 ' 선택된 영역의 셀 수만큼 반복 실행
        strCell(i) = rngTarget.Cells(i) ' 각 셀의 값을 배열 변수에 차례로 저장
    Next i

    rngTarget.ClearContents             ' 작업 대상 범위의 내용을 지움

    strYesNo = MsgBox("내용을 지웠습니다. 원래대로 돌릴까요?", vbYesNo)
    If strYesNo = vbNo Then Exit Sub

    With rngTarget                      ' 작업 대상 영역에 대하여...
        For i = 1 To intNum             ' 선택된 영역의 셀 수만큼 반복 실행
            .Cells(i) = strCell(i)      ' 배열 변수에 있던 값을 각 셀에 표시
        Next i
    End With
End Sub

SendKeys 메서드를 사용했을 때보다 복잡해 보입니다만, 배열 변수를 이용하면 다양한 상황에 적용할 수 있는 장점이 있으니 잘 익혀두시기 바랍니다.

참고: 이미지에 대하여

이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 위 이미지는 본문 설명을 바탕으로 당시 화면 구성을 재구성한 예시 이미지이며, 실제 엑셀 화면과 세부 디자인(버전별 UI)은 다를 수 있습니다. 특히 본문 첫머리의 On Error Resume Next 그림은 <VBA 파워 코딩의 정석>에 실린 원본이 아니라 그 의미를 표현하려고 새로 그린 것이며, 데이터의 항목과 값도 예시입니다.

정리 — 매크로 실행 취소 두 가지 방법

방법 핵심 코드 특징
방법 1 SendKeys Application.SendKeys "{DELETE}" / "^z", Application.Undo 키 입력을 흉내 내는 방식으로 코드가 간단
방법 2 배열 셀 값을 배열에 저장 → ClearContents → MsgBox 응답에 따라 복구 코드는 길지만 다양한 상황에 적용 가능

자주 묻는 질문 (FAQ)

Q1. 매크로로 지운 내용을 Ctrl+Z로 되돌릴 수 있나요?

VBA 매크로로 작업한 경우에는 '실행 취소(Undo)'가 되지 않습니다. 대신 SendKeys 메서드로 키 입력을 흉내 내거나, 지우기 전에 값을 배열에 저장해 두었다가 복구하는 방법을 사용할 수 있습니다.

Q2. SendKeys에서 Ctrl, Shift, Alt 키는 어떻게 표시하나요?

Ctrl 키는 ^, Shift 키는 +, Alt 키는 %와 조합해서 표시합니다. 예를 들어 Ctrl+Z는 Application.SendKeys "^z"로 나타냅니다.

Q3. 배열을 이용한 방법의 장점은 무엇인가요?

SendKeys를 사용할 때보다 코드는 복잡해 보이지만, 셀 값을 배열 변수에 저장해 두므로 다양한 상황에 응용할 수 있다는 장점이 있습니다.

마치며

매크로로 작업한 내용은 기본적으로 되돌릴 수 없으니, 필요할 때는 SendKeys나 배열로 복구 장치를 마련해 두세요.
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 정문 왼쪽에 있는 'VBA 강좌 - VBA 입문강좌'를 읽어보시면 이해가 빠릅니다.