In a previous post I discussed how to set meta-data in Sharepoint 2007 directly from VBA. I mentioned that the Microsoft documentation for the Sharepoint web services does not appear to be correct, insofar as you cannot address a Sharepoint "list" in the web service using its name, but rather you are forced to use the GUID.
I have now had to write a function to retrieve the GUID for the list from teh Sharepoint site. This proved to be much harder in practice than I had expected it to be, partly at least because of the problems in working in the VBA IDE with its poor debugging functionality, partly because VBA is a much more limited language than .Net and I have got used to using all the nice constructs such as generics that make life so much easier, and partly because I still find MSXML very "brain" hard to work with. I don't know why I find it so hard, it just always seems that everything ends up being far more complicated than I think it should be. I find the .Net XML model much easier to deal with.
Anyway, after playing about with XSLT and XPATH in order to extract the ID and VersionNumber attributes from the wsm_GetListCollection web service (and failing miserable), I finally decided to just iterate through the nodes and attributes till I found what I wanted. The code below is a simple function that you can call with three parameters: the name of the list that you need the GUID for (sListName), a string variable in which the GUID will be placed (sListID), and an integer that the list version number will be placed (iListVersion).
Note: You may also be interested in this post: VBA code to check in a document to Sharepoint and set meta data.
Function GetListCollection(ByVal sListName As String, ByRef sListID As String, ByRef iListVersion As Integer) ' Class created by toolkit to connect to the Web service Dim ws As New clsws_Lists ' The collection is returned as an XML node list Dim ListCollectionNodeList As MSXML2.IXMLDOMNodeList 'Root node of the returned list Dim nod As MSXML2.IXMLDOMNode ' Output string for the XML transformation Dim strOutput As String On Error GoTo GetListCollection_OnError ' Retrieve the collection of lists Set ListCollectionNodeList = ws.wsm_GetListCollection ' Get the root node from the list Set nod = ListCollectionNodeList.Item(0) ' Iterate nodelist to find details for our named list Dim bGotNode bGotNode = False Dim procNode As MSXML2.IXMLDOMNode Dim TitleNodeList As MSXML2.IXMLDOMNodeList Dim IDNodeList As MSXML2.IXMLDOMNodeList Set TitleNodeList = nod.SelectSingleNode("//Title") Set IDNodeList = nod.SelectSingleNode("//ID") Dim ListNode As MSXML2.IXMLDOMNode Dim ListChildNodes As MSXML2.IXMLDOMNode Dim oAttr As MSXML2.IXMLDOMAttribute Dim retID As String Dim listVersion As Integer Dim ListName As String ' Iterate through list nodes returned (should only be one) For Each ListNode In ListCollectionNodeList 'Iterate through the child nodes (each one represents a single Sharepoint list) For Each ListChildNodes In ListNode.ChildNodes 'See if we have any attributes (we should have!) If ListChildNodes.Attributes.Length > 0 Then ' For each list, reset our variables retID = "" listVersion = 0 ' Iterate through the attributes For Each oAttr In ListChildNodes.Attributes Debug.Print "Name= " & oAttr.Name Debug.Print "Value= " & oAttr.nodeTypedValue 'Look for the ID attribute If oAttr.Name = "ID" Then ' FOund it, so remember it in case this is our list retID = oAttr.nodeTypedValue End If ' Look for the "Title" attribute If oAttr.Name = "Title" Then If oAttr.nodeTypedValue = sListName Then ' Found our list, so remember it ListName = oAttr.nodeTypedValue bGotNode = True End If End If ' Look for the "Version" attribute If oAttr.Name = "Version" Then ' Found our list, so remember it listVersion = oAttr.nodeTypedValue End If ' Once we have found a title, ID and version, break If retID <> "" And listVersion <> 0 And bGotNode = True Then Exit For End If Next oAttr End If ' Once we have found the data, break out of iteration If bGotNode = True Then Exit For End If Next Next If bGotNode = False Then Err.Raise 65000, "", "ERROR: Cannot find list named <" & sListName & "> in Sharepoint site.", "", "" End If sListName = ListName sListID = retID iListVersion = listVersion Exit Function GetListCollection_OnError: MsgBox ("ERROR: Retrieving list collection from Sharepoint." + vbCrLf + _ Err.Number + " - " + Err.Description) End Function
Remember, you will have to have installed the Microsoft Web Services Toolkit before this will work, and add a web reference to your Sharepoint site to your VBA project. This has been tested with Office 2003 linking to Sharepoint 2007 and works :).
I do not know what are those things: (sListName),(sListID), (iListVersion) to call the function, please help me. I ´m very interested in your post...
ReplyDeleteThis function is used to get reference values for your list from Sharepoint.
ReplyDeletesListName: the name of the list that you are interested in (you supply this)
sListID: the GUID of the list in sListName will be put in here (it tells you this)
iListVersion: an integer that the list version number will be placed (it tells you this)
The sListId and iListVersion can then be used with the other list methods.
any ideas on how to do this in Excel 2010?
ReplyDelete