- 최초 작성일: 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界에 발을 담그셨다면 말입니다. ^^
엑셀 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를 알면 개체마다 매크로를 따로 만들 필요 없이 하나의 프로시저로 여러 개체를 처리할 수 있습니다. 나머지 계산 기능도 직접 만들어 보시기 바랍니다.