• 최초 작성일: 2002-12-10
  • 최종 수정일: 2026-09-30
  • 조회수: 7 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 엑셀 VBA로 간단 계산기 만들기 (Application.Caller)

들어가기 전에

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

Knowledge is a comfortable and necessary retreat and shelter for us in an advanced age; and if we do not plant it while young, it will give us no shade when we grow old. 진보된 시대에서 지식은 우리에게 편안하고 꼭 필요한 안식처 또는 쉼터와 같은 것이다. 따라서 젊었을 때 그것을 든든하게 세워놓지 않으면 우리는 늙으막에 가서 그늘을 기대하지 않는 것이 좋다.

Application 오브젝트의 Caller 프로퍼티를 모르면 프로그래밍을 하다가 깝깝한 경우가 많습니다. 그것 없이도 지금껏 잘 살아왔고, 현재 잘 살고 있으며, 앞으로도 변함없이 잘 살 수 있을 것이라고 생각하는 분이 계시다면... 지금이라도 마음을 바꾸시기 바랍니다. Application.Caller 프로퍼티를 모르면… 잘 사실 수 없다는 것을 지금부터 보여드리지요. 적어도 엑셀과 VBA界에 발을 담그셨다면 말입니다. ^^

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

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

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


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

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

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

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

엑셀 VBA로 간단 계산기 만들기 (Application.Caller)

핵심 요약: Application.Caller로 클릭한 개체 알아내기

Application.Caller는 지금 실행 중인 매크로를 호출한 개체를 알려 줍니다. 이를 이용하면 여러 개체가 하나의 프로시저를 공유하면서도 각자 다르게 동작하게 할 수 있습니다.

  • 1단계: 여러 개체에 동일한 매크로를 연결합니다.
  • 2단계: DrawingObjects(Application.Caller) 또는 Buttons(Application.Caller)로 클릭한 개체를 참조합니다.
  • 3단계: 버튼의 Caption 등을 Select Case로 분기하여 기능을 구현합니다.

Step 1: Application.Caller 프로퍼티의 역할

아래의 사진을 계속 클릭해 보세요. 10번 클릭할 때까지는 계속 오른쪽으로 이동하다가 11번째 클릭을 하는 순간 원래 위치로 되돌아 옵니다.

예제 파일에서는 워크시트에 삽입된 사진 한 장에 매크로를 연결해 두었습니다. 사진을 클릭할 때마다 40포인트씩 오른쪽으로 이동하다가 열 번째 이동 이후 다시 클릭하면 시작 위치로 되돌아옵니다.

바로 여기서 클릭한 사진을 인식하게 하여 주는 것이 Application.Caller가 하는 일입니다. 만약 이 속성이 없다면(혹은 모른다면) 이런 것을 어떻게 구현할까요? 가능할까요? 아주 노동집약적인(달리 표현하자면 맨 땅에 헤딩하는…) 방법으로 가능은 하겠지만 엄청나게 비효율적이고 힘든 일이 될 것입니다.

Step 2: 클릭한 개체를 알아내는 코드

Sub ApplicationCallerTest()

    Dim lngX            As Long
    Dim lngY            As Long
    Dim rngStart        As Range
    Static intNum       As Integer
    ' intNum은 사진의 위치를 이동시킬 정수형 변수입니다. 여기서 변수를 선언할 때 Dim이 아니라
    ' Static으로 선언해 준 점에 유의하세요. 그래야 버튼을 눌러도 이전의 값이 없어지지 않고 계속
    ' 보존이 되겠지요?

    Set rngStart = [Start]
    lngX = rngStart.Left
    lngY = rngStart.Top

    If intNum = 400 Then
    ' 만약 intNum 변수값이 400이면…

        intNum = 0
        With ActiveSheet.DrawingObjects(Application.Caller)
        ' 이 부분이 핵심입니다. Application.Caller 프로퍼티를 이용하여 시트 내에서 어떤 그리기 개체가
        ' 클릭 되었는지 파악합니다.

            .Left = lngX
        End With
    Else
        With ActiveSheet.DrawingObjects(Application.Caller)
            .Left = .Left + 40
        End With
        intNum = intNum + 40
    End If

End Sub

핵심은 ActiveSheet.DrawingObjects(Application.Caller) 부분입니다. 매크로를 실행시킨 그리기 개체가 무엇인지 Application.Caller가 알려 주므로, 개체가 여러 개여도 프로시저 하나로 처리할 수 있습니다. 또한 intNum을 Dim이 아니라 Static으로 선언했기 때문에 프로시저가 끝나도 이동한 거리가 보존됩니다.

