Programmatically Searching in OneNote 2010
Handy Programming Tips for Microsoft OneNote 2010: Learn how to search for user specified terms in a Microsoft OneNote 2010 notebook.
Last modified: July 29, 2011
Applies to: Excel 2010 | Office 2010 | OneNote 2010
Published: August 2011
Provided by: Frank Rice, Microsoft Corporation
Microsoft OneNote 2010 enables you to take and organize notes, include images and web pages, record audio, share your notes with others, and generally keep information from the many parts of your life organized within one simple application. In this topic, you use the GetHierarchy and FindPages methods to search for user specified terms in a notebook. The pages and sections containing the search term is then returned as XML. To complete this task, you must do the following:
To use the code in this topic, you need to run it from a Microsoft Office 2010 host program. These include Microsoft Excel 2010, Microsoft PowerPoint 2010, and Microsoft Word 2010. However, OneNote 2010 is not considered a host program. Excel is used in this topic.
To add references to the workbook
Start Excel 2010.
On the Developer tab, click Visual Basic. This opens the Visual Basic Editor.
If you do not see the Developer tab in Excel, click the File tab, and then click Options. In the categories pane, click Customize Ribbon, select Developer, and then click OK.
On the Tools menu, click References.
Scroll to Microsoft OneNote 14.0 Object Library, and then select it.
Next, scroll to Microsoft XML, 6.0, select it, and then click OK.
In this task, you add programming code to the Visual Basic Editor.
To add code to the Visual Basic Editor
In the Projects pane, click Module1.
Paste or type the following Microsoft Visual Basic for Applications (VBA) code into the module window.
Sub SearchTermsInTheFirstNoteBook() ' Connect to OneNote 2010 ' OneNote will be started if it's not running. Dim oneNote As OneNote14.Application Set oneNote = New OneNote14.Application ' Get all of the Notebook nodes. Dim nodes As MSXML2.IXMLDOMNodeList Set nodes = GetFirstOneNoteNotebookNodes(oneNote) If Not nodes Is Nothing Then ' Get the first notebook found. Dim node As MSXML2.IXMLDOMNode Set node = nodes(0) ' Get the ID. Dim notebookID As String notebookID = node.Attributes.getNamedItem("ID").Text ' Ask the user for a string for which to search ' with a default search string of "Microsoft". Dim searchString As String searchString = InputBox$("Enter a search string.", "Search", "Microsoft") Dim searchResultsAsXml As String ' The FindPages method search a OneNote object (in this example, the first ' open Notebook). You provide the search string and the results are ' provided as an XML document listing the objects where the search ' string is found. You can control whether OneNote searches non-indexed data (this ' example passes False). You can also choose whether OneNote enables ' the User Interface to show the found items (this example passes False). ' This example instructs OneNote to return the XML data in the 2010 schema format. oneNote.FindPages notebookID, searchString, searchResultsAsXml, False, False, xs2010 ' Output the returned XML to the Immediate Window. ' If no search items are found, the XML contains the ' XML hierarchy data for the searched item. Debug.Print searchResultsAsXml Else MsgBox "OneNote 2010 XML data failed to load." End If End Sub Private Function GetAttributeValueFromNode(node As MSXML2.IXMLDOMNode, attributeName As String) As String If node.Attributes.getNamedItem(attributeName) Is Nothing Then GetAttributeValueFromNode = "Not found." Else GetAttributeValueFromNode = node.Attributes.getNamedItem(attributeName).Text End If End Function Private Function GetFirstOneNoteNotebookNodes(oneNote As OneNote14.Application) As MSXML2.IXMLDOMNodeList ' Get the XML that represents the OneNote notebooks available. Dim notebookXml As String ' Fill notebookXml with an XML document providing information ' about available OneNote notebooks. ' To get all the data, provide an empty string ' for the bstrStartNodeID parameter. oneNote.GetHierarchy "", hsNotebooks, notebookXml, xs2010 ' Use the MSXML Library to parse the XML. Dim doc As MSXML2.DOMDocument Set doc = New MSXML2.DOMDocument If doc.LoadXML(notebookXml) Then Set GetFirstOneNoteNotebookNodes = doc.DocumentElement.SelectNodes("//one:Notebook") Else Set GetFirstOneNoteNotebookNodes = Nothing End If End Function
The SearchTermsInTheFirstNoteBook procedure displays a dialog box that prompts you for a search term. It then returns the notebook, pages, and section names where the term was located as XML.