팁과 강좌

[엑셀 VBA] 그림 넣기 Pictures.insert와 Shapes.Addpicture 활용하기

인심좋은 2021. 8. 4. 01:20

 요즘 VBA로 엑셀에 실험 데이터를 통합하여 정리하는 것을 하고 있다.

 

 테스트를 진행하면 결과물을 두가지인데,

 하나는 시계열 결과값

 나머지 하나는 측정 이미지이다.

 

 전에는 테스트 샘플이 한두개여서 그냥 손으로 붙여넣기해서 그래프 그리고 사진 붙여넣고 끝이었는데

이게 하나 둘 쌓이고, 프로젝트가 진행되면서 하루에 진행하는 샘플 수가 많아지다보니 수작업으로 하는 것에 한계가 왔다.

 

 그런데 막상 이게 터진게 실험 결과 값을 XML로 뱉는 계측기 때문이다. 무작정 엑셀로 열었다니 시계열인건 맞는데, 값에 세미콜론이 붙은 채로 한줄에 쭉 나온것이다. 한 샘플당 이런 데이터가 100개가 넘는데 손으로 분리하기엔 무리였다.

 

 그래서 함수로 어떻게 해볼까 했으나 역부족. VBA를 알고는 있었으나 경험도 없고, 막상 할려니 막막해서 손을 안 대고 있었는데, 이번 기회에 일단 헤딩하자는 마음으로 VBA로 테스트 결과를 정리하는 코딩을 하고 있다. (솔직히 코딩이라하긴 민망하고 매크로를 짠다고 해야할려나....)

 

 인생은 실전

 일단 맨 먼저해야하는 작업인 각각의 XML을 엑셀에 불러오는 코딩을 검색했고, 누군가 예시로 짜놓은 코딩을 발견하고 띄워놓고 각각의 명령문이 무엇이며, 왜 있는지, 서식은 어떻게 되는지 찾아서 공부했다. 책은 사놓은게 있었으나, 항상 코딩 공부할때 책으로 시작하거나 유튜브 보고 시작했다가 예시만 그대로 따로 적고 흥미를 잃어서 공부를 멈춘게 부지기수라 일단 당장 내가 필요한 걸 짜면서 공부 하자고 결심했기 때문이다.

 책은 따로 펼쳐서 시간 날때 천천히 읽어보고 있다. 읽으면서 "이런게 있었구나 내가 짜놓은 걸 이걸로 바꿔서 실행해 볼까?" 이런 생각이 들때면 컴퓨터를 키고 수정해본다.

 

아무튼 오늘 포스팅 할려는 내용은 VBA로 그림을 넣는 방법이다.

크게 2가지 방법이 있다.

 

Pictures.Insert 와 Shapes.Addpicture 이다.

 

제일 먼저 눈에 띄는 차이는 형식이다.

 

아래 예시를 보면

 

 

