VBA Document.Path возвращает веб-путь, когда в OneDrive — нужен локальный путь

Я пытаюсь получить локальный путь к открытому документу. Когда я использую функцию «Путь», я получаю веб-путь, если документ находится в моей папке OneDrive. Я думаю, проблема в том, что файл существует в двух местах: C:\Users\myloginname\OneDrive\Documents\Project\Samples И https://d.docs.live.net/xxxxxxxxxxxx/Documents/Project/Samples

Когда я пытаюсь использовать функцию Dir с веб-путем, я получаю сообщение об ошибке 52 Неверное имя или номер файла.

Как я могу получить локальный путь?


person mohnston    schedule 27.07.2021    source источник
comment
Связано: stackoverflow.com/questions/33734706/   -  person Tim Williams    schedule 27.07.2021
comment
Спасибо, Тим. Какая нить! На мой взгляд, это отсутствующее свойство объекта Document. Все предлагаемые решения являются уродливыми обходными путями. (но я обязательно воспользуюсь одним из них)   -  person mohnston    schedule 27.07.2021
comment
С точки зрения того, кто поддерживает множество макросов Excel для группы людей, медленно переносящих файлы в Sharepoint, это определенно головная боль...   -  person Tim Williams    schedule 27.07.2021


Ответы (2)


Приведенная ниже функция вернет локальное имя FullName, переданное ей в качестве аргумента.

Function LocalFullName(ByVal Ffn As String) As String
    ' 294

    ' this is part of the URL address before the file's code name
    ' e.g. https://d.docs.live.net/2abce27df5c02e2f/ ....
    Const DriveID   As String = ".live.net"
    
    Dim Fun()       As String           ' function return value
    Dim n           As Integer          ' index of Fun
    Dim Sp()        As String           ' split array of Ffn
    Dim i           As Integer          ' loop counter: index of Sp
    
    Sp = Split(Ffn, "/")
    For i = 1 To UBound(Sp)
        If InStr(1, Sp(i), DriveID, vbTextCompare) Then Exit For
    Next i
    
    If i > UBound(Sp) Then
        LocalFullName = Ffn
    Else
        ReDim Fun(1 To UBound(Sp))
        For i = i + 2 To UBound(Sp)
            n = n + 1
            Fun(n) = Sp(i)
        Next i
        ReDim Preserve Fun(1 To n)
        LocalFullName = Join(Fun, Application.PathSeparator)
    End If
End Function

Если вам нужно использовать имя для сохранения, необходимо добавить диск. Снипер ниже показывает, как вызвать функцию и добавить букву диска.

Sub Snippet()
    ' 294
    
    Const DriveID   As String = "D:\"
    Dim Wb          As Workbook
    
    Set Wb = ThisWorkbook
    Debug.Print DriveID & LocalFullName(Wb.FullName)
End Sub
person Variatus    schedule 29.07.2021

В итоге я использовал это, так как мне нужен был только путь к папке. Кроме того, при использовании жестко закодированного текста это своего рода выбор, но я беспокоюсь, что .live.net может измениться. Конечно, так может и \OneDrive\, так что вперед.

Private Function Local_Workbook_Path(ByRef doc As Document) As String

  Dim Ctr As Long
  Dim objShell As Object
  Dim UserProfilePath As String
  'Check if it looks like a OneDrive location
  If InStr(1, doc.path, "https://", vbTextCompare) > 0 Then

    'Replace forward slashes with back slashes
    Local_Workbook_Path = Replace(doc.path, "/", "\")

    'Get environment path using vbscript
    Set objShell = CreateObject("WScript.Shell")
    UserProfilePath = objShell.ExpandEnvironmentStrings("%UserProfile%")

      'Trim OneDrive designators
    For Ctr = 1 To 4
       Local_Workbook_Path = Mid(Local_Workbook_Path, InStr(Local_Workbook_Path, "\") + 1)
    Next

      'Construct the name
    Local_Workbook_Path = UserProfilePath & "\OneDrive\" & Local_Workbook_Path
    Local_Workbook_Path = Replace(Local_Workbook_Path, "%20", " ")
  Else

    Local_Workbook_Path = doc.path

  End If

End Function
person mohnston    schedule 29.07.2021