编辑:
此答案已过时,本文结论不完整,请查看这个解决方案!
我现在已经查看了一堆网络上的解决方案,包括各种StackOverflow线程,但它们都不能适用于所有不同类型的OneDrive文件夹/帐户。
以下是我对本主题中各种解决方案的测试的简要总结:
@RMK 的解决方案仅适用于 个人 OneDrive 文件夹
@beerockxs 的解决方案也仅适用于 个人 OneDrive 文件夹
@Danny 的解决方案仅在非常罕见的情况下起作用,而对我来说从未起作用过
@Henrik Bøgelund 的解决方案没有起作用
@Erik van der Neut 的解决方案在大多数情况下都有效,但在私有 OneDrive 的情况下,它会将一个额外的"\"
引入到路径中。虽然这很容易修复,但如果在线文件结构中的同步文件夹不处于文件层次结构的基础位置,则无法工作。在这种情况下,WebPath 中存在额外的路径部分,这些部分被带入本地路径中使其无效。
以下函数在大多数情况下都有效,如需通用解决方案,请查看此答案。
Public Function GetLocalPath(ByVal Path As String) As String
Const HKCU = &H80000001
Dim objReg As Object, rPath As String, subKeys(), subKey
Dim urlNamespace As String, mountPoint As String, secPart As String
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\." & _
"\root\default:StdRegProv")
rPath = "Software\SyncEngines\Providers\OneDrive\"
objReg.EnumKey HKCU, rPath, subKeys
For Each subKey In subKeys
objReg.GetStringValue HKCU, rPath & subKey, "UrlNamespace", urlNamespace
If InStr(Path, urlNamespace) > 0 Then
objReg.GetStringValue HKCU, rPath & subKey, "MountPoint", mountPoint
secPart = Replace(Mid(Path, Len(urlNamespace)), "/", "\")
Path = mountPoint & secPart
Do Until Dir(Path, vbDirectory) <> "" Or InStr(2, secPart, "\") = 0
secPart = Mid(secPart, InStr(2, secPart, "\"))
Path = mountPoint & secPart
Loop
Exit For
End If
Next
GetLocalPath = Path
End Function
ThisWorkbook.FullName
返回它所返回的内容。 - Mathieu GuindonCurDir
返回什么? - Mathieu Guindon