안녕하세요. 오늘은 엑셀 리스트로 가지고 있는 웹 이미지 경로를 이용하여 일괄 다운로드 하는 방법을 소개해 드릴까 합니다.
인터넷에 찾아보면 이런저런 다운로더들이 있는데요. 입맛에 맞는 프로그램을 찾는 것도 일이고 프로그램이 원하는 형식으로 다운로드용 이미지 리스트를 작성하는것도 번거롭더군요.
이미 엑셀로 이미지 리스트의 웹 주소가 있는데 그냥 엑셀만으로 다운로드 할 수 있을까 해서 좀 찾아 보았습니다. 찾아보니 괜찮은 레퍼런스들이 좀 있었는데요. 사용하기 번거로워 보여 직관적으로 손쉽게 사용할 수 있도록 코드를 좀 손보았습니다.
사실 제가 필요했던 상황이기도 해서 당장 급하게 찾았던 것인데 시간도 없고 별도 프로그램 찾는것 보다 레퍼런스를 이용해서 직접 수정해서 코딩하는게 더 빠르더군요.
저의 경우에는 무려 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로 포토샵 연동이 가능할까?
'DEV > VBA' 카테고리의 다른 글
[excel vba] 16진수를 10진수로, 10진수를 16진수로 변경 (0) | 2022.12.02 |
---|---|
[VBA] 선택한 셀의 이미지 파일 이미지 뷰어로 열기 (0) | 2022.06.16 |
재택근무 필수 엑셀 "자리안비움" - 윈도우 꺼짐 방지 (25) | 2020.08.27 |
[vba] 초등학교 연산 자동 문제집 - 곱셈 추가 (0) | 2020.06.22 |
[Excel] LCD 인치 정보로 가로 세로 길이 알아내는 방법 (0) | 2020.05.21 |