通常,我使用这段代码来检索VBA中文件夹的内容。 但这在共享点的情况下不起作用。 我能怎么做 ?
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资源管理器中输入地址,则可以访问共享点。 对共享点的访问需要进行身份验证,但是它是透明的,因为它依赖于Windows登录。
您可以使用Windows资源管理器导航到sharepoint文件夹吗?
是的! 它看起来像一个常规的网络文件夹。
我发现必须在拥有服务器权限的同时使用SharePoint上的文件的唯一方法是将WebDAV文件夹映射到驱动器号。这是实现的示例。
在VBA中添加对以下ActiveX库的引用:
Windows脚本宿主对象模型(wshom.ocx)-用于WshNetwork
Microsoft脚本运行时(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
映射网络驱动器可能很棘手;我发现如何映射共享点有助于解决此问题。
这段代码看起来很有希望,但是Sub test()为Dim dm as New DriveMapper行抛出了"未定义用户定义类型"的编译错误。也许我缺少DLL参考? Ive添加了Microsoft脚本运行时以及Windows脚本宿主对象模型。使用Excel 2010。
对不起这么晚@ shrout1做出的回应,也许您创建了一个模块而不是一个类?
感谢您的出色解决方法。通过直接连接,我必须先手动"访问"共享点站点,然后才能建立活动连接,但是映射驱动器似乎可以解决该问题。一个问题:如何避免在调用DriveMapper类的代码完成之前取消对驱动器的映射?我还不太熟悉他们的工作方式。
@Trm有人编辑了我的文章,以使用处理方法" Class_Terminate"将代码包装在一个类中,该方法取消了驱动器的映射。当类超出范围时,驱动器将被取消映射。您可以删除" Class_Terminate"方法...
@ChrisHayes是的,我想了很多。我删除了它,然后每次打开连接时都被一堆映射驱动器卡住了。我通过将映射的驱动器号保存到内存并在模块中sub的末尾取消映射来进行了一些解决。不知道它是否是最优雅的解决方案。
使用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。
此外:
myFilePath = replace(myFilePath,"/","")
myFilePath = replace(myFilePath,"http:","")
还要替换空间:
myFilePath = replace(myFilePath,"","%20")
我把这个问题弄乱了一下,找到了一个非常简单的两行解决方案,只需替换'http'和所有正斜杠,如下所示:
myFilePath = replace(myFilePath,"/","")
myFilePath = replace(myFilePath,"http:","")
它可能不适用于每个人,但它对我有用
如果您使用的是安全站点(或同时考虑到这两个站点),则可能需要添加以下行:
myFilePath = replace(myFilePath,"https:","")
实际上,以上内容对我来说似乎并不完整,应该阅读https :(除了以上代码)myFilePath = Replace(myFilePath, Split(myFilePath,"")(2), Split(myFilePath,"")(2) &"@SSL"),这最终会将https:my.SharePoint.com转换为\\my.SharePoint.com@SSL\(在所有替换之后)。
恕我直言,最酷的方法是通过WebDAV(没有网络文件夹,因为通常不允许这样做)。可以通过这篇优秀文章中介绍的ActiveX Data Objects实现(代码可以直接在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
截至2013年2月7日,本文链接似乎已失效。有谁知道本文是否还在其他地方?
@armstrhb:www.archive.org上有一个副本,但似乎只有文本可用,而没有图形。
我花了一些时间解决这个问题-在打开文件之前,我试图验证文件是否存在。
最终,我想出了一个使用XML和SOAP的解决方案-使用EnumerateFolder方法并提取包含文件夹内容的XML响应。
我在这里写了博客。
驱动器映射到共享点(也是https)
通过映射驱动器将共享点内容迭代为文件系统对象,对我来说很有效。技巧是如何设置映射:
然后复制路径(以http *开头)(请参见下文)
使用资源管理器或命令在地图驱动器中使用此路径(即net use N: https:://thepathyoujustcopied)
注意:https在Windows7 / 8上可以正常运行,而在XP上则不能。
这可能对您有用,但由于每台PC的驱动器号不同,因此我更喜欢采用不同的方法。这里的技巧是从共享点开始(而不是从作为Web服务器访问共享点的VBA脚本开始)。
建立与Excel工作表的数据连接
在共享点中,浏览到要监视的视图
将视图导出到excel(2010年:库工具; libarry |导出到Excel)
查看此excel时,您会发现一个数据源设置(选项卡:数据,连接,属性,定义)
您可以在vba中包含此查询,也可以在表中维护数据库链接,以通过VBA在表上进行迭代。请注意:上图没有显示实际的数据库连接(命令文本),它将告诉您如何访问我的共享点。
截至2013年9月10日,以上引用的链接似乎已失效。有机会有更新版本吗?
链接的文件不是我的。我已经在文章中添加了缺少的信息。
尝试将共享点库映射到Windows中的驱动器号。然后在代码中选择驱动器和路径。