Excel 将文件上载到SharePoint,不使用UNC或驱动器映射

Excel 将文件上载到SharePoint,不使用UNC或驱动器映射,excel,vba,sharepoint,upload,Excel,Vba,Sharepoint,Upload,我正在尝试使用Excel中的VBA将文件上载到SharePoint 我找到了一些urlmon代码,解决了文件下载问题 我看到过使用UNC、winhttp POST和SEND以及SP SDK编写脚本的代码,但由于站点和软件安装的限制,我无法使后者正常工作 我需要直接上传,例如发送到“http://example.com/foldername". 我尝试将Scripting.FileSystemObject与URL一起使用 我大胆地假设,除了UNC和winhttp POST/SEND之外,还有一种V

我正在尝试使用Excel中的VBA将文件上载到SharePoint

我找到了一些urlmon代码,解决了文件下载问题

我看到过使用UNC、winhttp POST和SEND以及SP SDK编写脚本的代码,但由于站点和软件安装的限制,我无法使后者正常工作

我需要直接上传,例如发送到“http://example.com/foldername". 我尝试将Scripting.FileSystemObject与URL一起使用

我大胆地假设,除了UNC和winhttp POST/SEND之外,还有一种VBA方法用于将文件上载到SharePoint

我尝试过的代码,是从其他人关于堆栈溢出的工作中复制的

Public Function UploadEICRs(ByVal file As String, uploadFolder As String)

Dim SharepointAddress As String
Dim LocalAddress As String
Dim objNet As Object
Dim FS As Object

' Where you will enter Sharepoint location path
SharepointAddress = "https://example.com/test_folder/"
' Where you will enter the file path, ex: Excel file
LocalAddress = file
SPFolder = SharepointAddress & uploadFolder & "/"

Debug.Print SPFolder

Set objNet = CreateObject("WScript.Network")
Set FS = CreateObject("Scripting.FileSystemObject")

If FS.FileExists(LocalAddress) Then
    FS.CopyFile LocalAddress, SPFolder
End If

Set objNet = Nothing
Set FS = Nothing

End Function


Sub uploadFiles()

    Dim FileSystem As Object
    Dim HostFolder As String

    HostFolder = GetFolder

    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    DoFolder FileSystem.GetFolder(HostFolder)
End Sub

