Запись в XML в SharePoint из VBA

Я написал сценарий VBA, который вставляет данные из книги Excel в XML-файл. XML-файл для редактирования выбирается из средства выбора файлов:

Public strFile As String
    
Sub SetPath()

' Declare filedialog picker
Set fd = Application.FileDialog(msoFileDialogFilePicker)

' Define attributes for the filepicker to only allow a single xml file
With fd
    .Filters.Clear
    .Filters.Add "XML files", "*.xml", 1
    .Title = "Choose file"
    .AllowMultiSelect = False
    .InitialFileName = ActiveWorkbook.Path & "\"
    
    ' If a file is chosen save the path and name
    If .Show = True Then
    
        strFile = .SelectedItems(1)
    
    Else
        
        'MsgBox "Error"
    
    End If

End With

End Sub

После чего открываю, редактирую и сохраняю файл:

Sub WriteXML()
   
Call SetPath

' Open the xml-file
Dim xmlFile As String
xmlFile = strFile
     
Set xmlWriter = CreateObject("Microsoft.XMLDOM")
xmlWriter.async = False
xmlWriter.Load xmlFile
    
' long codeblock for editing the file
    
xmlWriter.Save xmlFile
Set xmlWriter = Nothing
    
End Sub

Код отлично работает на моем личном компьютере, однако, запустив его на корпоративном компьютере, я получаю сообщение об ошибке: «имя файла, имя каталога или синтаксис метки тома неверен»

Я подозреваю, что это связано с тем, что компьютер моей компании использует SharePoint, таким образом создавая путь сохранения:

«https://company-my.sharepoint.com/personal/mat_company_com/Documents/Desktop/myTemplates/Templates/file.xml»

В отличие от: 'C:\Users\Mat\Documents\file.xml'

Есть ли способ это исправить?

Имя файла слишком длинное.

jdweng 27.03.2024 13:08

@jdweng — URL-адрес состоит всего из 104 символов без слова «файл» — поэтому имя файла должно иметь длину 296 символов, чтобы весь URL-адрес был слишком длинным. Это не проблема

CHill60 27.03.2024 14:37

Это строка xmlWriter.Save xmlFile, которая выдает ошибку? Или .Show или .SelectedItems(1)?

CHill60 27.03.2024 14:41

Попробуйте более короткий путь к файлу. Обнаружена проблема с длиной более 64. Или воспользуйтесь проводником и посмотрите, сможете ли вы создать файл в папке. У вас может не быть разрешения. Sharepoint не является файловой системой. Он использует другой протокол. Посмотрите с помощью проводника, вы можете перейти к папке.

jdweng 27.03.2024 14:42

Да, именно строка xmlWriter.Save xmlFile выдает ошибку. К сожалению, компьютер моей компании по умолчанию использует путь к файлу Sharepoint, если я запускаю подпрограмму SetPath(). Я попытался отформатировать путь так, чтобы он напоминал путь к моему личному компьютеру, но это привело к ошибке, сообщающей, что не удалось найти указанный файл.

Mathias 27.03.2024 15:06

Местоположение HTTP и местоположение файловой системы — это совершенно разные вещи, и то, что работает для локальных/сетевых расположений, обычно не работает, когда вы работаете с местоположением HTTP. Если вы можете синхронизировать интересующую папку, вы можете работать со своей локальной копией, и любые изменения будут синхронизированы с SharePoint.

Tim Williams 27.03.2024 17:06

Как я могу сделать это из VBA? Файл Excel, а также файл xml находятся, и мой компьютер автоматически синхронизируется с SharePoint.

Mathias 27.03.2024 20:32

Если исходное местоположение SharePoint синхронизировано с вашим локальным компьютером, содержимое будет находиться на вашем локальном диске где-то вроде: C:\Users\Mathias\YourSharePointHost\SyncedFoldeRnameHere

Tim Williams 27.03.2024 20:58

... если ActiveWorkbook был открыт из SharePoint, то у него будет путь HTTP — есть способы преобразовать его в соответствующий локальный путь, если источник был синхронизирован. Например, см.: stackoverflow.com/a/67697487/478884

Tim Williams 27.03.2024 21:04
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
9
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что вам не нужна поддержка Mac, ниже показано, как преобразовать путь HTTP в локальный путь, при условии, что источник SharePoint синхронизирован с вашим локальным диском:

Sub Tester()

    Dim p As String
    
    p = ActiveWorkbook.Path
    
    If UCase(p) Like "HTTP*" Then p = GetLocalPath(p)
    
    Debug.Print "Local Path is:", vbLf, p

End Sub

'See: https://stackoverflow.com/a/67697487/478884
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
    
    Debug.Print "Checking for:" & vbLf & Path
    Debug.Print "--------------------"
    
    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
        Debug.Print urlNamespace
        
        If InStr(1, Path, urlNamespace, vbTextCompare) > 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

Другие вопросы по теме