- 최초 작성일: 2000-10-06
- 최종 수정일: 2026-09-30
- 조회수: 8 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 그림파일 불러오기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Excel에 날개달기가 50회를 돌파하게 되었습니다. 원래 생각대로라면 좀 특별한 것을 한번 만들어 볼 생각이었으나 이것저것 벌여놓은 일이 산적해 있어서 뜻대로 되지 않는군요.
몇 강좌 전에 차트를 그림으로 내보는 것(Exporting)과, 그림파일을 UserForm 상에 가져와서 보여주는 방법에 대해 설명을 드렸습니다. 이 때 어떤 방법을 사용했었는지 기억이 나십니까? GetSaveAsFilename Method를 사용했었지요? 오늘은 그것을 약간 응용해 보도록 하겠습니다.
그림파일 불러오기
핵심 요약: 그림파일 불러오기
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는 매우 중요한 개념이므로 잘 정립해 두시기 바랍니다.