반응형

오늘 소개해 드릴 내용은 엑셀 시트에 이미지 파일명과 경로가 있는 상태에서 선택한 이미지만 뷰어로 바로 확인하는 방법 입니다.

이미지가 수백개 들어있는 엑셀 시트에 이미지를 모두 붙여넣는 기능도 사용할 수 있겠지만 이미지가 매우 크거나 이미지가 수시로 업데이트 될 수도 있겠고요, 또 이미지가 너무 많은 경우 이미지를 모두 붙여 넣으면 엑셀 파일의 용량이 매우 커지겠죠.

그럴 때 사용하면 괜찮은 기능입니다.

바로 어떻게 생긴 이미지인지 궁금한 대상만 선택하여 바로 이미지 뷰어로 보는 것이죠.

 

먼저 이미지 파일명이 쭈~ 욱 들어있는 엑셀 파일을 준비하시고 스크립트를 동작시킬 단추를 하나 추가합니다.

상단을 틀고정 같은걸로 고정해 놓으면 리스트를 내려도 단추가 계속 보일 거에요.

단추를 추가하는 방법을 모르고 계시만 아래 포스트를 참고해 주세요
https://diy-dev-design.tistory.com/59

 

이미지 리스트와 단추가 준비된 엑셀

위 엑셀 리스트는 예전에 제가 폴더 내의 파일 정보를 가져오는 스크립트를 이용하여 만든 리스트 입니다.

제가 원하는 기능은 이미지 파일명을 선택하고 버튼을 누르면 윈도우에서 지정된 이미지 뷰어로 해당 파일을 열어서 보여주는 것입니다.

그럼 선택한 셀 정보를 얻어오는 스크립트가 필요하겠고 윈도우 shell 명령으로 이미지 파일을 연결하면 윈도우에서 지정한 이미지 뷰어가 이미지를 열어주겠죠?

먼저 선택한 셀 정보를 얻는 스크립트가 필요하겠죠? 여기를 참고하세요

선택한 셀에 이미지 파일명을 아래와 같이 shell 명령을 사용하면 이미지가 열리게 됩니다.

Dim wsh As Object
    
Set wsh = VBA.CreateObject("WScript.Shell")
wsh.Run imgName

 

전체 코드를 볼까요?

Sub showImage()

    Dim aSht As Worksheet
    Dim currentSelection As Range
    Dim imgExtName As String
    Dim imgName As String
    Dim curext As String
    Dim wsh As Object
    
    Set wsh = VBA.CreateObject("WScript.Shell")
    
    Set aSht = ActiveSheet
    Set currentSelection = Selection.Cells()
    
    imgExtName = ".png.jpg.jpeg.bmp.gif.webp.pct.ico...."
    
    curext = LCase(Right(currentSelection.Value, 4))
    
    If (InStr(imgExtName, curext)) Then ' 현재 선택한 셀 내용 중 이미지 확장자를 가지고 있으면
        imgName = currentSelection.Offset(0, -1).Value & "\" & currentSelection.Value
        If Dir(imgName) <> "" Then
            wsh.Run imgName
            
        End If
    Else
        MsgBox ("이미지 파일명이 들어있는 셀을 선택해 주세요")
    End If
    
End Sub

 

선택한 셀이 이미지 파일명인지 아닌지는 확장자로 검사를 하도록 했습니다. imgExtName 이라는 문자열에 이미지 확장자들을 쭈욱 넣어둔 뒤에 실제 선택한 셀의 텍스트에서 뒤에서 4글자를 떼어낸 뒤에 위에 말씀드린 문자열 중에 포함되는지를 검사하는 것이죠.

아주 정교한 방식이라고 볼 수는 없지만 간단하게 구현할 수 있는 이미지 검출 방식이라 할 수 있겠습니다.

어쨌든 이렇게 이미지 파일명이 맞는지 확인한 뒤에 앞에있는 경로명과 결합해서 해당 이미지가 실제로 존재하는 이미지 인지 추가로 확인한 뒤에 shell 명령을 통해 이미지를 열어주게 됩니다. 

