본문 바로가기
자동화 TOOL 공유

엑셀 자동화TOOL 공유 로고 이미지의 썸네일화(다른 이미지에 결합)

by 부업하는 전문가 2024. 1. 13.
반응형

1. 엑셀로 로고 이미지를 다른 이미지에 결합할 수 있을까요?

특정 회사 혹은 특정 Maker의 로고 이미지를 특정 이미지와 결합시켜서 이 이미지는 우리 회사 혹은 특정 Maker의 소유이다. 라고 나타내는 작업이 있습니다. 특히 썸네일을 자주 만드시는 분들은 포토샵으로 이러한 작업을 하시는 경우가 많습니다만, 이 작업이 몇 천, 몇 만까지도 동시에 이루어 질 수 있도록 엑셀 자동화 TOOL을 만들었습니다.

 

이하와 같이 "나훈아"라는 로고 이미지가 있고, 이 로고 이미지를 "나훈아" 이미지에 결합해야하는 작업이 있다고 가정해보겠습니다. 이러한 상황에서 로고를 우측 "나훈아"이미지 좌상단에 위치시켜 결합해야합니다.

 

 

 

2. 로고 이미지 경로, 저장, 추출 폴더 경로지정

우선 로고 이미지, 로고를 넣을 이미지 경로를 하기와 같이 VBA Filedialog(선택창)으로 경로를 따와줍니다.

 

이하 VBA는 Filedialog로서 특정 폴더, 특정 파일을 선택하는 창을 표시시켜 해당 파일, 폴더의 경로를 자동으로 추출해주는 코드입니다.

 

Sub logo_path()

    Dim strDBPath   As String

    With Application.FileDialog(msoFileDialogFilePicker)
        .InitialFileName = ThisWorkbook.Path & Application.PathSeparator
        .Filters.Clear
        .Title = "Please Select File"
        If .Show = -1 Then strDBPath = .SelectedItems(1)
    End With
    If strDBPath = "" Then Exit Sub
    
Range("b1").Value = strDBPath

End Sub

 

상기와 같이 로고 파일의 경로, 추출 폴더 경로(변환 하고자 하는 이미지가 들어가 있는 폴더), 저장 폴더 경로(변환 후 이미지가 저장될 폴더)를 각각 상기 Filedialog코드를 활용하여 이하와 같이 만들어 줍니다.

 

3. 이미지 경로를 추출하는 방법

 

그리고 추출 폴더 안에 들어가있는 모든 파일을 이하와 같은 Fuction코드를 사용하여 자동으로 경로를 추출합니다. 추가 옵션으로 추출 폴더 안에 하위 폴더가 있더라도 그 하위폴더에 있는 파일명까지 따올 수 있습니다. 하기 코드를 사용하여 추출 폴더내의 모든 파일을 리스트로 상기 이미지 F열에 넣었습니다.

'▶ ListFiles 함수
'▶ 선택한 폴더의 파일목록을 배열로 반환합니다.
'▶ 인수 설명

'_____________sPath     : 파일목록을 출력할 폴더입니다.
'_____________withPath  : TRUE일 경우 폴더 경로를 함께 표시합니다. 기본값은 FALSE 입니다.
'_____________includeChild  : TRUE일 경우 하위 폴더의 파일도 모두 포함하여 출력합니다. 기본값은 FALSE 입니다.

Function ListFiles(sPath As String, Optional withPath As Boolean = False, Optional includeChild As Boolean = False)

' 변수를 선언합니다.
Dim dictFiles As Object
Dim Arr As Variant
Dim i As Long: Dim X As Long
Dim str As String
Set dictFiles = CreateObject("Scripting.Dictionary")

str = Worksheets("Logo_Chage").Range("B2").Value
' 폴더 내 파일 경로를 Dictionary 에 추가합니다.
ListFiles_Routine dictFiles, str, True, includeChild

' Dictionary가 비어있을 경우 #NULL 오류를 반환하고 그렇지 않을 경우 다음 단계로 넘어갑니다.
On Error GoTo EH:
ReDim Arr(1 To dictFiles.Count)

' Dictionary를 배열로 변환합니다.
Arr = dictFiles.items

' withPath가 False일 경우 폴더 경로를 제거합니다.
If withPath = False Then
        For X = LBound(Arr) To UBound(Arr)
            i = InStrRev(Arr(X), "\")
            Arr(X) = Mid(Arr(X), i + 1, Len(Arr(X)))
        Next
End If

' 파일 경로를 반환 후 함수를 종료합니다.
ListFiles = Arr

Exit Function

EH:
ListFiles = "#NULL!"

End Function

 

 

4. 로고 이미지 결합 실제 사례, 자동화 TOOL소개

마지막으로 추출 폴더 내에 존재하는 모든 이미지 파일들을 하나씩 FOR문으로 엑셀로 가지고 와서 로고 이미지와 결합시켜 완성된 이미지를 저장 폴더에 저장하는 코드입니다.

 

imgPathA가 로고 이미지 파일, imgPathB가 결합할 대상 이미지 파일입니다. 이 2개의 이미지를 크기를 조정, 하나로 그룹화 시키고, 확대 및 크롭, 기울기 조정까지 시킬 수 있도록 추가 옵션을 구비하여서 여러개의 이미지 파일을 동시에 로고 이미지와 결합시켜 저장 폴더에 추출하도록 할 수 있습니다.


Sub logo_change()
    Dim ws As Worksheet
    Dim imgA As Picture, imgB As Picture
    Dim groupShape As Shape
    Dim imgPathA As String, imgPathB As String, groupPath As String
    Dim shp As Shape
    Dim picName As String
    Dim chtObj As ChartObject
    Dim cht As Chart, i As Long
    

    Set ws = ThisWorkbook.Sheets("Logo_Chage")
    
For i = 7 To Range("f1000000").End(xlUp).Row

    imgPathA = Range("B1") 'logo
    imgPathB = Range("h" & i)
    groupPath = Range("B3") & Application.PathSeparator & Range("g" & i)
    
    
    Set imgB = ws.Pictures.Insert(imgPathB)
    With imgB
          .Top = ws.Range("h7").Top
        .Left = ws.Range("h7").Left
    End With

    Set imgA = ws.Pictures.Insert(imgPathA)
    With imgA
        .Top = ws.Range("h7").Top
        .Left = ws.Range("h7").Left
        .ShapeRange.LockAspectRatio = msoFalse
        .ShapeRange.Width = Range("b9")
        .ShapeRange.Height = Range("b9")
    End With


    Set groupShape = ws.Shapes.Range(Array(imgA.Name, imgB.Name)).Group
    groupShape.Name = "C"
   

  With ActiveSheet
        Set shp = .Shapes("C")
        shp.Select
        Selection.CopyPicture
        Set chtObj = .ChartObjects.Add(0, 0, shp.Width, shp.Height)
        chtObj.Chart.Paste
        Set cht = chtObj.Chart
        chtObj.Activate
        With cht
            .ChartArea.Select
            .Paste
            .Export (groupPath)
        End With
        chtObj.Delete
    End With

    Set chtObj = Nothing
    Set cht = Nothing

    imgA.Delete
    imgB.Delete
    
Next i

Shell "explorer.exe " & Range("b3"), vbNormalFocus 
End Sub

 

상기 코드를 실행시킨 결과 하기와 같이 "나훈아" + "나훈아로고"가 결합된 완성이미지를 추출할 수 있습니다.

완성된 자동화 TOOL이 필요하시다면 댓글을 부탁드립니다.

반응형