使用Excel VBA获取SharePoint文件夹的内容

24

通常我使用以下代码在VBA中检索文件夹内容。但在SharePoint上不起作用。我该怎么办?

Dim folder As folder
Dim f As File
Dim fs As New FileSystemObject

Set folder = fs.GetFolder("//sharepoint.address/path/to/folder")

For Each f In folder.Files
    'Do something
Next f

编辑(在shahkalpesh的良好评论之后):

如果我在Windows资源管理器中输入地址,就可以访问SharePoint。访问SharePoint需要身份验证,但它是透明的,因为它依赖于Windows登录。


你是否可以使用Windows资源管理器导航到SharePoint文件夹? - shahkalpesh
是的!它看起来像一个普通的网络文件夹。 - afewcc
11个回答

19
我发现在拥有服务器权限时,唯一能使用的与SharePoint上的文件进行交互的方式是将WebDAV文件夹映射为驱动器。以下是实现示例:
在VBA中添加对以下ActiveX库的引用: - Windows Script Host Object Model (wshom.ocx) - 用于WshNetwork - Microsoft Scripting Runtime (scrrun.dll) - 用于FileSystemObject
创建一个新的类模块,将其命名为“DriveMapper”,并添加以下代码:
Option Explicit

Private oMappedDrive As Scripting.Drive
Private oFSO As New Scripting.FileSystemObject
Private oNetwork As New WshNetwork

Private Sub Class_Terminate()
  UnmapDrive
End Sub

Public Function MapDrive(NetworkPath As String) As Scripting.Folder
  Dim DriveLetter As String, i As Integer

  UnmapDrive

  For i = Asc("Z") To Asc("A") Step -1
    DriveLetter = Chr(i)
    If Not oFSO.DriveExists(DriveLetter) Then
      oNetwork.MapNetworkDrive DriveLetter & ":", NetworkPath
      Set oMappedDrive = oFSO.GetDrive(DriveLetter)
      Set MapDrive = oMappedDrive.RootFolder
      Exit For
    End If
  Next i
End Function

Private Sub UnmapDrive()
  If Not oMappedDrive Is Nothing Then
    If oMappedDrive.IsReady Then
      oNetwork.RemoveNetworkDrive oMappedDrive.DriveLetter & ":"
    End If
    Set oMappedDrive = Nothing
  End If
End Sub

然后您可以在您的代码中实现它:

Sub test()
  Dim dm As New DriveMapper
  Dim sharepointFolder As Scripting.Folder

  Set sharepointFolder = dm.MapDrive("http://your/sharepoint/path")

  Debug.Print sharepointFolder.Path
End Sub

映射网络驱动器可能会很棘手;我发现如何映射SharePoint对解决这个问题非常有用。 - Adriaan
1
这段代码看起来非常有前途,但是在Sub test()中,对于Dim dm as New DriveMapper一行,会抛出“未定义的类型”编译错误。也许我缺少一个DLL引用?我已经添加了Microsoft Scripting Runtime和Windows Script Host Object Model。使用Excel 2010。 - Shrout1
抱歉回复晚了 @shrout1,也许你创建的是模块而不是类? - Chris Hayes
感谢您提供的绝佳解决方案。通过直接连接,我必须在获得活动连接之前手动“访问”SharePoint网站,但映射驱动器似乎解决了这个问题。有一个问题:在调用DriveMapper类的代码完成之前,如何避免取消映射驱动器?我对它们的工作原理还不是很熟悉。 - Trm
@Trm 有人编辑了我的帖子,将代码包装在一个带有“Class_Terminate”的类中,该方法会取消映射驱动器。当类超出范围时,驱动器将被取消映射。你可以只删除“Class_Terminate”方法... - Chris Hayes
@ChrisHayes 是的,我也想到了。我把它删掉后,每次打开连接时都会遇到一堆映射的驱动器。我通过将映射的驱动器字母保存到内存中,并在模块中的sub结束时取消映射来实现了一些解决方法。不确定这是否是最优雅的解决方案。 - Trm

