我尝试使用以下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,我希望解决方案是“便携式”的。只要所有相关文件都在同一个文件夹中,就可以在驱动器上的任何位置工作。
答案 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