vba访问文件服务器,使用Excel VBA获取共享点文件夹的内容

通常,我使用这段代码来检索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)

通过映射驱动器将共享点内容迭代为文件系统对象,对我来说很有效。技巧是如何设置映射:

vba访问文件服务器,使用Excel VBA获取共享点文件夹的内容_第1张图片

然后复制路径(以http *开头)(请参见下文)

6dfe26ddaa38dc45cf0627a34c134ab1.png

使用资源管理器或命令在地图驱动器中使用此路径(即net use N: https:://thepathyoujustcopied)

注意:https在Windows7 / 8上可以正常运行,而在XP上则不能。

这可能对您有用,但由于每台PC的驱动器号不同,因此我更喜欢采用不同的方法。这里的技巧是从共享点开始(而不是从作为Web服务器访问共享点的VBA脚本开始)。

建立与Excel工作表的数据连接

在共享点中,浏览到要监视的视图

将视图导出到excel(2010年:库工具; libarry |导出到Excel)

a39946a2808d3634250757d2bc1235e3.png

查看此excel时,您会发现一个数据源设置(选项卡:数据,连接,属性,定义)

vba访问文件服务器,使用Excel VBA获取共享点文件夹的内容_第2张图片

您可以在vba中包含此查询,也可以在表中维护数据库链接,以通过VBA在表上进行迭代。请注意:上图没有显示实际的数据库连接(命令文本),它将告诉您如何访问我的共享点。

截至2013年9月10日,以上引用的链接似乎已失效。有机会有更新版本吗?

链接的文件不是我的。我已经在文章中添加了缺少的信息。

尝试将共享点库映射到Windows中的驱动器号。然后在代码中选择驱动器和路径。

你可能感兴趣的:(vba访问文件服务器)