이 VBA 코드의 주요 목적은 엑셀 워크시트 내 포함된 그림(이미지)을 개별 파일로 저장하는 것입니다. 이를 자동화하는 이유와 필요성을 정리하면 다음과 같습니다.
1️⃣ 엑셀 내 포함된 그림을 개별 이미지 파일로 저장
- 엑셀 문서에 삽입된 그림(이미지, 로고, 스크린샷 등)은 일반적으로 파일로 직접 저장할 수 없습니다.
- VBA를 이용하면 엑셀에 포함된 그림을 선택한 폴더에 개별 파일(JPG 형식)로 자동 저장할 수 있습니다.
- 수작업으로 그림을 하나씩 복사하고 저장하는 번거로움을 해결할 수 있습니다.
2️⃣ 대량의 이미지를 일괄 저장하는 자동화 기능
- 엑셀 문서에 여러 개의 그림이 포함되어 있을 때, 수작업으로 각각 저장하는 것은 비효율적입니다.
- VBA를 활용하면 모든 그림을 한 번에 자동 저장할 수 있어 시간 절약이 가능합니다.
- 특히, 엑셀을 보고서를 작성하는 용도로 사용할 때, 포함된 이미지를 별도로 저장해야 하는 경우가 많습니다.
3️⃣ 여러 개의 시트에서 이미지 저장 가능
- 기존에는 개별 시트에서 일일이 그림을 선택해서 저장해야 했지만, 이 코드는 한 번에 모든 시트의 그림을 저장할 수 있도록 설계되었습니다.
- 사용자에게 현재 시트만 저장할지, 모든 시트의 그림을 저장할지 선택할 수 있도록 옵션 제공(1: 현재 시트, 2: 모든 시트).
4️⃣ 자동 저장 폴더 생성 및 정리
- 사용자에게 저장할 폴더를 선택하는 인터페이스(FileDialog)를 제공하여 원하는 위치에 이미지를 저장할 수 있도록 구현.
- 같은 파일이 여러 번 저장될 경우 중복 방지를 위해 자동으로 고유한 파일명 지정(_Image001.jpg, _Image002.jpg 등).
- 엑셀 파일명 기반으로 새로운 저장 폴더를 생성하여 파일을 체계적으로 관리 가능.
' ---------------------------------------------- ' 선택한 폴더에 그림을 저장하는 메인 프로시저 ' ---------------------------------------------- Sub SaveImagesFromShapes(control As IRibbonControl) Dim selectedFolder As String, saveFolder As String, userChoice As Integer ' 폴더 선택 다이얼로그 표시 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "저장할 폴더를 선택하세요" .Show If .SelectedItems.Count = 0 Then Exit Sub ' 사용자가 취소한 경우 종료 selectedFolder = .SelectedItems(1) & "\" End With ' 저장할 하위 폴더 생성 (파일명 기반) saveFolder = selectedFolder & Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".")) & "\" If Dir(saveFolder, vbDirectory) = "" Then MkDir saveFolder ' 사용자 입력: 현재 시트 또는 모든 시트 선택 userChoice = Application.InputBox("이미지 저장 옵션 선택" & vbCrLf & _ "1: 현재 시트만 저장" & vbCrLf & _ "2: 모든 시트 저장", Type:=1, Default:=2) If userChoice = 0 Then Exit Sub ' 사용자가 취소한 경우 종료 ' 화면 업데이트 및 계산 최적화 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ' 선택한 옵션에 따라 저장 수행 If userChoice = 1 Then SaveShapesAsImages ActiveSheet, saveFolder Else Dim ws As Worksheet For Each ws In ThisWorkbook.Sheets SaveShapesAsImages ws, saveFolder Next ws End If ' 화면 업데이트 및 계산 복구 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic ' 완료 메시지 표시 MsgBox "이미지 저장이 완료되었습니다.", vbInformation, "완료" End Sub ' ---------------------------------------------- ' 각 시트에서 그림을 추출하여 이미지로 저장하는 프로시저 ' ---------------------------------------------- Sub SaveShapesAsImages(targetSheet As Worksheet, savePath As String) Dim shapeItem As Shape Dim tempChart As ChartObject Dim imgPath As String Dim imgIndex As Integer: imgIndex = 0 ' 시트 내 모든 도형을 순회 For Each shapeItem In targetSheet.Shapes ' 도형이 그림 또는 링크된 그림일 경우만 처리 If shapeItem.Type = msoPicture Or shapeItem.Type = msoLinkedPicture Then imgIndex = imgIndex + 1 imgPath = savePath & targetSheet.Name & "_Image" & Format(imgIndex, "000") & ".jpg" ' 그림을 복사하여 차트에 붙여넣기 shapeItem.CopyPicture xlScreen ' 새로운 차트 객체 추가 (이미지 저장을 위한 임시 차트) Set tempChart = targetSheet.ChartObjects.Add(0, 0, shapeItem.Width, shapeItem.Height) tempChart.Activate ActiveChart.Paste ' 이미지 파일로 저장 On Error Resume Next ActiveChart.Export fileName:=imgPath, FilterName:="jpg" On Error GoTo 0 ' 메모리 절약을 위해 임시 차트 삭제 tempChart.Delete End If Next shapeItem End Sub |