У меня есть список SharePoint с двумя важными для меня столбцами; в Excel-ese я хочу сопоставить значение X в столбце 1 и вернуть соответствующее значение в столбце 2. Я могу использовать вариант кода в http://guruj.net/node/63 для получения информации (я думаю), поэтому я думаю, что моя проблема фокусируется на навигации по XML в VBA без загруженных DLL (у меня есть куча MSXML? .DLL, 2, 2.6, 3, 4, 5, 6).
В ближайших статьях MSDN я нахожу ссылку на .NET (я застрял в VBA / VB6? Который поставляется с Office 2003) или загружаемую DLL.
Ответ Ната ниже описывает большую часть того, что я нашел или мне нужен но, например, то, что я нашел, на неправильном языке, и часть моей проблемы заключается в поиске условий поиска. Я смешал некоторые переводы, например, XMLDocument кажется DOMDocument, но части XML - IXMLDOMNode или аналогичные.
Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, что я получаю несоответствие типа при вызове SOAP для выполнения запроса, или объект не поддерживает этот метод, когда я пытаюсь переделать игроков (listQuery, listViewFields, listQueryOptions). Я оставил различные части как варианты, а затем привел их как возвращаемый тип (поскольку у меня нет специальной библиотеки SP, на которую "ссылаются", я делаю это немного вслепую) и получил несоответствия.
Кажется, что было бы намного проще очистить экран для текста.





Ого, ты так далеко в кроличьей норе ...
Хорошо, код, на который вы смотрите, дает вам представление о списке SharePoint, что, возможно, не лучшее место для начала, но тот факт, что все это делается в VBA, делает это действительно сложным. У меня есть код .NET C# для запроса списка и получения элементов, имеющих определенное значение. Преобразование VBA сделать не могу.
public static string GetPageId(string listName, string webPath, string pageTitle)
{
string pageId = "";
IntranetLists.Lists lists = new IntranetLists.Lists();
lists.UseDefaultCredentials = true;
lists.Url = webPath + "/_vti_bin/lists.asmx";
XmlDocument doc = new XmlDocument();
doc.LoadXml("<Document><Query><Where><Contains><FieldRef Name=\"Title\" /><Value Type=\"Text\">" + pageTitle + "</Value></Contains></Where></Query><ViewFields /><QueryOptions /></Document>");
XmlNode listQuery = doc.SelectSingleNode("//Query");
XmlNode listViewFields = doc.SelectSingleNode("//ViewFields");
XmlNode listQueryOptions = doc.SelectSingleNode("//QueryOptions");
Guid g = GetWebID(webPath);
XmlNode items = lists.GetListItems(listName, string.Empty, listQuery, listViewFields, string.Empty, listQueryOptions, g.ToString());
foreach (XmlNode listItem in SPCollection.XpathQuery(items, "//sp:listitems/rs:data/z:row"))
{
XmlAttribute id = listItem.Attributes["ows_Id"];
if (id != null)
{
pageId = id.Value;
}
}
return pageId;
}
IntranetLists - это веб-ссылка .net на файл lists.asmx.
Вам нужно будет изучить, как использовать веб-службу lists.asmx из VBA, Затем вам нужно будет вызвать GetListItems с запросом, который представляет значение столбца, которое вы хотите найти.
<Where><Contains><FieldRef Name = "Title" /><Value Type = "Text">MyValue</Value></Contains></Where>
Синтаксис этого запроса - CAML
тогда вам нужно будет проанализировать возвращаемый xml, чтобы найти элемент и поле элемента с требуемым значением. Любой запрос xpath должен иметь добавленные правильные пространства имен, например
public static XmlNodeList XpathQuery(XmlNode xmlToQuery, string xPathQuery)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlToQuery.OuterXml);
XmlNamespaceManager mg = new XmlNamespaceManager(doc.NameTable);
mg.AddNamespace("sp", "http://schemas.microsoft.com/sharepoint/soap/");
mg.AddNamespace("z", "#RowsetSchema");
mg.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
mg.AddNamespace("y", "http://schemas.microsoft.com/sharepoint/soap/ois");
mg.AddNamespace("w", "http://schemas.microsoft.com/WebPart/v2");
mg.AddNamespace("d", "http://schemas.microsoft.com/sharepoint/soap/directory");
return doc.SelectNodes(xPathQuery, mg);
}
Однако я не уверен, что у вас даже будет доступ к чему-то, что будет анализировать xml в вашей настройке VBA, поэтому вам, возможно, придется загрузить дополнительный инструмент VBA для этого - может даже быть заблокирован для вас.
Надеюсь, это немного поможет.