• 최초 작성일: 2000-10-06
  • 최종 수정일: 2026-09-30
  • 조회수: 8 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 그림파일 불러오기

들어가기 전에

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

Excel에 날개달기가 50회를 돌파하게 되었습니다. 원래 생각대로라면 좀 특별한 것을 한번 만들어 볼 생각이었으나 이것저것 벌여놓은 일이 산적해 있어서 뜻대로 되지 않는군요.

몇 강좌 전에 차트를 그림으로 내보는 것(Exporting)과, 그림파일을 UserForm 상에 가져와서 보여주는 방법에 대해 설명을 드렸습니다. 이 때 어떤 방법을 사용했었는지 기억이 나십니까? GetSaveAsFilename Method를 사용했었지요? 오늘은 그것을 약간 응용해 보도록 하겠습니다.

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

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

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


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

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

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

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

그림파일 불러오기

핵심 요약: 그림파일 불러오기

Application.Caller로 클릭한 그림을 알아내고, GetOpenFilename으로 고른 그림을 그 자리에 삽입합니다.

  • 1단계: Application.Caller로 호출한 그림 개체를 변수에 담습니다.
  • 2단계: GetOpenFilename으로 삽입할 그림 파일을 선택합니다.
  • 3단계: 같은 위치와 크기로 삽입하고 원래 그림을 삭제합니다.

Step 1: 결과 미리 보기

아래의 그림을 클릭하신 다음, 여러분의 PC에 있는 그림파일(*.bmp)을 불러다가 바꾸어 보세요. 여기서는 BMP 파일로 설정을 했습니다만 GIF, PCX, JPG 등 다른 그림파일도 가능합니다.

(야한 그림을 사용했다고 뭐라 그러는 분은 없으실래나? ^^ 예술작품이라고 생각하세요. 르노와르의 작품이니까…)

재미있습니까? 이런 그림뿐 아니라 여러분 회사의 로고 등을 불러와서 붙이실 수도 있을 것입니다.

이 작업은 GetSaveAsFilename 메서드와는 반대 성격을 가진 GetOpenFilename 메서드(함수)를 사용한 것입니다. 코드를 보도록 할까요?

Step 2: 코드 작성하기

Sub ImportPictureFile()
    Dim strFile As String
    Dim sht As Worksheet
    Dim pic As Object
    Application.ScreenUpdating = True
    Set sht = ActiveSheet
    Set pic = sht.Pictures(Application.Caller)
    '//변수를 선언하는 부분은 지금까지와 같습니다만 Application.Caller라는 새로운 구문이
    '//하나 등장했군요. 보통 우리가 다른 사람을 부를 때, "홍길동", "서태지" 등과 같이 사람의
    '//이름을 직접 부를 수도 있고, "야!", "거기 너!" 등과 같은 대명사를 사용하여 부를 수도
    '//있을 것입니다.

    '//여기서 전자처럼 이름을 직접 부르는 것은 Sheets("Preface"), Workbooks("VB0048.xls")
    '//등과 같은 표현이고, 후자처럼 대명사를 사용하는 것은 ActiveSheet, ActiveCell 등과 같은
    '//표현이 될 것입니다.

    '//전자의 방법으로 불렀건, 후자의 방법으로 불렀건 간에, 일단 누군가가 자기를 부를 경우,
    '//"누가 불렀어?"라고 대답을 하지요? 여기에 해당되는 방법이 바로 Application.Caller
    '//입니다(참 설명 잘한다! ^^).

    strFile = Application.GetOpenFilename(filefilter:="그림파일(*.BMP),*.bmp", _
        Title:="삽입할 그림을 선택하세요//VB0048")
    '//여기서 GetOpenFilename이라는 새로운 메서드가 사용되었습니다. GetSaveAsFilename
    '//메서드와 비슷하니까 나머지 자세한 사항은 도움말을 참고하시기 바랍니다.
    '//여기서 filefilter:=, Title:= 등과 같은 Named Argument는 사용하시지 않아도 됩니다. 즉,
    '//filefilter="그림파일…" 대신 그냥 "그림파일…"만 적어주어도 된다는 것이지요.

    If strFile = "False" Then
        MsgBox "아무 그림도 선택되지 않았습니다", , "http://www.iexceller.com"
        Exit Sub
    End If

    sht.Pictures.Insert(strFile).Select
    With Selection
        .Top = pic.Top
        .Left = pic.Left
        .Width = pic.Width
        .Height = pic.Height
        .OnAction = "ImportPictureFile"
        '//새로 불러온 그림을 원래에 있던 그림의 위치에, 같은 크기로 붙여넣기 하는 과정이니다.
        '//그림 오브젝트를 시트상에 붙여 넣을 때, 좌표값을 잡는 방법은 예전에 사각형 그리기를
        '//할 때 사용했던 것과 같은 방법입니다. 크게 어려운 부분은 없을 것입니다.
        Range(.TopLeftCell.Address).Select
        '//TopLeftCell 속성에 대해서는 예전에(VB0039 자동TextBox 그리기) 설명을 드렸지요?
        '//선택된 오브젝트의 좌측/맨 상단 셀을 지정하는 것입니다.

    End With
    pic.Delete
    '//불러온 그림 파일을 워크시트에 붙여넣은 작업이 끝났으면 Application.Caller, 즉 불러온 녀석을
    '//지웁니다. 그래야 두 개의 그림이 겹쳐지지 않겠지요?
End Sub

마무리

GetOpenFilename 메서드를 사용한 것 외에는 그다지 어려운 것은 없을 것입니다. 아! Application.Caller는 매우 중요한 것이므로 개념을 잘 정립하고 넘어가시기 바랍니다. 이해가 안되는 부분이 있으면 질문하시고…

다음 시간에 또…

정리 — 그림 불러오기 핵심

구분 사용한 코드 역할
호출한 개체 sht.Pictures(Application.Caller) 클릭한 그림
파일 선택 Application.GetOpenFilename 열기 대화상자
그림 삽입 sht.Pictures.Insert(strFile) 그림 삽입
매크로 지정 .OnAction = "ImportPictureFile" 다시 클릭 가능
원본 삭제 pic.Delete 그림 겹침 방지

자주 묻는 질문 (FAQ)

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

매크로를 호출한 개체(예: 클릭한 그림이나 단추)의 이름을 알려 줍니다.

Q2. BMP 이외의 그림 파일도 불러올 수 있나요?

필터를 바꾸면 GIF, PCX, JPG 등 다른 그림 파일도 불러올 수 있습니다.

Q3. GetOpenFilename과 GetSaveAsFilename은 어떻게 다른가요?

GetOpenFilename은 열 파일을 고르는 대화상자, GetSaveAsFilename은 저장할 파일 이름을 정하는 대화상자입니다.

마치며

Application.Caller는 매우 중요한 개념이므로 잘 정립해 두시기 바랍니다.