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