You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从SharePoint同一链接下载多个文件?附单文件下载VBA代码

从SharePoint批量下载文件的VBA解决方案

嘿,我来帮你把这段代码改造成能批量下载SharePoint文件的版本!基于你现有的URLDownloadToFile函数,我们可以通过循环处理多个文件的方式实现需求,下面给你两种实用的方案:

方案一:已知要下载的文件名(精准批量下载)

如果你明确知道要下载的所有文件名,直接把它们放进列表循环处理就好,代码改造如下:

' 保留你的API声明
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Dim Ret As Long

Sub Batch_Download_From_SharePoint()
    Dim strBaseURL As String
    Dim strSavePath As String
    Dim fileList As Variant
    Dim fileName As Variant
    Dim sDate As Date
    
    ' 替换成你的实际参数
    sDate = Date ' 或者你指定的目标日期
    strBaseURL = "https://your-sharepoint-site/folder-path/" ' SharePoint文件夹的基础链接,末尾加/
    strSavePath = "C:\Your\Local\Save\Folder\" ' 本地保存路径,末尾加/
    
    ' 定义要下载的文件名列表,按需添加或修改
    fileList = Array( _
        "report.Denial." & Format(sDate, "yyyymmdd") & ".xlsx", _
        "report.Approval." & Format(sDate, "yyyymmdd") & ".xlsx", _
        "report.Pending." & Format(sDate, "yyyymmdd") & ".xlsx" _
    )
    
    ' 循环下载每个文件
    For Each fileName In fileList
        Dim strFullURL As String
        Dim strFullSavePath As String
        
        strFullURL = strBaseURL & fileName
        strFullSavePath = strSavePath & fileName
        
        ' 调用下载函数
        Ret = URLDownloadToFile(0, strFullURL, strFullSavePath, 0, 0)
        
        ' 反馈下载结果
        If Ret = 0 Then
            MsgBox fileName & " 下载成功!", vbInformation
        Else
            MsgBox fileName & " 下载失败,错误代码:" & Ret, vbExclamation
        End If
    Next fileName
End Sub

使用说明:把要下载的文件名全部放进fileList数组,代码会自动逐个构建完整的SharePoint链接和本地保存路径,完成批量下载。

方案二:自动获取文件夹下所有文件(全量下载)

如果你不知道具体文件名,想下载整个SharePoint文件夹里的所有文件,可以通过SharePoint的REST API先获取文件列表,再循环下载:

' 保留你的API声明
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Dim Ret As Long

Sub Download_All_Files_From_SharePoint_Folder()
    Dim strSPFolderAPI As String
    Dim strLocalSavePath As String
    Dim objXMLHTTP As Object
    Dim objScript As Object
    Dim fileResults As Variant
    Dim singleFile As Variant
    Dim strFullURL As String
    Dim strFullSavePath As String
    
    ' 替换成你的实际参数
    strSPFolderAPI = "https://your-sharepoint-site/_api/web/getfolderbyserverrelativeurl('/sites/your-site/target-folder')/files"
    strLocalSavePath = "C:\Your\Local\Save\Folder\"
    
    ' 创建文件夹(如果不存在)
    If Dir(strLocalSavePath, vbDirectory) = "" Then MkDir strLocalSavePath
    
    ' 调用SharePoint REST API获取文件列表
    Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0")
    objXMLHTTP.Open "GET", strSPFolderAPI, False
    objXMLHTTP.setRequestHeader "Accept", "application/json;odata=verbose"
    objXMLHTTP.send
    
    ' 解析返回的JSON数据
    Set objScript = CreateObject("Microsoft.JScript")
    objScript.execScript "var data = " & objXMLHTTP.responseText, "JScript"
    fileResults = objScript.data.d.results
    
    ' 循环下载每个文件
    For Each singleFile In fileResults
        strFullURL = "https://your-sharepoint-site" & singleFile.ServerRelativeUrl
        strFullSavePath = strLocalSavePath & singleFile.Name
        
        Ret = URLDownloadToFile(0, strFullURL, strFullSavePath, 0, 0)
        
        ' 打印下载日志到立即窗口
        If Ret = 0 Then
            Debug.Print singleFile.Name & " 下载成功"
        Else
            Debug.Print singleFile.Name & " 下载失败,错误代码:" & Ret
        End If
    Next singleFile
    
    MsgBox "全量下载完成!", vbInformation
    
    ' 释放对象
    Set singleFile = Nothing
    Set fileResults = Nothing
    Set objScript = Nothing
    Set objXMLHTTP = Nothing
End Sub

使用说明:需要替换strSPFolderAPI里的站点地址和文件夹路径,API格式为https://你的站点域名/_api/web/getfolderbyserverrelativeurl('/sites/站点名/文件夹路径')/files,代码会自动获取该文件夹下的所有文件并下载到本地。

一些注意事项

  • 权限问题:URLDownloadToFile会默认使用当前Windows账号的凭据,确保你的账号有目标SharePoint文件夹的访问权限
  • 路径格式:所有SharePoint链接和本地路径的末尾记得加/,避免拼接文件名时出现错误
  • 错误排查:如果下载失败,Ret返回的错误码可以对应urlmon库的官方错误定义,比如12029代表网络连接异常,12002代表请求超时

内容的提问来源于stack exchange,提问作者Jose M.

火山引擎 最新活动