Я написал сценарий 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 — URL-адрес состоит всего из 104 символов без слова «файл» — поэтому имя файла должно иметь длину 296 символов, чтобы весь URL-адрес был слишком длинным. Это не проблема
Это строка xmlWriter.Save xmlFile, которая выдает ошибку? Или .Show или .SelectedItems(1)?
Попробуйте более короткий путь к файлу. Обнаружена проблема с длиной более 64. Или воспользуйтесь проводником и посмотрите, сможете ли вы создать файл в папке. У вас может не быть разрешения. Sharepoint не является файловой системой. Он использует другой протокол. Посмотрите с помощью проводника, вы можете перейти к папке.
Да, именно строка xmlWriter.Save xmlFile выдает ошибку. К сожалению, компьютер моей компании по умолчанию использует путь к файлу Sharepoint, если я запускаю подпрограмму SetPath(). Я попытался отформатировать путь так, чтобы он напоминал путь к моему личному компьютеру, но это привело к ошибке, сообщающей, что не удалось найти указанный файл.
Местоположение HTTP и местоположение файловой системы — это совершенно разные вещи, и то, что работает для локальных/сетевых расположений, обычно не работает, когда вы работаете с местоположением HTTP. Если вы можете синхронизировать интересующую папку, вы можете работать со своей локальной копией, и любые изменения будут синхронизированы с SharePoint.
Как я могу сделать это из VBA? Файл Excel, а также файл xml находятся, и мой компьютер автоматически синхронизируется с SharePoint.
Если исходное местоположение SharePoint синхронизировано с вашим локальным компьютером, содержимое будет находиться на вашем локальном диске где-то вроде: C:\Users\Mathias\YourSharePointHost\SyncedFoldeRnameHere
... если ActiveWorkbook был открыт из SharePoint, то у него будет путь HTTP — есть способы преобразовать его в соответствующий локальный путь, если источник был синхронизирован. Например, см.: stackoverflow.com/a/67697487/478884


Предполагая, что вам не нужна поддержка 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
Имя файла слишком длинное.