저는 바로 왼쪽 옆칸에 경로가 있어 offset(0,-1) 과 같은 방법으로 연결하였지만 별도 셀에 이미지 경로가 들어있다면 해당 경로를 따로 지정해 주거나 스크립트 내에 문자열로 넣어 주셔도 되겠습니다.

이렇게 만들어진 매크로를 버튼에 연결하는 방법은

버튼을 최초 생성할때도 보였겠지만 매크로를 연결하는 메뉴가 있습니다. 단추에서 오른쪽 클릭한 다음 "매크로지정" 을 선택하면 매크로 선택창이 나타나게 되는데요, 여기서 지금 만들어준 스크립트를 선택해주면 됩니다.

매크로 지정하는 과정

 

자 이제 어떻게 동작하는지 한번 볼까요?

먼저 이미지 들이 들어있는 폴더가 있을 거고요. 만약 이미지가 아닌 셀을 선택하면 경고창을, 이미지 이름을 선택하면 윈도우 이미지 뷰어로 바로 열리게 됩니다.

선택한 이미지가 열리는 기능이 실제 동작되는 화면

 

자 간단하게 원하는 기능이 구현되었습니다.

필요하신 분들은 소스 복사하셔서 사용하시면 될 것 같고요. 잘 응용하셔서 본인의 엑셀 문서에 딱 맞는 기능으로 추가하시면 되겠습니다..

 

그럼 이만~

반응형
반응형

안녕하세요. 오늘은 엑셀 리스트로 가지고 있는 웹 이미지 경로를 이용하여 일괄 다운로드 하는 방법을 소개해 드릴까 합니다. 

인터넷에 찾아보면 이런저런 다운로더들이 있는데요. 입맛에 맞는 프로그램을 찾는 것도 일이고 프로그램이 원하는 형식으로 다운로드용 이미지 리스트를 작성하는것도 번거롭더군요.

이미 엑셀로 이미지 리스트의 웹 주소가 있는데 그냥 엑셀만으로 다운로드 할 수 있을까 해서 좀 찾아 보았습니다. 찾아보니 괜찮은 레퍼런스들이 좀 있었는데요. 사용하기 번거로워 보여 직관적으로 손쉽게 사용할 수 있도록 코드를 좀 손보았습니다.

사실 제가 필요했던 상황이기도 해서 당장 급하게 찾았던 것인데 시간도 없고 별도 프로그램 찾는것 보다 레퍼런스를 이용해서 직접 수정해서 코딩하는게 더 빠르더군요.

저의 경우에는 무려 7000 장 이상의 이미지를 로컬로 내려받아서 확인을 해야 하는 상황이었는데요. 개발팀에 요청하니 4일이나 걸린다고 하더군요. 물론 그 분들도 다른 일정이 있었기 때문이었겠지만 저는 그렇게 기다릴 수는 없었습니다.

 

일단 저의 경우를 기준으로 설명드릴 수 는 없고 일반적인 상황을 가정해 보겠습니다.

엑셀의 A열에 이미지 7000장의 인터넷 경로가 있습니다. 

엑셀의 B 열에는 로컬에 저장되어야 할 이미지 파일명을 준비해 놓았다고 하면 아래의 코드로 간단하게 다운로드 할 수 있습니다.

 

 

엑셀을 이용하여 일괄 이미지 다운로드 하는 방법

 

alt + F11 을 눌러 vba 창을 열어준 뒤 아래 코드를 현재 통합 문서의 스크립트 창에 붙여 넣어 주세요.

그런다음 이미지 주소가 들어있는 열의 첫번째 셀의 이름, 저장할 이미지가 들어있는 열까지의 offset 등을 설정해 준뒤 F5 키를 눌러 실행해 주면 됩니다. 이때 키보드 커서가 Sub 함수 안에 있어야 바로 실행이 되고요, 그렇지 않은 경우 실행할 함수를 한번 선택해주는 창이 뜰텐데 downloadAllImage 를 선택해 주시면 됩니다.

