Picture

시트의 모든 사진을 개별 파일로 저장

노만e 2025. 3. 25. 22:05

이 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

 

 

SaveShapesAsImages.xlsm
5.35MB