Excel's fullname property with OneDrive

后端 未结 12 2027
别那么骄傲
别那么骄傲 2020-12-24 10:12

If I want to use the open Workbook object to get the fullname of an Excel file after saving it, but that file has been synchronized to OneDrive, I get a \"https\" address in

12条回答
  •  没有蜡笔的小新
    2020-12-24 10:46

    The different number of slashes "/" could be related with different versions of OneDrive (private/professional). Compare MatChrupczalski post on the msdn website: https://social.msdn.microsoft.com/Forums/en-US/1331519b-1dd1-4aa0-8f4f-0453e1647f57/how-to-get-physical-path-instead-of-url-onedrive?forum=officegeneral

    Therefore I adapted the function to the following:

    Sub TestMySolution()
      MsgBox ActiveWorkbook.FullName & vbCrLf & LocalFullName(ActiveWorkbook.FullName)
    End Sub
    
    ' 29.03.2020 Horoman
    ' main parts by Philip Swannell 14.01.2019    
    ' combined with parts from MatChrupczalski 19.05.2019
    ' using environment variables of OneDrive
    Private Function LocalFullName(ByVal fullPath As String) As String
      Dim i As Long, j As Long
      Dim oneDrivePath As String
      Dim endFilePath As String
      Dim iDocumentsPosition As Integer
    
      'Check if it looks like a OneDrive location
      If InStr(1, fullPath, "https://", vbTextCompare) > 0 Then
    
        'for commercial OneDrive file path seems to be like "https://companyName-my.sharepoint.com/personal/userName_domain_com/Documents" & file.FullName)
        If InStr(1, fullPath, "my.sharepoint.com") <> 0 Then
          'find "/Documents" in string and replace everything before the end with OneDrive local path
          iDocumentsPosition = InStr(1, fullPath, "/Documents") + Len("/Documents") 'find "/Documents" position in file URL
          endFilePath = Mid(fullPath, iDocumentsPosition)  'get the ending file path without pointer in OneDrive
        Else
          'for personal onedrive it looks like "https://d.docs.live.net/d7bbaa#######1/" & file.FullName, _
          '   by replacing "https.." with OneDrive local path obtained from registry we can get local file path
          'Remove the first four backslashes
          endFilePath = Mid(fullPath, 9) ' removes "https://" and with it two backslashes
          For i = 1 To 2
            endFilePath = Mid(endFilePath, InStr(endFilePath, "/") + 1)
          Next
        End If
    
        'Replace forward slashes with back slashes (URL type to Windows type)
        endFilePath = Replace(endFilePath, "/", Application.PathSeparator)
    
        'Loop to see if the tentative LocalWorkbookName is the name of a file that actually exists, if so return the name
        For j = 1 To 3
          oneDrivePath = Environ(Choose(j, "OneDrive", "OneDriveCommercial", "OneDriveConsumer"))
          If Len(oneDrivePath) > 0 Then
              LocalFullName = oneDrivePath & Application.PathSeparator & endFilePath
              If Dir(LocalFullName) <> "" Then
                Exit Function 'that is it - WE GOT IT
              End If
          End If
        Next j
        'Possibly raise an error here when attempt to convert to a local file name fails - e.g. for "shared with me" files
        LocalFullName = ""
      End If
    
      LocalFullName = fullPath
    End Function
    

    Have fun.

提交回复
热议问题