- 최초 작성일: 2025-01-25
- 최종 수정일: 2026-09-27
- 조회수: 41 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 255회 - 이미지 불러오기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
"도무지 잊을래야 잊을 수 없는" 시리즈 제2탄
"영어 선생님이 영어를 잘 하는 비결은 매일 일정 시간을 영어를 가르치는데 사용하기 때문"이라는 말이 있습니다. 비단 영어 뿐이겠습니까. 무언가를 배우는 확실한 방법은 남에게 가르쳐 보는 것이겠지요.
이번 시간에는 (잊을 만하면 질문을 받기에) "도무지 잊을 수 없는 것" 시리즈 제2탄으로, 시트에 이미지를 불러오는 방법들에 대해 소개합니다.
워크시트에 이미지를 불러오는 방법 정리
핵심 요약: 워크시트에 이미지를 불러오는 세 가지 방법
이미지가 적으면 동적 이름 정의와 INDIRECT 함수로 다른 시트의 이미지를 불러오고, 많으면 Pictures.Insert 메서드로 폴더나 웹에 있는 이미지 파일을 불러옵니다.
- 방법 1: 다른 워크시트의 이미지 - 동적 이름 정의 + INDIRECT + 콤보 상자
- 방법 2: 폴더의 이미지 파일 - Pictures.Insert + ThisWorkbook.Path
- 방법 3: 웹의 이미지 파일 - 방법 2에서 파일 경로만 웹 주소로 변경
- 선택 기준: 이미지가 많을수록 방법 2, 3이 효율적
방법 1: 워크시트에 있는 이미지 불러오기
예제 파일의 'Sheet1'에 있는 콤보 상자를 클릭하고 목록을 선택하면 선택된 목록에 해당되는 이미지가 표시되며, 이 이미지는 다른 워크시트에 있습니다. '동적 이름 정의'와 Indirect 함수를 이용하면 간단하게 구현할 수 있습니다.
(1) '수식' 탭의 '이름 정의'를 클릭하고 이름을 정의합니다. '이름' 항목에는 'Pic_List', '참조 대상' 항목에는 다음 수식을 입력합니다. 'images' 시트의 B열 중에서 값이 들어있는 부분을 범위로 지정하기 위한 '동적 이름 정의'입니다.
=OFFSET(images!$B$1,0,0,COUNTA(images!$B:$B),1)
(2) 같은 방법으로 이름을 하나 더 정의합니다. '이름' 항목에는 'Pic_Link', '참조 대상' 항목에는 Indirect 함수를 이용하여 아래와 같이 해 줍니다.
=INDIRECT("images!a" & Sheet1!$D$3)
이 수식이 의미하는 것은?
"Sheet1의 D3 셀에 있는 값을, images 시트의 A열 중에서 그 값이 있는 셀 주소의 내용을 화면상에 표시하라"라는 의미입니다. 여기서 D3은 콤보 상자에서 '셀 연결'을 통해 대상 리스트 중에서 몇 번째 것이 선택되었는지 정보가 담겨 있는 셀입니다.
(3) 'images' 시트에 있는 이미지 중 하나를 복사하여 'Sheet1'에 붙여 넣습니다.
(4) 붙여 넣은 이미지를 선택하고 수식 입력줄에 '=Pic_Link'라고 입력한 다음, <Enter> 키를 누릅니다. 대소문자는 구분하지 않아도 됩니다.
참고: 원문 수정
원문에는 (1)의 수식 끝의 닫는 괄호가 빠져 있었고, (4)의 이름이 'Pic_Lick'(오타)으로, 등호 없이 적혀 있었습니다. 수식 입력줄에 이름을 연결할 때는 등호를 붙여 =Pic_Link로 입력하므로 이에 맞게 바로잡았습니다.
(5) '개발 도구' 탭에서 '삽입'을 클릭하고, '양식 컨트롤'의 도구 상자를 선택합니다. 시트 내의 적당한 곳에 콤보 상자를 삽입합니다.
(6) 콤보 상자를 마우스 오른쪽 버튼으로 클릭하고 '컨트롤 서식'을 선택합니다. '컨트롤 서식' 대화상자의 '컨트롤' 탭에서 각 항목을 다음과 같이 지정하고 '확인' 버튼을 클릭합니다.
이렇게 하면, 콤보 박스에서 목록을 선택하면 그에 맞는 이미지가 화면에 표시됩니다.
방법 2: 폴더에 있는 이미지 불러오기
이미지가 몇 개 안 된다면 상관없지만 개수가 많아지면 [방법 1]은 바람직하지 않습니다. 엑셀의 워크시트는 '책상 또는 작업용 테이블'과 비슷합니다. 반면, 방대한 양의 이미지 파일이나 데이터베이스 정보는 '창고'에 비유할 수 있습니다. 용량을 많이 차지하는 자료들은 창고에 보관해 두고 필요할 때마다 가져와서 처리하는 것이 효율적이겠지요?
예제 파일의 'Sheet2'에 있는 콤보 상자를 클릭하고 목록을 선택하면 선택된 목록에 해당되는 이미지가 표시됩니다. 물론 이 때 불러온 이미지는 워크시트에 있는 것이 아니라 외부 파일입니다.
[주의] 이번 강좌 파일(VB0255_LoadPicture.xlsm)과 이미지 파일들은 같은 폴더에 있어야 제대로 작동합니다. 압축을 풀 때 폴더 위치를 확인하세요!
(1) 코딩에 앞서 필요한 이름을 미리 정의합니다. 'ImageStart'는 이미지를 표시할 기준 위치, 'MyIndex'는 콤보 박스의 '셀 연결' 항목과 관련이 있습니다.
(2) '개발 도구' 탭에서 '삽입'을 클릭하고, '양식 컨트롤'에 있는 '콤보 상자'를 시트에 삽입합니다.
(3) 콤보 상자를 마우스 오른쪽 버튼으로 클릭하고 '컨트롤 서식' 대화상자의 '컨트롤' 탭의 각 항목을 지정한 다음, '확인' 버튼을 클릭합니다.
(4) 콤보 상자에 연결할 코드를 작성합니다.
Sub LoadPicFromFolder()
Dim picMyShape As Picture ' 이미지 파일에 접근하기 위한 개체 변수
Dim sPath As String ' 폴더에 접근하기 위한 문자열 변수
On Error Resume Next ' 실행 도중 오류가 발생하더라도 다음 구문 실행
ActiveSheet.Pictures.Delete ' 현재 시트 내의 모든 이미지 삭제
Range("ImageStart").Select ' 이미지를 표시할 위치 선택
sPath = ThisWorkbook.Path & "\L_" & Range("MyIndex") & ".jpeg"
' 폴더명과 파일 이름을 & 연산자를 이용하여 연결
Set picMyShape = ActiveSheet.Pictures.Insert(sPath) ' 이미지 파일을 시트에 삽입
picMyShape.Width = Range("ImageStart").Width * 6 ' 이미지 파일의 크기 지정
End Sub
(5) 콤보 상자를 마우스 오른쪽 버튼으로 클릭하고 '매크로 지정' 메뉴를 선택합니다. '매크로 지정' 대화상자에서 연결할 매크로를 선택하고 '확인' 버튼을 클릭합니다.
방법 3: 웹에 있는 이미지 불러오기
이번에는 인터넷에 올라와 있는 이미지 파일을 불러오는 방법에 대해 알아봅니다. 다른 과정은 앞의 [방법 2]와 거의 같습니다. 콤보 상자에 연결된 코드 중에서 이미지 파일의 위치를 지정하는 부분에서만 차이가 있습니다.
sPath = ThisWorkbook.Path & "\L_" & Range("MyIndex") & ".jpeg"
이 부분을 다음과 같이 바꿔 주면 됩니다. 파일이 있는 웹사이트 주소와 파일 이름을 & 연산자를 이용하여 연결해 주었습니다.
sPath = "http://www.iExceller.com/MyXls/test_image\" & "\L_" & Range("MyIndex") & ".jpeg"
이 방법을 이용하면 인터넷 환경이 갖춰진 곳이라면 어디에서나 접근할 수 있으므로 관리하기가 용이합니다. 만약 불러올 자료가 많거나 하여 로딩 속도가 늦다면 다음 구문을 프로시저 앞 부분에 추가하시기 바랍니다.
Application.ScreenUpdating = False
....... 어쩌고 .......
....... 저쩌고 .......
Application.ScreenUpdating = True
참고: 원문 코드 수정
원문의 마지막 줄에 Applicaion.ScreenUpdating = True로 오타가 있어 Application으로 바로잡았습니다.
이만하면 웬만큼 정리가 된 것 같은데... 다른 기발한 아이디어를 가진 분은 알려주시기 바랍니다.
참고: 이미지에 대하여
이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 위 이미지는 본문 설명을 바탕으로 당시 화면 구성을 재구성한 예시 이미지이며, 실제 엑셀 화면과 세부 디자인(버전별 UI), 이미지 속 목록 항목이나 셀 주소는 다를 수 있습니다.
정리 — 이미지를 불러오는 세 가지 방법
| 방법 | 이미지 위치 | 핵심 기법 |
|---|---|---|
| 방법 1 | 다른 워크시트 | 동적 이름 정의(OFFSET), INDIRECT 함수, 이미지에 이름 연결 |
| 방법 2 | 폴더의 이미지 파일 | Pictures.Insert 메서드 + ThisWorkbook.Path |
| 방법 3 | 웹의 이미지 파일 | Pictures.Insert 메서드 + 웹 주소, ScreenUpdating으로 속도 개선 |
자주 묻는 질문 (FAQ)
Q1. 엑셀 워크시트에 이미지를 불러오는 방법에는 어떤 것이 있나요?
크게 세 가지입니다. 다른 워크시트에 있는 이미지를 동적 이름 정의와 INDIRECT 함수로 불러오는 방법, 폴더에 있는 이미지 파일을 VBA로 불러오는 방법, 웹에 있는 이미지 파일을 VBA로 불러오는 방법입니다.
Q2. 이미지가 많을 때는 어떤 방법이 좋은가요?
이미지 개수가 많으면 통합 문서 용량이 커지는 방법 1은 바람직하지 않습니다. 이미지는 폴더나 웹에 두고 필요할 때마다 VBA로 불러오는 방법 2, 3이 효율적입니다.
Q3. 폴더에 있는 이미지가 표시되지 않으면 어떻게 하나요?
코드에서 ThisWorkbook.Path를 기준으로 파일 경로를 만들기 때문에 엑셀 파일과 이미지 파일이 같은 폴더에 있어야 합니다. 압축을 풀 때 폴더 위치를 확인하세요.
마치며
이미지가 적으면 시트 안에, 많으면 폴더나 웹에 두고 불러오는 것이 정석입니다. 콤보 상자와 함께 직접 만들어 보세요!
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 정문 왼쪽에 있는 'VBA 강좌 - VBA 입문강좌'를 읽어보시면 이해가 빠릅니다.