카테고리 없음

선택된 셀(병합셀,단일셀)에 사진 삽입하기

노만e 2025. 3. 25. 06:09

엑셀에서 특정 셀 범위(병합셀, 단일셀)에 이미지 삽입하는 기능을 수행합니다. 병합셀이면 병합셀의 크기에 맞게, 단일 셀이면 단일셀의 크기에 맞도록 이미지 크기를 변경하여 삽입하며, 사용자가 원하는 사진을 선택할 수 있도록 하여, 원하는 사진을, 원하는 위치에 삽입할 수 있도록 하였습니다.

 

 

1️⃣ 수동 이미지 삽입의 번거로움 해소

  • 기본적으로 엑셀에서 이미지를 삽입하려면 [삽입] → [그림] → 파일 선택 과정이 필요합니다.
  • 여러 개의 셀에 이미지를 반복해서 삽입해야 할 경우, 이 작업이 매우 번거롭고 시간이 오래 걸립니다.
  • VBA 자동화 코드를 사용하면, 한 번의 실행으로 여러 개의 셀에 이미지를 자동으로 배치할 수 있습니다.

2️⃣ 병합된 셀을 고려한 자동화

  • 엑셀에서는 병합된 셀(Merged Cells) 이 존재할 수 있습니다.
  • 기본적으로 VBA에서 이미지 삽입 시 병합된 셀을 개별 셀처럼 인식하기 때문에, 수동 삽입 시 위치가 어긋날 수 있습니다.
  • 이 코드에서는 병합된 셀을 고려하여, 병합된 영역 전체에 맞게 이미지를 자동 배치하도록 설계되었습니다.

3️⃣ 각 셀마다 다른 이미지를 삽입 가능

  • 기존 자동화된 이미지 삽입 기능은 보통 한 개의 이미지 파일을 여러 셀에 복사하는 형태로 작동하는 경우가 많습니다.
  • 이 코드에서는 사용자가 개별적으로 원하는 이미지를 선택하여 삽입할 수 있도록 지원합니다.
    • 즉, 각 셀마다 서로 다른 이미지를 삽입 가능하여 더욱 유연한 사용이 가능합니다.

4️⃣ 이미지 크기 조정 옵션 제공

  • 엑셀에 이미지를 삽입할 때, 원본 크기 그대로 넣으면 셀 크기와 맞지 않아 레이아웃이 깨지는 문제가 발생할 수 있습니다.
  • 이 코드에서는 사용자가 직접 크기 옵션을 선택할 수 있도록 하여, 자동으로 셀 크기에 맞게 조정됩니다.
    • 옵션 1: 셀 크기에 딱 맞게
    • 옵션 2: 조금 작게
    • 옵션 3: 더 작게

5️⃣ 작업 실수 방지 및 효율성 향상

  • 수동으로 하나씩 이미지를 삽입하면, 셀 위치를 잘못 지정하거나 이미지 크기를 맞추지 못하는 실수가 발생할 수 있습니다.
  • VBA를 활용하면, 일관된 크기와 위치로 이미지를 자동 배치할 수 있어, 실수 없이 정확한 작업이 가능합니다.
  • 또한, 여러 개의 이미지를 빠르게 배치할 수 있어 시간 절약이 가능합니다.

6️⃣ 유연한 사용자 입력 시스템 적용

  • 사용자가 마우스로 원하는 셀 범위를 직접 선택할 수 있도록 Application.InputBox(Type:=8) 를 활용하여 범위를 지정합니다.
  • 또한, 사진 크기 선택 및 개별 파일 선택을 자유롭게 할 수 있도록 구성하여 사용자의 편의성을 높였습니다.
Sub InsertImagesInSelectedCells()
    Dim cell As Range, selectedRange As Range
    Dim imageIndex As Integer, picSizeOption As Integer
    Dim imageCells() As Range
    Dim imagePath As String
    Dim fileFilter As String
    
    ' 사용자가 삽입할 셀 범위 선택
    Application.ScreenUpdating = False
    On Error Resume Next
    Set selectedRange = Application.InputBox("사진을 삽입할 셀 범위를 선택하세요!", "사진 입력 범위", Type:=8)
    On Error GoTo 0 ' 오류 감지 다시 활성화
    
    ' 선택한 범위가 없는 경우 종료
    If selectedRange Is Nothing Then
        MsgBox "선택된 범위가 없습니다. 매크로를 종료합니다.", vbExclamation
        Exit Sub
    End If
    
    ' 사진 크기 입력 (유효성 검사 포함)
SizeSelection:
    picSizeOption = InputBox("사진 크기 옵션을 선택하세요:" & vbCrLf & "1: 딱 맞게" & vbCrLf & "2: 조금 작게" & vbCrLf & "3: 더 작게", "크기 옵션", Default:=1)
    If Not IsNumeric(picSizeOption) Or picSizeOption < 1 Or picSizeOption > 3 Then
        MsgBox "올바른 옵션(1~3)만 선택하세요.", vbExclamation
        GoTo SizeSelection
    End If
    
    ' 병합된 셀을 확인하고, 병합된 셀인 경우 1을 입력
    For Each cell In selectedRange
        If cell.MergeCells Then cell.Value = 1
    Next

    ' 병합된 셀을 포함한 이미지 삽입 범위 저장
    imageIndex = 0
    For Each cell In selectedRange
        If cell.MergeCells Then
            If Not IsEmpty(cell) Then
                imageIndex = imageIndex + 1
                ReDim Preserve imageCells(1 To imageIndex)
                Set imageCells(imageIndex) = cell.MergeArea
            End If
            cell.Value = ""  ' 셀 값 초기화
        Else
            imageIndex = imageIndex + 1
            ReDim Preserve imageCells(1 To imageIndex)
            Set imageCells(imageIndex) = cell
        End If
    Next
    
    ' 이미지 삽입할 셀이 없는 경우 종료
    If imageIndex = 0 Then
        MsgBox "빈 셀이 없습니다. 매크로를 종료합니다.", vbExclamation
        Exit Sub
    End If
    
    ' 파일 선택 필터 설정 (이미지 파일만 선택 가능)
    fileFilter = "그림 파일 (*.jpg;*.png;*.bmp;*.gif;*.wmf;*.cur;*.ico),*.jpg;*.png;*.bmp;*.gif;*.wmf;*.cur;*.ico"
    
    ' 선택한 각 셀에 이미지 삽입
    For imageIndex = 1 To UBound(imageCells)
        imagePath = Application.GetOpenFilename(fileFilter, , "삽입할 사진을 선택하세요", MultiSelect:=False)
        
        ' 사용자가 취소한 경우 종료
        If imagePath = "False" Then
            MsgBox "사진 선택이 취소되었습니다. 매크로를 종료합니다.", vbInformation
            Exit Sub
        End If
        
        ' 이미지 추가 및 크기 조정
        With ActiveSheet.Shapes.AddPicture(imagePath, msoFalse, msoCTrue, 1, 1, 100, 100)
            .LockAspectRatio = msoFalse
            .Left = imageCells(imageIndex).Left + (picSizeOption * 2) - 2
            .Top = imageCells(imageIndex).Top + (picSizeOption * 2) - 2
            .Width = imageCells(imageIndex).Width - (picSizeOption * 4) + 4
            .Height = imageCells(imageIndex).Height - (picSizeOption * 4) + 4
        End With
    Next imageIndex
    Application.ScreenUpdating = True
    MsgBox "사진이 정상적으로 삽입되었습니다.", vbInformation
    
End Sub

 

 

InsertImagesInSelectedCells.xlsm
0.28MB