使用ADODB Connection打开存储在SharePoint上的Excel文件作为数据源

时间:2015-02-10 14:57:35

标签: excel sharepoint adodb

我尝试使用以下VBA代码段打开Excel文件作为数据源:

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
With cn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source=" & path & "\" & VFile & ";" & _
        "Extended Properties=""Excel 8.0; HDR=No; IMEX=1;"""
    .Open
End With

path变量属于C:\Folder类型时,这可以正常工作。但是,如果我想在与当前文件相同的文件夹中引用excel文件,请使用

path = ThisWorkbook.path

当前工作簿位于SharePoint上存储的文件夹中,path将包含表单中的某些内容

https://sp.foobar.com/folder

尝试使用此路径进行连接会导致Method 'Open' failed错误。将路径黑客攻入WebDAV路径会告诉我该文件已被锁定或我无权读取该文件。

有人可以帮忙吗?

当我手动将path设置为Drive:\Folder表单时,一切都很顺利,但如果文件存储在ThisWorkbook.path或类似内容,我无法自动生成此路径SharePoint,我希望解决方案是“便携式”的。只要所有相关文件都在同一个文件夹中,就可以在驱动器上的任何位置工作。

2 个答案:

答案 0 :(得分:5)

连接到sharepoint上的excel文件时,您必须更改路径中的一些详细信息。具体来说,在开头删除“http:”,用“/”代替“\”,并用“%20”代替任何空格。

以下VBA代码检查文件路径是否包含“http”,如果是,则执行上述替换并返回ADODB可以读取的字符串(ExcelWorkbook)。

If InStr(ThisWorkbook.FullName, "http:") = 0 Then ExcelWorkbook = ThisWorkbook.FullName Else ExcelWorkbook = Replace(Replace(Replace(ThisWorkbook.FullName, "/", "\"), " ", "%20"), "http:", "")

我不知道为什么它会在进行此更改时起作用,但肯定会这样做!

答案 1 :(得分:1)

这不再起作用,但我找到了解决此问题的方法。 Sharepoint 库到本地挂载点的分配存储在注册表中,以下函数会将 URL 转换为本地文件名:

Public Function GetLocalFile(wb As Workbook) As String
    Const HKEY_CURRENT_USER = &H80000001
    Dim temp As Object
    Dim rPath As String
    Dim arrSubKeys() As Variant
    Dim strAsk As Variant
    Dim strValue As String
    Dim strMountpoint As String

    Set temp = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

    rPath = "Software\SyncEngines\Providers\OneDrive\"
    temp.EnumKey HKEY_CURRENT_USER, rPath, arrSubKeys
    For Each strAsk In arrSubKeys
        temp.getStringValue HKEY_CURRENT_USER, rPath & strAsk, "UrlNamespace", strValue
        If InStr(wb.FullName, strValue) > 0 Then
            temp.getStringValue HKEY_CURRENT_USER, rPath & strAsk, "MountPoint", strMountpoint
            GetLocalFile = strMountpoint & "\" & Replace(Right(wb.FullName, Len(wb.FullName) - Len(strValue)), "/", "\")
            Exit Function
        End If
    Next
    GetLocalFile = wb.FullName
End Function