Step 3: 엄청간단 계산기 만들기

이제 Application.Caller가 뭐하는 것인지는 충분히 이해를 하셨을 것이라 생각되므로 아래와 같은 엄청간단 계산기를 만들어 보도록 하겠습니다. 실은 계산기라고 할 것도 없을 정도로 단순한 것이긴 합니다만… 버튼을 클릭하면 해당 숫자가 표시부에 그대로 나타나고, BS 키를 클릭하면 입력된 숫자 중 마지막 자리의 숫자가 제거되도록 하는 것입니다. 말 그대로 엄청간단 계산기 이므로 그 외 나머지 기능은 건너 뛰었습니다.

워크시트에 숫자 버튼들과 CL, BS 버튼을 만들고 모든 버튼에 아래의 프로시저 하나를 연결합니다. 어떤 버튼이 눌렸는지는 Application.Caller로 알아내고, 그 버튼의 Caption으로 분기합니다.

Sub MyCalculator()

    Dim rngResult           As Range
    Static strCaption       As String
    Set rngResult = [Result]

    Select Case ActiveSheet.Buttons(Application.Caller).Caption
    ' 다른 부분은 위의 예제 코드와 별 차이가 없고… 클릭한 버튼의 캡션을 가져온 다음 Select Case
    ' 문으로 분기 처리하는 부분만 추가가 되었습니다.

        Case "CL"
        ' CL 버튼을 누를 경우, 표시부를 지웁니다.

            rngResult.ClearContents
            strCaption = ""

        Case "BS"
        ' BS 버튼을 누르면 표시부에 입력된 데이터의 마지막 숫자를 하나씩 제거합니다.

            With rngResult
                strCaption = .Value
                .ClearContents
                If Len(strCaption) > 0 Then strCaption = Left(strCaption, Len(strCaption) - 1)
                .Value = strCaption
            End With

        Case Else
        ' 그 이외의 경우, 즉 숫자 버튼을 누른 경우에는 누른 숫자를 화면에 표시합니다.

            With rngResult
                .ClearContents
                strCaption = strCaption & ActiveSheet.Buttons(Application.Caller).Caption
                .Value = strCaption
            End With
    End Select

End Sub

참고: 양식 컨트롤 버튼은 ActiveSheet.Buttons(Application.Caller)로 접근합니다. 사진이나 도형 같은 그리기 개체는 DrawingObjects(Application.Caller)로도 접근할 수 있습니다.

나머지 계산 기능에 대해서는 공부하시는 셈 치고 여러분들이 직접 만들어 장착해 보시기 바랍니다. 어떤 하나의 프로그램을 완성하고 나면 여러분의 내공은 두세단계 도약합니다. 간단해 보이지만 아마 그리 만만하지는 않을 것입니다. ^^ 생각을 구체화시켜 나가는 과정, 그것이 바로 Programming 과정입니다. 그리고 그러한 작업을 하시는 여러분은 바로 Programmer 입니다.

다음 시간에…

정리 — Application.Caller 활용 정리

구분 사용한 코드 역할
클릭한 개체 참조 DrawingObjects(Application.Caller) 사진·도형 등 그리기 개체 접근
클릭한 버튼 참조 Buttons(Application.Caller).Caption 버튼 캡션으로 분기
값 보존 Static 변수 프로시저 종료 후에도 값 유지
표시부 지우기 rngResult.ClearContents CL 버튼 동작
한 자리 지우기 Left(strCaption, Len(strCaption) - 1) BS 버튼 동작

자주 묻는 질문 (FAQ)

Q1. Application.Caller는 무엇을 돌려주나요?

매크로를 실행시킨 개체의 이름을 돌려줍니다. 버튼이나 도형에 매크로를 연결했다면 그 개체의 이름이 반환됩니다.

Q2. 왜 변수를 Static으로 선언하나요?

Dim으로 선언한 변수는 프로시저가 끝나면 값이 사라지지만 Static 변수는 값이 유지됩니다. 버튼을 여러 번 눌러도 이전 값을 이어서 사용할 수 있습니다.

Q3. 버튼이 여러 개일 때 프로시저를 하나만 써도 되나요?

네, 모든 버튼에 같은 매크로를 연결하고 Application.Caller로 눌린 버튼을 구분하면 됩니다.

마치며

Application.Caller를 알면 개체마다 매크로를 따로 만들 필요 없이 하나의 프로시저로 여러 개체를 처리할 수 있습니다. 나머지 계산 기능도 직접 만들어 보시기 바랍니다.