如何使用VBA批量下载图片

该VBA宏用于从Excel表格的A列链接下载图片,B列指定文件名,C列指定文件类型。它创建MSXML2.XMLHTTP对象获取图片数据,然后使用ADODB.Stream对象保存到本地文件。如果遇到问题,代码提供了下载延时的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实例需求:根据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
运行环境 .NET Framework2.0 开发工具 Microsoft Visual Studio 2005 二. 部分代码说明(主要讲解异步分析和下载): 异步分析下载采取的策略是同时分析同时下载,即未等待数据全部分析完毕就开始把已经分析出来的图片链接开始下载下载成功的均在List框链接前面划上了√ ,未能下载图片有可能是分析错误或者是下载异常。 1. 异步分析部分代码 /// /// 异步分析下载 /// private void AsyncAnalyzeAndDownload(string url, string savePath) { this.uriString = url; this.savePath = savePath; #region 分析计时开始 count = 0; count1 = 0; freq = 0; result = 0; QueryPerformanceFrequency(ref freq); QueryPerformanceCounter(ref count); #endregion using (WebClient wClient = new WebClient()) { AutoResetEvent waiter = new AutoResetEvent(false); wClient.Credentials = CredentialCache.DefaultCredentials; wClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(AsyncURIAnalyze); wClient.DownloadDataAsync(new Uri(uriString), waiter); //waiter.WaitOne(); //阻止当前线程,直到收到信号 } } /// /// 异步分析 /// protected void AsyncURIAnalyze(Object sender, DownloadDataCompletedEventArgs e) { AutoResetEvent waiter = (AutoResetEvent)e.UserState; try { if (!e.Cancelled && e.Error == null) { string dnDir = string.Empty; string domainName = string.Empty; string uri = uriString; //获得域名 http://www.sina.com/ Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase domainName = match.Value; //获得域名最深层目录 http://www.sina.com/mail/ if (domainName.Equals(uri
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值