16

使用UNC路径而不是HTTP。以下代码可正常工作:

Public Sub ListFiles()
    Dim folder As folder
    Dim f As File
    Dim fs As New FileSystemObject
    Dim RowCtr As Integer

    RowCtr = 1
    Set folder = fs.GetFolder("\\SharePointServer\Path\MorePath\DocumentLibrary\Folder")
    For Each f In folder.Files
       Cells(RowCtr, 1).Value = f.Name
       RowCtr = RowCtr + 1
    Next f
End Sub

要获取可用的 UNC 路径,请进入文档库中的文件夹,展开“操作”菜单并选择“在 Windows 资源管理器中打开”。复制您在那里看到的路径并使用它。


请参考此链接以启用FileSystemObject。 - enderland
无法与SharePoint在线配合使用。您只能通过HTTP或WebDav访问。 - Rob Nicholson

11

除此之外:

myFilePath = replace(myFilePath, "/", "\")
myFilePath = replace(myFilePath, "http:", "")

也替换空格:

myFilePath = replace(myFilePath, " ", "%20")

2

我花了一些时间研究这个问题,并找到了一个非常简单的两行代码解决方案,只需将“http”和所有正斜杠替换为以下内容:

myFilePath = replace(myFilePath, "/", "\")
myFilePath = replace(myFilePath, "http:", "")

可能不适用于每个人,但对我有效。

如果您正在使用安全站点(或希望同时考虑两者),您可能希望添加以下行:

myFilePath = replace(myFilePath, "https:", "")

1
实际上,对我来说上面的内容似乎不完整,应该是这样的 https:(除了上面的代码) myFilePath = Replace(myFilePath, Split(myFilePath, "\")(2), Split(myFilePath, "\")(2) & "@SSL") 这将最终将 https://my.SharePoint.com/ 转换为 \\my.SharePoint.com@SSL\ (在所有替换后)。 - Ralph

2
在我看来,最酷的方法是通过WebDAV(不使用网络文件夹,因为这通常是不允许的)。可以通过ActiveX数据对象实现此目的,如优秀文章中所述的优秀文章中所列出的那样(代码可以直接在Excel中使用,我最近使用了这个概念)。
希望这有所帮助!

http://blog.itwarlocks.com/2009/04/28/accessing-webdav-in-microsoft-word-visual-basic/

原链接已失效,但至少文本内容仍可在archive.org上找到: http://web.archive.org/web/20091008034423/http://blog.itwarlocks.com/2009/04/28/accessing-webdav-in-microsoft-word-visual-basic

5
截至2013年2月7日,这篇文章链接似乎已经失效。有人知道这篇文章是否还存在于其他地方吗? - armstrhb

1
我在这个问题上花了一些时间 - 我试图在打开文件之前验证它是否存在。
最终,我想出了一个使用XML和SOAP的解决方案 - 使用枚举文件夹方法并拉入包含文件夹内容的XML响应。
我在这里写了一篇博客。

链接已失效!!! - blablubbb
1
@blablubb 好的,这里是一些更新后的链接。请注意,一旦我重新构建我的网站,这些链接可能会发生变化。它在一段时间前经历了一个大丑陋的崩溃,而我一直是个非常懒惰的人。 http://stevenbritton.net/excel-vba-soap-xml-and-sharepoint-verify-a-file-exists/请注意,原始实现在SharePoint更新后停止工作,并且默默地失败了...http://stevenbritton.net/excel-and-sharepoint-revisited/ - Steven C. Britton

1

这是我用过的一段代码:

注意...要获取URL部分中的@SSL,您需要将Microsoft Edge/Chrome中SharePoint文件夹的URL复制到Windows文件资源管理器中...然后右键单击当前文件夹 -> 属性,这应该会显示您应该使用的具有@SSL的路径。那是最困难的部分!

enter image description here

Sub GetAllFileNamesInSharePointFolder()

FileName = Dir("\\mycompany.sharepoint.com@SSL\DavWWWRoot\teams\NCICDS\Testing folder for Me\Elise\Deal Docs\2022\Metro Egypt\Confectionery\*.*")

Do While FileName <> ""
    Debug.Print FileName
    FileName = Dir()
Loop
End Sub

在这篇文章的所有答案中,这个答案实际上适用于现代SharePoint站点,并且设置简单。我不必担心映射网络驱动器或创建另一个代理进程来刷新过期的连接。我也不必启用某些特殊的VBA参考库。截至2022年4月已验证可行。 - user2465349
@user2465349 谢谢!很高兴这有所帮助。然而,微软建议将文件同步到您的计算机作为更稳定和可靠的解决方案。一旦完成,您就可以像扫描硬盘上的任何其他目录一样扫描它。请查看此链接:https://support.microsoft.com/zh-cn/office/%E5%90%8C%E6%AD%A5-sharepoint-%E6%96%87%E4%BB%B6%E5%92%8C%E6%96%87%E4%BB%B6%E5%A4%B9-87a96948-4dd7-43e4-aca1-53f3e18bea9b - Chadee Fouad

1

将驱动器映射到SharePoint(也支持https)

通过将其作为文件系统对象迭代,我成功地获取了SharePoint内容;关键在于如何设置映射: 从SharePoint打开资源管理器 然后复制路径(带有http*的行)(见下图)

address in explorer

在资源管理器或命令中使用此路径映射驱动器(例如:net use N: https:://thepathyoujustcopied)。 注意:https 可以在 Windows7/8 上正常工作,但不适用于 XP。

这可能对您有用,但我更喜欢另一种方法,因为每台计算机的驱动器字母都不同。这里的诀窍是从 SharePoint 开始(而不是从访问 SharePoint 作为 Web 服务器的 VBA 脚本开始)。

设置与 Excel 表格的数据连接

  • 在 SharePoint 中,浏览到要监视的视图
  • 将视图导出到 Excel(在 2010 年版本中:库工具;库 | 导出到 Excel) export to excel
  • 查看此 Excel 时,您会发现已设置数据源(选项卡:数据、连接、属性、定义)

connection tab

您可以在VBA中包含此查询,或在电子表格中维护数据库链接,并通过VBA迭代表格。请注意:上面的图像未显示实际的数据库连接(命令文本),该文本将告诉您如何访问我的SharePoint。


上面提到的链接似乎在2013年9月10日后已经失效。有没有可能有更新版本? - Shrout1
链接的文档不是我自己的。我已经在文章中添加了缺失的信息。 - Adriaan

1
将WebDAV文件夹映射到计算机是我首选的方法,以便轻松访问SharePoint并保持长期连接。但即使正确映射,当选择文件时(特别是通过),由于Windows 10 1803的更改,文件将返回URL。
为了避免这种情况,您可以使用(或等效工具)映射驱动器,然后将结果与URL转换函数相结合,以获得UNC转换器功能。
Public Function SharePointURLtoUNC( _
  sURL As String) _
As String
  Dim bIsSSL As Boolean

  bIsSSL = InStr(1, sURL, "https:") > 0
  sURL = Replace(Replace(sURL, "/", "\"), "%20", " ")
  sURL = Replace(Replace(sURL, "https:", vbNullString), "http:", vbNullString)
  
  sURL= Replace(sURL, Split(sURL, "\")(2), Split(sURL, "\")(2) & "@SSL\DavWWWRoot")
  If Not bIsSSL Then sURL = Replace(sURL, "@SSL\", vbNullString) 
  SharePointURLtoUNC = sURL
End Function

谢谢,但是这个答案不完整。它没有列出SharePoint文件夹中的所有文件? - Chadee Fouad

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接