实例需求:根据Excel表格A列中的链接下载图片,B列为文件名,C列为文件类型。
示例代码如下。
Sub DownloadImagesAsFiles()
Dim lngRow As Long
Dim strURL As String
Dim strFileName As String
Dim ImageData() As Byte
Dim objXMLHTTP As Object
Dim objStream As Object
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
Set objStream = CreateObject("ADODB.Stream")
For lngRow = 2 To Cells(Rows.Count, "A").End(xlUp).Row
strURL = Cells(lngRow, "A").Value
strFileName = Cells(lngRow, "B").Value & "." & Cells(lngRow, "C")
With objXMLHTTP
.Open "GET", strURL, True
.send
ImageData = .responseBody
End With
With objStream
.Type = 1
.Open
.Write ImageData
.SaveToFile ThisWorkbook.Path & "\" & strFileName, 2
.Close
End With
Next lngRow
Set objXMLHTTP = Nothing
Set objStream = Nothing
End Sub
【代码解析】
第8行代码创建MSXML2.XMLHTTP
对象用于下载图片。
第9行代码创建ADODB.Stream
对象用于解码图片内容,并保存图片文件。
第10~25行代码循环处理每行数据。
第11行代码读取图片URL链接。
第12行代码构建图片文件名。
第14行代码使用Get
方法下载图片。
第10行开始循环迭代Excel表格中的行,从第2行到最后一个非空单元格所在行。
第13~17行代码使用objXMLHTTP对象执行GET请求,将下载的图片数据存储在ImageData变量中。
第18~25行代码使用objStream对象将ImageData变量中的图像数据写入到磁盘上的文件中,文件名为strFileName变量中的值,存储在当前工作簿的路径下。
第19行代码用来设置objStream对象的属性Type,用来指定流的类型。在此代码中,属性Type被设置为 1,表示这是一个二进制流。
第26~27行代码释放对象变量占用的系统资源。
如果下载图片失败,可以尝试在send
代码行之后添加如下代码,增加延时。
Dim i As Integer: For i = 1 To 1000: DoEvents: Next