Option Explicit

Sub downloadAllImages()

    Dim asht As Worksheet
    Dim rngA As Range
    Dim c As Range
    Dim sPath As String
    Dim extensions() As String
    
    Set asht = ActiveSheet
    Set rngA = asht.Range("a2") ' 이미지 리스트가 존재하는 첫번째 셀 '
    
    Set rngA = asht.Range(rngA, rngA.End(xlDown))
    
    sPath = "d:\ImageAutoDownload_test\\" ' 저장할 경로를 넣으세요'
    
    For Each c In rngA
        Dim myURL As String
        If Len(c.Value) Then
            Dim imgName As String
            
            imgName = c.Offset(0, 1).Value   ' 이미지별 저장할 이름이 기록된 열 '
            
            myURL = c.Value
            extensions = Split(myURL, ".") ' 확장자가 3글자가 아닐수도 있으므로 확장자를 판별해내기위한 배열 생성
                
            imgName = imgName & "." & extensions(UBound(extensions)) '위에서 구한 배열에서 확장자를 꺼내자
            
            WebFileDownload myURL, imgName, sPath
            
        End If
    
    Next c

End Sub


Public Function WebFileDownload(ByVal strURL As String, ByVal saveFileName As String, ByVal savepath As String) As Boolean
    Dim Buf() As Byte, oWinHttp
On Error GoTo Err_Sub
    Set oWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    With oWinHttp
        .Open "GET", strURL, 0
        .Send
        Buf = .ResponseBody
    End With
    Open savepath & saveFileName For Binary Access Write As #1
    Put #1, , Buf
    Close #1
       
    Set oWinHttp = Nothing
       
Err_Sub:
    If Err Then MsgBox Err.Description
    If Not oWinHttp Is Nothing Then Set oWinHttp = Nothing
    
End Function

 

어떠신가요? 복잡하지 않죠? 정상적으로 코드를 옮기고 세팅을 하셨다면 아마 잘 동작하실 겁니다.

 

이미지 7000 장을 하나하나 링크 복사해서 브라우저에 붙여넣고 다른이름으로 저장하고... 또 복사하고 붙여넣고 다른이름으로 저장하고... 했을걸 생각하면 정말 토나오는 일이지요. 만약 정말 일일이 수동으로 위와 같이 진행했다면 몇 일을 해야 했을 지도 모릅니다.

저의 경우엔 7000장 내려받는데 코딩하는 시간을 포함해서 20분만에 끝났습니다. ^^

이런게 바로 디자이너면서 개발하는 맛이지요. 

 

어쨌든 다운로드할 이미지 리스트를 가지고 계신데 적당한 툴이 없어 고민이셨던 분이 있으시다면 도움이 되었길 바랍니다.

 

2022-2-24일 수정

확장자가 3글자가 아닌 경우도 있을 수 있어 주소에서 유동적으로 확장자를 가져올 수 있도록 수정하였습니다.

'선택적 인수가 아닙니다.' 라는 오류가 나는 부분이 있어 내용 수정하였습니다. 함수 호출 시 저장할 경로인 sPath 가 누락되어 있었네요. 

 

 

2020/08/27 - [DEV/VBA] - 재택근무 필수 엑셀 "자리안비움" - 윈도우 꺼짐 방지

2020/06/22 - [DEV/VBA] - [vba] 초등학교 연산 자동 문제집 - 곱셈 추가