Sub DoFolder(folder)
    Dim SubFolder
    Dim LString As String
    Dim LArray() As String
    Dim CertFolder As String
    Dim ufile As String
    Dim pFolder As String
    
    LString = folder
    LArray = Split(LString, "\")
    
    For Each SubFolder In folder.SubFolders
        DoFolder SubFolder
    Next
    Dim file
    For Each file In folder.Files
        CertFolder = LArray(3)
        pFolder = LArray(0) & "\" & LArray(1) & "\" & LArray(2)
        Debug.Print CertFolder
        Debug.Print file
        Debug.Print pFolder
        ufile = file
        sendfile2 ufile, CertFolder, pFolder
    Next
End Sub

Public Sub sendfile2(ByVal file As String, sUrl As String, fPath As String)

On Error GoTo err_Copy

Dim xmlhttp As MSXML2.XMLHTTP60
Dim sharepointUrl
Dim sharepointFileName
Dim tsIn
Dim sBody
Dim LlFileLength As Long
Dim Lvarbin() As Byte
Dim LobjXML As Object
Dim LstrFileName As String
Dim LvarBinData As Variant
Dim PstrFullfileName As String
Dim PstrTargetURL As String
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim fldr
Dim f
Dim pw As String
Dim UserName As String
Dim RetVal
Dim I As Integer
Dim totFiles As Integer
Dim Start As Date, Finish As Date

Debug.Print file
Debug.Print sUrl

sharepointUrl = "https://example.com/folder/folder"

Set LobjXML = CreateObject("Microsoft.XMLHTTP")

mypath = sharepointUrl & "/" & sUrl
Debug.Print mypath

LobjXML.Open "HEAD", mypath, False 'Check for Directory
LobjXML.Send
If LobjXML.StatusText = "NOT FOUND" Then
    'Create directory if not there
    LobjXML.Open "MKCOL", mypath, False
    LobjXML.Send
End If

Set fldr = fso.GetFolder(fPath & "\" & sUrl)
Debug.Print fldr

totFiles = fldr.Files.Count
For Each f In fldr.Files

  sharepointFileName = sharepointUrl & "/" & sUrl & "/" & f.Name
  Debug.Print sharepointFileName

    PstrFullfileName = fPath & "\" & sUrl & "\" & f.Name
    LlFileLength = FileLen(PstrFullfileName) - 1
    Debug.Print PstrFullfileName
    ' Read the file into a byte array.
    If LlFileLength <> 0 Then
      ReDim Lvarbin(LlFileLength)
      Open PstrFullfileName For Binary As #1
      Get #1, , Lvarbin
      Close #1
    End If
    ' Convert to variant to PUT.
    LvarBinData = Lvarbin
    PstrTargetURL = sharepointUrl & "/" & sUrl & "/" & f.Name

    ' Put the data to the server, false means synchronous.
    LobjXML.Open "PUT", PstrTargetURL, False
   ' Send the file in.
    LobjXML.Send LvarBinData

  'End If

  I = I + 1
  'RetVal = SysCmd(acSysCmdSetStatus, "File " & I & " of " & totFiles & " copied...")

Next f

  'RetVal = SysCmd(acSysCmdClearStatus)
  Set LobjXML = Nothing
  Set fso = Nothing


err_Copy:
If Err <> 0 Then
  MsgBox Err & " " & Err.Description
End If

End Sub

Function GetFolder() As String
    Dim fldr As FileDialog
    Dim sItem As String
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Select a Folder"
        .AllowMultiSelect = False
        .InitialFileName = Application.DefaultFilePath
        If .Show <> -1 Then GoTo NextCode
          sItem = .SelectedItems(1)
    End With
NextCode:
    GetFolder = sItem
    Set fldr = Nothing
End Function
Public函数UploadEICRs(ByVal文件作为字符串,uploadFolder作为字符串)
Dim SharepointAddress作为字符串
将本地地址设置为字符串
作为对象的模糊对象
作为对象的Dim FS
'您将在其中输入Sharepoint位置路径
SharepointAddress=”https://example.com/test_folder/"
'您将在其中输入文件路径,例如:Excel文件
LocalAddress=文件
SPFolder=SharepointAddress&uploadFolder&“/”
调试。打印SPF文件夹
Set objNet=CreateObject(“WScript.Network”)
设置FS=CreateObject(“Scripting.FileSystemObject”)
如果存在FS.files(LocalAddress),则
FS.CopyFile本地地址,SPFolder
如果结束
Set objNet=Nothing
设置FS=Nothing
端函数
子上载文件()
将文件系统作为对象
将HostFolder设置为字符串
HostFolder=GetFolder
设置FileSystem=CreateObject(“Scripting.FileSystemObject”)
DoFolder FileSystem.GetFolder(主机文件夹)
端接头
子文件夹(文件夹)
暗文件夹
像弦一样变暗
Dim LArray()作为字符串
将文件夹设置为字符串
将文件变暗为字符串
像线一样变暗
LString=文件夹
LArray=拆分(L字符串“\”)
对于folder.SubFolders中的每个子文件夹
DoFolder子文件夹
下一个
暗文件
对于文件夹.Files中的每个文件
CertFolder=LArray(3)
pFolder=LArray(0)和“\”&LArray(1)和“\”&LArray(2)
调试。打印证书文件夹
调试.打印文件
调试。打印pFolder
ufile=文件
sendfile2 ufile、CertFolder、pFolder
下一个
端接头
Public Sub sendfile2(ByVal文件作为字符串,sUrl作为字符串,fPath作为字符串)
错误时转到错误复制
Dim xmlhttp作为MSXML2.XMLHTTP60
Dim sharepointUrl
Dim sharepointFileName
丁青
暗色体
Dim LlFileLength尽可能长
Dim Lvarbin()作为字节
Dim LobjXML作为对象
Dim LstrFileName作为字符串
Dim LvarBinData作为变体
Dim PstrFullfileName作为字符串
将PstrTargetURL设置为字符串
作为对象的Dim fso
设置fso=CreateObject(“Scripting.FileSystemObject”)
模糊fldr
暗f
作为字符串的Dim pw
将用户名设置为字符串
模糊复述
作为整数的Dim I
将文件设置为整数
Dim开始日期,结束日期
调试.打印文件
调试打印sUrl
sharepointUrl=”https://example.com/folder/folder"
设置LobjXML=CreateObject(“Microsoft.XMLHTTP”)
mypath=sharepointUrl&“/”和sUrl
调试。打印我的路径
打开“HEAD”,mypath,False,检查目录
发送
如果LobjXML.StatusText=“未找到”,则
'如果不存在,则创建目录
LobjXML.Open“MKCOL”,mypath,False
发送
如果结束
设置fldr=fso.GetFolder(fPath&“\”&sUrl)
调试。打印fldr
totFiles=fldr.Files.Count
对于fldr.文件中的每个f
sharepointFileName=sharepointUrl&“/”&sUrl&“/”&f.名称
调试.打印sharepointFileName
PstrFullfileName=fPath&“\”&sUrl&“\”&f.名称
LlFileLength=FileLen(PstrFullfileName)-1
调试。打印PstrFullfileName
'将文件读入字节数组。
如果LlFileLength为0,则
ReDim Lvarbin(LlFileLength)
打开二进制文件的PstrFullfileName作为#1
1号,艾尔宾
关闭#1
如果结束
'转换为变量以放置。
LvarBinData=Lvarbin
PstrTargetURL=sharepointUrl&“/”&sUrl&“/”&f.名称
'将数据放入服务器,false表示同步。
LobjXML.Open“PUT”,PstrTargetURL,False
'将文件发送进来。
发送LvarBinData
"完"
I=I+1
'RetVal=SysCmd(acSysCmdSetStatus,“文件”&I&“of”&totFiles&“复制…”)
下一个f
'RetVal=SysCmd(acSysCmdClearStatus)
设置LobjXML=Nothing
设置fso=无
错误副本:
如果错误为0,则
MsgBox错误和错误说明(&R)
如果结束
端接头
函数GetFolder()作为字符串
Dim fldr As FILE对话框
以字符串形式显示
设置fldr=Application.FileDialog(msoFileDialogFolderPicker)
与fldr
.Title=“选择一个文件夹”
.AllowMultiSelect=False
.InitialFileName=Application.DefaultFilePath
如果.Show-1,则转到下一个代码
sItem=.SelectedItems(1)
以
下一个代码:
GetFolder=sItem
设置fldr=无
端函数

您必须使用SharePoint API才能安全地登录文档库并将文件添加到文档库中。如果可以从VBA代码进行HTTP调用,则可以使用,也可以下载,然后从VBA中引用.dll。请注意,Microsoft的大多数示例都使用C#,但适用于VB。

非常感谢,我将查看REST API并了解它的作用。祝你好运。如果我能够创建一个可行的解决方案,我会将其发布在这里。以下是将文件上载到sharepoint的代码。我不能把它归功于它,因为几乎所有的代码都是从这个网站上其他人的优秀作品中获取的。