2017-09-15 4 views
0

Je suis en train de construire une fonction VBA qui mettra à jour une valeur dans une liste de Sharepoint:Comment gérer l'erreur "Opération annulée" lors de l'envoi de la mise à jour de la liste via Sharepoint REST?

Sub testUpdate()  
    Dim XmlHttp As MSXML2.XMLHTTP60 
    Dim result As String 
    Dim url As String 
    Dim body As String 
    Dim RequestDigest As String 

    Set XmlHttp = New MSXML2.XMLHTTP60 

    url = "https://sps.utility.xyz.com/sites/xyz/_api/web/lists/GetByTitle('REST Test List')/items(1)" 

    RequestDigest = GetDigest("https://sps.utility.xyz.com/sites/xyz") 

    body = "{ '__metadata': { 'type': 'SP.Data.REST_x0020_Test_x0020_ListListItem' }, 'Title': 'updating item with new title'}" 
    XmlHttp.Open "POST", url, False 
    XmlHttp.setRequestHeader "IF-MATCH", "*" 
    XmlHttp.setRequestHeader "accept", "application/json;odata=verbose" 
    XmlHttp.setRequestHeader "content-type", "application/json;odata=verbose" 
    XmlHttp.setRequestHeader "X-Http-Method", "MERGE" 
    XmlHttp.setRequestHeader "X-RequestDigest", RequestDigest 
    XmlHttp.setRequestHeader "Content-Length", Len(body) 

    XmlHttp.Send body 

    result = XmlHttp.responseText 
End Sub  

Function GetDigest(url As String) 
    Dim oHttp As New MSXML2.XMLHTTP60 
    Dim s As String 
    Dim l1 As Long 
    Dim l2 As Long 

    With oHttp 
     .Open "POST", url + "/_api/contextinfo", False 
     .setRequestHeader "content-type", "application/json;odata=verbose" 
     .Send "" 
    End With 

    s = oHttp.responseText 
    l1 = InStr(1, s, "FormDigestValue") 
    If l1 > 10 Then 
     l1 = l1 + 16 
     l2 = InStr(l1, s, "</d:FormDigestValue") 
    End If 

    If l2 > 10 Then GetDigest = Mid$(s, l1, l2 - l1) 
     Set oHttp = Nothing  
End Function 

Mais quand testUpdate arrive à la ligne:

XmlHttp.Send body 

il jette cette erreur:

Run-time error '-2147467260 (80004004)': 

Operation aborted 

Malgré l'erreur, la mise à jour réussit - la valeur du titre de l'élément de liste change.

Est-il prudent pour moi de gérer simplement cette exception et de contourner l'erreur, ou est-ce qu'il indique qu'il y a un vrai problème que j'ai besoin de résoudre?

+0

je viens de lire ce post .... https://stackoverflow.com/questions/46247627/excel-vba-send-to-msxml2- xmlhttp-does-not-work ... peut-être essayer d'utiliser 'MSXML2.ServerXMLHTTP60' – jsotola

+0

@jsotola, j'ai essayé d'utiliser' ServerXMLHTTP60' à la place, mais j'ai reçu une erreur '401 Unauthorized' et la mise à jour n'a pas été transmise . – sigil

+0

semble que le serveur peut nécessiter des informations d'identification de connexion – jsotola

Répondre

0

L'appel API nécessite une authentification. J'ai réussi à utiliser WinHTTP pour authentifier la demande en fonction de l'utilisateur actuel, je suppose qu'ils ont accès dans le ci-dessous. Je reçois une réponse 204 et mon article de liste se met à jour correctement. (l'itération est parce que je testais la performance et que je pouvais la supprimer).

Outils> Références> Microsoft winhttp services Version 5,1

Private Sub UpdateItem2(ID, strFormDigest As String, iteration) 
    Dim sUrl As String 
    sUrl ="https://123.Sharepoint.net/sites/123/_api/web/lists/getbytitle('MyDemoList')/items(" & ID & ")" 
    Dim oRequest As WinHttp.WinHttpRequest 
    Dim sResult As String 
    sEnv = "{ '__metadata': { 'type': 'SP.Data.MyDemoListListItem' }, 'Title': 'TEST" & iteration & "' }" 
    Set oRequest = New WinHttp.WinHttpRequest 
    With oRequest 
     .Open "POST", sUrl, True 
     .setRequestHeader "IF-MATCH", "*" 
     .setRequestHeader "X-HTTP-Method", "MERGE" 
     .setRequestHeader "accept", "application/json;odata=verbose" 
     .setRequestHeader "X-RequestDigest", strFormDigest 
     .setRequestHeader "content-type", "application/json;odata=verbose" 
     .SetAutoLogonPolicy AutoLogonPolicy_Always 
     .send sEnv 
     .waitForResponse 
End With 
End Sub