2020/01/08 - [DEV/c#] - Excel Automate, 엑셀 자동화 프로그램

2019/10/01 - [DEV/VBA] - [VBA] 엑셀 VBA로 포토샵 연동이 가능할까?

 

반응형
반응형

필자의 블로그 명칭을 보고 이미 알고 계신분이 있을지 모르겠지만 사실 저는 디자이너 입니다. 하지만 블로그에 맨 개발 관련 된 이야기만 적고 있지요.

음... 그런데 실제로 회사에서도 저는 대부분의 시간을 코드와 씨름하며 지내고 있습니다.

회사에서 사람들은 개자이너라고 부르기도 합니다.  디자인 팀에 있지만 디자인은 잘 못합니다. -_-;;

 

어쨌든 오늘은 본격적으로 C# 으로 프로그램을 하나 만들 예정입니다. (프로그램은 맨 아래 있습니다)

이름하야 "ExcelAutomate" 두둥~

네.. 그렇습니다. 제가 VBA 로 각종 자동화 로직을 올렸는데요. 사실 개발에 관심은 1도 없는 분들이 과연 VBA 창을 열어놓고 제가 올려드린 코드를 붙여넣고 경로와 설정을 세팅해가며 자동화 로직을 사용할 것이냐! 하는것이죠.

아마 아니겠죠.

 

그래서 부족한 실력이나마 저도 개발 공부를 할 겸 프로그램을 만들어 보기로 하였습니다.

개발은 1도 몰라도 사용할 수 있는 엑셀 자동화 프로그램 말이죠.

제가 애정하는 프로그램중에 DarkNamer 라고 있습니다. 그런 누구에게나 사랑받는 툴을 한번만들어 보겠습니다. 바로 이 글을 읽는 여러분과 함께요.

네 이 포스트는 바로 방문객 참여형 포스트가 되겠습니다. 

이 포스트에 뎃글로 남겨주시는 엑셀 자동화 기능을 제가 한번 만들어 보겠습니다. 어디까지 할수 있을지는 모르겠지만 한번 최선을 다해 보겠습니다.

물론 참여 해주시지 않아도 저는 만들겠지만요. 그렇게 되면 어쩌면 제가 사용하는 기능들만 담을 지 모르겠습니다.

자 그럼 시작하겠습니다. 여기부터는 계속 업데이트 될 때 마다 내용을 추가하도록 하겠습니다. 가장 아래쪽에 항상 최신 버전의 Application 을 올리도록 하겠습니다.

바이러스 따위는 없으니 걱정마세요.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

 

 

첫번째는 그림 자동으로 붙여 넣기 입니다.

네 첫번째 버전입니다.

프로그램을 실항하기 전 엑셀 시트를 열어 놓고 이미지 이름이 붙어있는 데이터를 준비합니다. 

이미지 파일명이 기록된 엑셀 시트를 준비하자

요렇게요.

그런 다음 다운로드 받은 툴을 실행합니다.

그런 다음 엑셀 오토메이트에서 [get xls name] 버튼을 클릭합니다. 

 

그러면 오른쪽 드롭다운 메뉴에 현재 열려있는 엑셀 파일명이 보여집니다. 해당 엑셀 파일을 선택한 뒤

이미지를 붙여넣을 시트를 선택해 주어야 합니다. [get sheet name] 버튼을 클릭합니다.

그러면 역시 우측 드롭다운 메뉴에 시트 명칭이 표시가 됩니다.

해당 시트까지 선택해 준 뒤 아래 image name start 라는 칸에 이미지 이름이 있는 첫번째 칸의 이름을 적어 줍니다. A2 이런 식으로 적으면 됩니다.

그리고 이미지가 붙을 첫번째 칸의 이름을 역시 paste start에 붙여 줍니다. 

만약 이미지 이름안에 확장자가 없는 경우 우측 extension 칸에 확장자 명을 적어 줍니다. 이때 반드시 . 을 포함하여 ".png" 와 같이 적어 주어야 합니다.

제 예제와 같이 파일명 안에 확장자가 포함된 경우 무시해도 됩니다.

그리고 마지막으로 맨 아래 칸에 이미지가 들어있는 경로 이름을 적어주면 됩니다.

그럼 이런 상태가 되죠

요 상태에서 Run 버튼을 누르시면 바로 엑셀 시트에 이미지가 붙게 됩니다.

이미지가 자동으로 추가된 모습

 

엑셀에 있는 여러개의 그림을 지울때는 두번째 Tab 에 있는 "delete image" 를 선택합니다.

기본으로 설정되어 있는 영역을 변경해 줍니다. 예를 들면 B2 ~ B100 까지의 셀에 들어있는 이미지를 지우려면 

"delete range from" 의 값을 B2로, "delete range To" 의 값을 B100 으로 작성한 뒤 Run 버튼을 눌러주게 되면 해당 영역의 이미지가 자동으로 모두 지워지게 됩니다.

B2 ~ F1000 과 같이 하면 한줄이 아닌 여러 열의 이미지를 한번에 지울 수 있습니다.

 

2022-05-28 업데이트

> 가로로 붙이기 기능이 추가되었습니다. 체크박스(가로로 붙이기) 선택

이미지 가로로 붙이기

> 하위폴더에 이미지가 있는 경우도 동작하게 하였습니다. 

하위폴더에 이미지가 들어있는 경우도 동작

> 셀 고정 크기 지원 : 이미지를 붙이는 동안 셀의 크기를 조정하지 않습니다.

> get sheet 버튼 삭제 : 엑셀 이르을 선택하면 자동으로 sheet 가 리스트에 포함됩니다.


2023-01-11 업데이트

> 붙여넣을 이름이 유사한 경우 잘못 붙는 오류 수정 (이름이 정확히 동일할 때만 동작)



<프로그램 구매하기>

프로그램을 이용하는데 별도로 비용을 지불하실 필요는 없지만 유용하게 사용하고 계신다면 아래 링크를 통하여 후원을 해주시면 됩니다. 커피한잔 사준다 생각하시고 후원 해 주시면 또 다른 좋은 프로그램을 만드는데 도움이 될 것 같습니다. 

 

<주의사항>

엑셀 2016 에서 테스트 되었습니다,

시트의 확대 축소 비율을 100% 인 상태에서 실행해 주세요.

 

 

<다운로드 링크>

excelAutomate.7z
0.02MB
excelAutomate.zip
0.04MB

 

 

<다운로드 링크 - 구글드라이브>

https://drive.google.com/file/d/1jCSz9rNPuA4Q482ocyE6yAUjUIyhE0_h/view?usp=sharing 

 

excelAutomate.7z

 

drive.google.com

https://drive.google.com/file/d/12vDwn6WM_lAuqrwfZ1ShMXjKvajYZoNE/view?usp=sharing 

 

excelAutomate.zip

 

drive.google.com

프로그램 - 7zip 또는 zip 버전 중 하나를 다운받으신 뒤 압축을 풀고 사용하시면 됩니다.

뎃글로 필요하신 기능 남겨 주시면 한번 있는 힘껏 개발해 보겠습니다.

 

감사합니다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

 

 

2020/03/18 - [DEV/VBA] - 엑셀 머릿글(header)에 이미지 또는 문구 자동으로 삽입하기

 

엑셀 머릿글(header)에 이미지 또는 문구 자동으로 삽입하기

오늘 포스트에서는 지난 엑셀 자동화 툴의 뎃글로 문의 주신 헤더에 이미지를 VBA 를 이용하여 자동으로 삽입하는 내용을 소개해 드릴까 합니다. "엑셀파일 수백개가있는데 파일의 시트마다 머리글에 이미지를 삽..

diy-dev-design.tistory.com

2020/01/03 - [DEV/c#] - [C#] C# APP 에서 엑셀 연동해보기

 

[C#] C# APP 에서 엑셀 연동해보기

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습니다. 이런 경우..

diy-dev-design.tistory.com

 

2020/06/03 - [DEV/c#] - C# .net으로 photoshop 연동하기

 

C# .net으로 photoshop 연동하기

저는 회사에서 디자인팀에 있고 전공도 디자인과 출신이며 심지어는 고등학교도 예체능계열 고등학교를 나왔습니다만 지금 회사에서 하는일의 95% 정도는 개발을 하고 있습니다. 실제로 제가 ��

diy-dev-design.tistory.com

 

반응형

+ Recent posts