Option Explicit
Sub test_picture_insert1()

    Dim jpgFolder As String
    Dim Fname As String
    Dim imgPos_Ins As Range
    Dim imgPos_Add As Range
    
    Application.ScreenUpdating = False
    
    Sheets(1).Pictures.Delete
    Sheets(1).Cells.Clear
    
    jpgFolder = "C:\Users\Seongyong\Desktop\공부\VBA"
    Fname = "test_image_1.jpg"
    
    If Dir(jpgFolder & "\" & Fname) <> "" Then
    
        Set imgPos_Ins = Sheets(1).Cells(2, 2)
        
            'Pictures.insert 로 넣기
            With Sheets(1).Pictures.Insert(jpgFolder & "\" & Fname).ShapeRange
                .Name = Fname
                .Left = imgPos_Ins.Left
                .Top = imgPos_Ins.Top
                .Width = 300
            End With
            
        Set imgPos_Add = Sheets(1).Cells(2, 10)
            'Addpicture로 넣기
            With Sheets(1).Shapes.AddPicture(jpgFolder & "\" & Fname, msoFalse, msoTrue, 0, 0, -1, -1)
                .Name = "Addpicture_" & Fname
                .Left = imgPos_Add.Left
                .Top = imgPos_Add.Top
                .Width = 300
            End With
                
    Else
        Cells(2, 2) = "No file"
    End If
    
    Application.ScreenUpdating = True
        
End Sub

-------------------------------------------------------------------------------------------

※ 구글링으로 샘플 코딩들 보면 저런 함수 쓸때 그림 삽입 함수 끝에 .select 를 쓰고 아래에 with selection을 쓰는 코딩들을 많이 보게 되는데, 코딩을 매크로 녹화를 참고한 방식의 경우 이런 경우가 많다. select를 쓰게되는 경우 작은 작업에서는 차이가 없지만 많은 이미지를 가져오는 작업에서는 차이가 난다. 이유는 이미지를 엑셀에 붙여넣은 후에 select 함수로 이미지를 선택하고, 이미지 속성을 수정하기 때문이다.

 시작은 붙여넣기할 셀 만 셋팅하고 with에 그림삽입 함수를 넣으면서 옵션으로 속성수치를 부여하면 코딩도 짧아지고, 엑셀도 수행 단계가 줄어들어 실행 속도 향상에 도움이 됩니다.(선택을 하는 과정이 없어짐)

------------------------------------------------------------------------------------------

 

Pictures.Insert가 매우 간단해 보인다.

 

Addpicture를 쓰는 경우에는 형식이 귀찮다.

필수 항목이 많아서 구문이 길어진다.

 

위 구문을 실행하면 아래처럼 겉으로 보기엔 동일한 결과다.

 

------------------------------------------------------------------------------------

※ 밑에는 삽입된 그림 개체의 이름 입니다. 저는 예문에서 .Name을 사용해서 그림 이름을 지정했습니다. 만약 지정하지 않는다면 엑셀에서 알아서 지정합니다. 형식은 그림의 경우 Picture 10 이런식 입니다. 일반적인 경우 굳이 이름을 지정하지 않아도 되지만, 저의 경우는 통합 엑셀에 테스트 샘플과 동일한 이름으로 이미지를 저장해놓고, 나중에 분석할때 이미지 이름을 통해서 보고 싶은 샘플의 이미지만 가져오기 위함 입니다.

 제가 사용한 엑셀에 붙여진 그림의 이름을 확인하는 코딩은 아래와 같습니다.

 

Option Explicit
Sub get_image_information()

    Dim imgPick As Shape
    Dim imgName(2) As String    '그림이 2개인걸 알기 때문에 배열을 2개만 지정. 모른다면 동적배열로 지정
    Dim i As Integer
    
    Sheets(1).Cells.Clear
    
    i = 0
    
    For Each imgPick In Sheets(1).Shapes
        imgName(i) = imgPick.Name
        i = i + 1
    Next imgPick
    
    Sheets(1).Cells(16, 2) = imgName(0)
    Sheets(1).Cells(16, 10) = imgName(1)
    
End Sub

--------------------------------------------------------------------------------

 

 위 캡쳐만 보면 무슨 차이 인가 싶을 수 있다. 전혀 차이가 없다.

 

 위 두 함수의 근본적인 차이는 파일을 Link하느냐 엑셀에 Embeded 하느냐 차이다.

 

 Picture.Insert는 파일을 링크하기 때문에 사진 원본 파일이 없으면 엑셀에서 사진을 볼 수가 없다. 대신 엑셀에는 파일이 탑재되지 않기 때문에 엑셀 파일 용량은 작게 유지할 수 있다.

 

 반면  Shapes.Addpicture 는 파일을 엑셀에 탑재할 수 있는 옵션이 있다. 파라미터 중 "LinktoFile","SaveWithDocument" 이 두 항목이다. 파일과 함께 저장 부분을 True로 설정하면 엑셀에 파일을 탑재한다. 엑셀 파일만 보내면 다른 사람 컴퓨터에서도 이미지를 정상적으로 볼 수 있게 된다. 단점은 이미지가 많아질수록 엑셀파일 용량도 커지게 된다.

 

비교를 위해 예시의 액셀 파일만 다른 컴퓨터(아이폰)에 보내고 열어보았다.

 

이렇게 Pictures.Insert로 붙인 그림은 보이지 않았다.

 

-----------------------------------------------------------------------------------------------------------------------------------

결론.

 두 방법은 장단점이 확실합니다.

 

 나만 쓰는 파일이다.

 혹은 외부로 송부할때 첨부 이미지도 함께 송부한다.

 혹은 이미지 파일이 너무 많아서 엑셀에 탑재하면 용량이 너무 커진다

 이런 경우엔 Picutres.Insert 를 사용하면 될 것 같고,

 

 보고자가 직접 파일을 본다.

 혹은 파일을 받아보는 사람이 엑셀 파일 링크에 대한 개념이 전혀 없다.

 혹은 이미지가 많지 않거나 저용량 이미지라서 엑셀에 탑재해도 용량 문제가 전혀 없다.

 이런 경우엔 Shapes.Addpicture 를 사용하면 될 것 같습니다.

-----------------------------------------------------------------------------------------------------------------------------------

 

 

마지막으로 나는 초보자입니다. VBA 라는 걸 시작한지 고작 3일 밖에 되지 않았습니다.

포스팅은 내가 알게된 내용에 대하여 잊어버리지 않기 위해 정리하는 목적도 있습니다. 때문에 틀린 내용을 올리게 될 수도 있습니다. 그러므로 틀린 내용을 발견한다면, 정정 요청 부탁 드립니다.

 

 

반응형