开发功能-Visual Basic-插入-模块,插入以下代码即可。
无表头,每列分别为:文件名、图片链接、成功状态、文件名为空时的名称,图片会保存到D盘的SaveImagesByExcel
文件夹里。
版本一
Option Explicit ' 要求变量声明 Sub SaveImagesByExcel(source As Range, targetFolder As String) Dim oXMLHTTP As Object Dim oBinaryStream As Object Dim adTypeBinary As Long Dim adSaveCreateOverWrite As Long Dim i As Long Dim imagePath As String Dim imageUrl As String Dim aBytes() As Byte Dim fso As Object Dim lastRow As Long Dim fileName As String Dim fileExtension As String adTypeBinary = 1 adSaveCreateOverWrite = 2 Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0") Set oBinaryStream = CreateObject("ADODB.Stream") Set fso = CreateObject("Scripting.FileSystemObject") On Error GoTo HTTPError lastRow = source.Rows.Count For i = 1 To lastRow ' 检查第三列单元格是否为"图片成功下载",是的话直接跳过 If source.Cells(i, 3).Value = "图片成功下载" Then GoTo NextIteration End If ' 检查第二列单元格是否为空,为空则跳过 If source.Cells(i, 2).Value = "" Then GoTo NextIteration End If ' 检查第一列单元格是否为空,为空则使用 "NoFileName_" 前缀 If source.Cells(i, 1).Value = "" Then ' 使用图片名称作为文件名 fileName = GetFileNameFromURL(source.Cells(i, 2).Value) ' 如果文件名没有后缀名,则添加 ".jpg" 后缀 If InStr(fileName, ".") = 0 Then fileName = "NoFileName_" & fileName & ".jpg" Else fileName = "NoFileName_" & fileName End If ' 在第四列显示文件名和后缀 source.Cells(i, 4).Value = fileName Else fileName = source.Cells(i, 1).Value ' 使用第一列的内容作为图片名字 ' 在第四列显示空白 source.Cells(i, 4).Value = "" End If imagePath = targetFolder & "\" & fileName imageUrl = source.Cells(i, 2).Value ' 获取图片下载地址 If Not fso.FolderExists(targetFolder) Then ' 检查目标文件夹是否存在 If fso.DriveExists(Left(targetFolder, 1)) Then ' 检查目标驱动器是否存在 fso.CreateFolder targetFolder ' 如果目标文件夹不存在,创建它 Else targetFolder = "C:\SaveImagesByExcel\" ' 如果目标驱动器不存在,将目标文件夹路径更改为C盘下的SaveImagesByExcel文件夹 fso.CreateFolder targetFolder ' 创建SaveImagesByExcel文件夹 End If End If oXMLHTTP.Open "GET", imageUrl, False oXMLHTTP.Send If oXMLHTTP.Status = 200 Then ' 如果HTTP状态码为200,表示请求成功 aBytes = oXMLHTTP.responseBody With oBinaryStream .Type = adTypeBinary .Open .Write aBytes .SaveToFile imagePath, adSaveCreateOverWrite .Close End With ' 在第三列显示下载状态 source.Cells(i, 3).Value = "图片成功下载" End If NextIteration: Next i MsgBox "所有图片已成功下载至指定文件夹。" Exit Sub HTTPError: ' 在第三列显示下载状态 source.Cells(i, 3).Value = "图片下载失败" MsgBox "图片下载失败。请检查图片链接。" Exit Sub End Sub Function GetFileNameFromURL(url As String) As String Dim segments() As String segments = Split(url, "/") GetFileNameFromURL = segments(UBound(segments)) End Function Sub ChaoSavesImages() SaveImagesByExcel Range("A:D"), "D:\SaveImagesByExcel" End Sub
版本二
Option Explicit ' 要求变量声明 Sub SaveImagesByExcel(source As Range, targetFolder As String) Dim oXMLHTTP As Object Dim oBinaryStream As Object Dim adTypeBinary As Long Dim adSaveCreateOverWrite As Long Dim i As Long Dim imagePath As String Dim imageUrl As String Dim aBytes() As Byte Dim fso As Object Dim lastRow As Long Dim fileName As String Dim fileExtension As String adTypeBinary = 1 adSaveCreateOverWrite = 2 Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0") Set oBinaryStream = CreateObject("ADODB.Stream") Set fso = CreateObject("Scripting.FileSystemObject") On Error GoTo HTTPError lastRow = source.Rows.Count For i = 1 To lastRow ' 检查第三列单元格是否为"图片成功下载",是的话直接跳过 If source.Cells(i, 3).Value = "图片成功下载" Then GoTo NextIteration End If ' 检查第二列单元格是否为空,为空则跳过 If source.Cells(i, 2).Value = "" Then GoTo NextIteration End If ' 检查第一列单元格是否为空,为空则使用 "NoFileName_" 前缀 If source.Cells(i, 1).Value = "" Then ' 使用图片名称作为文件名 fileName = GetFileNameFromURL(source.Cells(i, 2).Value) ' 如果文件名没有后缀名,则添加 ".jpg" 后缀 If InStr(fileName, ".") = 0 Then fileName = "NoFileName_" & fileName & ".jpg" Else fileName = "NoFileName_" & fileName End If ' 在第四列显示文件名和后缀 source.Cells(i, 4).Value = fileName Else fileName = source.Cells(i, 1).Value ' 使用第一列的内容作为图片名字 ' 在第四列显示空白 source.Cells(i, 4).Value = "" End If imagePath = targetFolder & "\" & fileName imageUrl = source.Cells(i, 2).Value ' 获取图片下载地址 If Not fso.FolderExists(targetFolder) Then ' 检查目标文件夹是否存在 If fso.DriveExists(Left(targetFolder, 1)) Then ' 检查目标驱动器是否存在 fso.CreateFolder targetFolder ' 如果目标文件夹不存在,创建它 Else targetFolder = "C:\SaveImagesByExcel\" ' 如果目标驱动器不存在,将目标文件夹路径更改为C盘下的SaveImagesByExcel文件夹 fso.CreateFolder targetFolder ' 创建SaveImagesByExcel文件夹 End If End If oXMLHTTP.Open "GET", imageUrl, False oXMLHTTP.Send If oXMLHTTP.Status = 200 Then ' 如果HTTP状态码为200,表示请求成功 aBytes = oXMLHTTP.responseBody With oBinaryStream .Type = adTypeBinary .Open .Write aBytes .SaveToFile imagePath, adSaveCreateOverWrite .Close End With ' 在第三列显示下载状态 source.Cells(i, 3).Value = "图片成功下载" End If NextIteration: Next i MsgBox "所有图片已成功下载至指定文件夹。" Exit Sub HTTPError: ' 在第三列显示下载状态 source.Cells(i, 3).Value = "图片下载失败" MsgBox "图片下载失败。请检查图片链接。" Exit Sub End Sub Function GetFileNameFromURL(url As String) As String Dim segments() As String segments = Split(url, "/") GetFileNameFromURL = segments(UBound(segments)) End Function Sub ChaoSavesImages() Dim targetFolder As String Dim folderNumber As Long Dim currentDateTime As String folderNumber = 1 currentDateTime = Format(Now(), "YYYYMMDD_HHMMSS") targetFolder = "D:\SaveImagesByExcel\" & folderNumber & "_" & currentDateTime Do While Dir(targetFolder, vbDirectory) <> "" ' 检查文件夹是否存在,如果存在则递推序号 folderNumber = folderNumber + 1 targetFolder = "D:\SaveImagesByExcel\" & folderNumber & "_" & currentDateTime Loop SaveImagesByExcel Range("A:D"), targetFolder End Sub