OneNote 2016 und Access

Vor ein paar Ausgaben haben wir uns den Zugriff auf das Notizprogramm Evernote von Access aus angesehen. Leider bietet dieses populäre Programm keine echte VBA-Schnittstelle. Das ist beim Pendant des Herstellers Microsoft natürlich anders: Hier gibt es eine Objektbibliothek, die Sie in ein VBA-Projekt einbinden und mit dem Sie auf die in OneNote gespeicherten Daten zugreifen können. Im vorliegenden Beitrag schauen wir uns an, wie Sie per VBA auf die in OneNote gespeicherten Informationen zugreifen können.

Vor- und Nachteile

OneNote bietet keine offensichtlichen Nachteile im Vergleich zu Evernote, sondern eher noch Vorteile. Der gravierendste Vorteil ist, dass Sie, sofern Sie Office (zum Beispiel über Office 365) besitzen, keine zusätzlichen Kosten haben und der Speicherplatz für Ihre Notizen/Dokumente nicht begrenzt ist. Wenn Sie bisher mit Evernote gearbeitet haben, müssen Sie allerdings eine anders gestaltete Benutzeroberfläche in Kauf nehmen. Diese ist natürlich eher an die übrigen Office-Anwendungen angelehnt. Das hat auch einen gewissen Charme, denn so gewöhnen Sie sich recht schnell daran. Als Evernote-Benutzer fragen Sie sich vermutlich auch, was nun mit allen bisher in Evernote angelegten Notizen und Dokumenten geschieht. Das ist kein Problem, denn Microsoft bietet mit dem OneNote Importer ein Tool an, mit dem Sie beispielsweise Daten aus Evernote importieren können. Bei der von mir genutzten Evernote-Notizzettelsammlung, die beispielsweise auch Hunderte von Artikeln, Magazinen und Büchern im PDF-Format enthält, wurden nur einige wenige Elemente nicht importiert, die dann auch noch in einer übersicht angezeigt werden. Die fehlenden Elemente kann man dann leicht selbst hinzufügen. In der Regel scheiterte der Import daran, dass die Elemente zu groß waren.

Ein Nachteil scheint jedoch die Wahl des Speicherortes zu sein: Während bei Evernote alle Informationen auch lokal auf dem Rechner gespeichert werden und etwa die angehängten PDF-Dateien in einem eigenen Ordner liegen, scheint dies bei OneNote nicht möglich zu sein.

Organisation in OneNote

In OneNote gibt es verschiedene Ebenen. Die oberste Ebene ist die der Notizbücher. Notizbücher legen Sie an und wählen Sie aus über den linken Reiter des mittleren Bereichs der Anwendung. Klappen Sie diesen auf, erhalten Sie den Befehl Notizbuch hinzufügen sowie eine Liste der aktuell geöffneten Notizbücher (s. Bild 1). Außerdem finden Sie dort einen Eintrag namens Andere Notizbücher öffnen, mit dem Sie die aktuell zwar in OneDrive gespeicherten, aber nicht geöffneten Notizbücher öffnen können. Wenn Sie aus Gründen der übersicht ein Notizbuch schließen möchten, gelingt das am besten über den Kontextmenüeintrag Notizbuch schließen des Notizbuchs in dieser Ansicht.

Notizbücher unter OneNote

Bild 1: Notizbücher unter OneNote

Haben Sie ein Notizbuch geschlossen und öffnen dieses wieder, dauert dies je nach der Menge der enthaltenen Daten recht lange. Das liegt daran, dass OneNote wohl keine lokale Kopie der Daten bereithält und dass alle Inhalte immer aus dem Web geladen werden müssen. Hier arbeitet Evernote besser – die auf dem Rechner angelegten Daten werden lokal gespeichert und von dort in die Cloud synchronisiert, damit sie auch auf anderen Geräten abgerufen werden können. Zum Test des Zugriffs auf die Elemente von OneNote haben wir zunächst zwei Notizbücher namens Test-Notizbuch 1 und Test-Notizbuch 2 angelegt.

Abschnitte im Notizbuch

Die zweite Ebene der Notizen sind die Abschnitte. Diese erreichen Sie über die übrigen Registerkarten, die jeweils den Abschnittsnamen anzeigen. Für das Notizbuch Test-Notizbuch haben wir zwei Abschnitte namens Test-Abschnitt 1 und Test-Abschnitt 2 angelegt (s. Bild 2). Wenn Sie einen dieser Registerreiter anklicken, erscheint die jeweils erste zu diesem Abschnitt gespeicherte Notiz. Diese wird auch in der Liste aller Notizen dieses Abschnitts in der Liste auf der rechten Seite angezeigt. Einen neuen Abschnitt legen Sie per Mausklick auf den Registerreiter mit dem Plus-Symbol an (+). Um den Namen einzustellen, wählen Sie das Kontextmenü des Registerreiters aus und klicken dort auf den Eintrag Umbenennen.

Bereiche eines Notizbuchs

Bild 2: Bereiche eines Notizbuchs

Notizen

Die Notizen bilden also die dritte Ebene in der Hierarchie von OneNote. Eine neue Notiz fügen Sie durch einen Klick auf den Befehl Seite hinzufügen im rechten Bereich des OneNote-Fensters hinzu. Die Notizen benennen Sie einfach durch Anpassen der überschrift um, die über dem Datum angezeigt wird. Um einen Inhalt einzugeben, klicken Sie einfach auf den Bereich unter dem Datum und beginnen zu tippen. Sie können einer Notiz auch einfach Bilder oder andere Elemente wie PDF-Dokumente hinzufügen – oder Sie erstellen einfach eine Skizze (s. Bild 3).

Notizbuch mit Bild

Bild 3: Notizbuch mit Bild

Zugriff per VBA

Damit wären die Vorbereitungen erledigt und wir haben eine kleine Beispielstruktur für den Zugriff per VBA erstellt. Um tatsächlich mit VBA auf OneNote zuzugreifen, benötigen Sie noch einen Verweis auf die entsprechende Objektbibliothek.

Diesen fügen Sie im VBA-Projekt der Datenbankdatei, mit der Sie auf OneNote zugreifen wollen, über den Verweise-Dialog hinzu (Menüeintrag Extras|Verweise). Der Verweis heißt Microsoft OneNote x.0 Object Library (s. Bild 4).

Verweis für den Zugriff auf OneNote

Bild 4: Verweis für den Zugriff auf OneNote

Liste der Notizbücher einlesen

Damit kommen wir gleich zum ersten Beispiel – dem Einlesen der Liste aller Notizbücher von OneNote. Der dafür verwendete Code sieht wie folgt aus:

Public Sub OneNoteNotizbuecher()
     Dim objOneNote As OneNote.Application
     Dim strHierarchy As String
     Set objOneNote = New OneNote.Application
     objOneNote.GetHierarchy "",  OneNote.HierarchyScope.hsNotebooks, strHierarchy
     Debug.Print FormatXML(strHierarchy)
End Sub

Hier sind ein paar Erläuterungen notwendig. Wir erstellen als Erstes ein Objekt des Typs OneNote.Application und speichern es in einer Objektvariablen namens objOneNote. Dann rufen wir die Methode GetHierarchy dieses Objekts auf. Diese erwartet drei Parameter:

  • bstrStartNodeID: Gibt die ID des übergeordneten Elements an. Wir geben eine leere Zeichenkette an, damit alle Notizbücher geliefert werden.
  • hsScope: Gibt den Bereich an, der durchsucht werden soll. Wir wollen uns die Notebooks ansehen, also verwenden wir den Eintrag hsNotebooks der Auflistung OneNote.HierarchyScope.
  • pbstrHierarchyXMLOut: Erwartet einen String-Parameter, mit dem das Ergebnis des Aufrufs zurückgegeben wird.

Das Ergebnis der Abfrage finden wir in Listing 1. Es handelt sich um ein XML-Dokument, das wir mithilfe der Funktion FormatXML in ein etwas besser lesbares Format gebracht haben (der eigentliche Rückgabewert enthält keine Zeilenumbrüche).

<xml version="1.0">
<one:Notebooks xmlns:one="http://schemas.microsoft.com/office/onenote/2013/onenote">
     <one:Notebook name="Test-Notizbuch 2" nickname="Test-Notizbuch 2" ID="{D6DCD364-35B7-4E68-ADE6-B4033A1C3EF2}{1}{B0}" 
         path="https://d.docs.live.net/4cea18f6eeca8019/Documents/Test-Notizbuch 2/" 
         lastModifiedTime="2017-06-18T09:35:38.000Z" color="#9595AA" isCurrentlyViewed="true"/>
     <one:Notebook name="Test-Notizbuch 1" nickname="Test-Notizbuch 1" ID="{68E5FF92-706E-4FD5-8218-40A4CE8D552E}{1}{B0}"
         path="https://d.docs.live.net/4cea18f6eeca8019/Documents/Test-Notizbuch 1/" 
         lastModifiedTime="2017-06-8T10:16:39.000Z" color="#EE9597"/>
     <one:UnfiledNotes ID="{0B18F8FC-9EC3-4FF4-89E8-A15BBA1F7FDD}{1}{B0}"/>
</one:Notebooks>

Listing 1: Auflistung der Notizbücher im XML-Format

Nun stellen wir fest, dass das XML-Dokument lediglich zwei Einträge enthält. Dies ist für unseren Fall, da wir nur zwei Notizbücher angelegt haben, erwartungsgemäß, aber tatsächlich liegen auf dem Entwicklungsrechner einige Notizbücher mehr vor. Diese sind allerdings aktuell nicht geladen, was darauf hindeutet, dass nur die geladenen Notizbücher geliefert werden. Wenn wir nun auf die Attribute der einzelnen Elemente zugreifen wollen, müssen wir den VBA-Code etwas erweitern, wie Listing 2 zeigt. Hier verwenden wir Elemente der noch per Verweis einzubindenden Bibliothek Microsoft XML 6.0 Object Library, um auf die Inhalte des XML-Dokuments zuzugreifen.

Public Sub OneNoteNotizbuecherXML()
     Dim objOneNote As OneNote.Application
     Dim strHierarchy As String
     Dim objXML As MSXML2.DOMDocument60
     Dim objElement As MSXML2.IXMLDOMElement
     Dim strNamespace As String
     Set objOneNote = New OneNote.Application
     objOneNote.GetHierarchy "", OneNote.HierarchyScope.hsNotebooks, strHierarchy
     Set objXML = New MSXML2.DOMDocument60
     objXML.loadXML strHierarchy
     strNamespace = "xmlns:one=""http://schemas.microsoft.com/office/onenote/2013/onenote"""
     objXML.SetProperty "SelectionNamespaces", strNamespace
     For Each objElement In objXML.selectNodes("//one:Notebook")
         With objElement
             Debug.Print .getAttribute("name"), .getAttribute("ID"), .getAttribute("path"), _
                 .getAttribute("lastModifiedTime"), .getAttribute("color"), .getAttribute("isCurrentlyViewed")
         End With
     Next objElement
End Sub

Listing 2: Auflistung der Notizbücher und Ausgabe der einzelnen Attribute

Die Prozedur OneNoteNotizbuecherXML liest wie zuvor mit der Methode GetHierarchy das XML-Dokument mit den Notizbüchern in die Variable strHierarchy ein. Diese landet allerdings direkt über die Methode loadXML im Objekt objXML des Typs DOMDocument60. Hier müssen wir, da das komplette XML-Dokument den Namespace one: verwendet, diesen Namespace über die Eigenschaft SelectionNamespaces festlegen – anderenfalls können wir nicht mit der weiter unten verwendeten Methode SelectNodes auf die Elemente des XML-Dokuments zugreifen. Die Zuweisung erledigen wir mit der Methode SetProperty, der wir als erstes Argument den Namen der zu setzenden Eigenschaft, hier SelectionNamespaces, und zweitens die Definition des Namespaces übergeben, wie sie im Kopf des XML-Dokuments angegeben ist.

Danach können wir leicht in einer For Each-Schleife alle Elemente der Auflistung von XML-Elementen mit dem Namen one:Notebook durchlaufen. Diese ermitteln wir mit der Methode selectNodes(“//one:Notebook”), welche zuverlässig alle Elemente mit dem Namen one:Notebook ermittelt. Innerhalb dieser Schleife geben wir dann die mit der Methode getAttribut ermittelten Eigenschaftswerte des jeweiligen Elements im Direktfenster des VBA-Editors aus. Dazu übergeben wir einfach die einzelnen Attributnamen, wie sie auch in dem XML-Element zu finden sind:

<one:Notebook name="Test-Notizbuch 2" nickname="Test-Notizbuch 2" ID="{D6DCD364-35B7-4E68-ADE6-B4033A1C3EF2}{1}{B0}" path="https://d.docs.live.net/4cea18f6eeca8019/Documents/Test-Notizbuch 2/" lastModifiedTime="2017-06-18T09:35:38.000Z" color="#9595AA" isCurrentlyViewed="true"/>

Die Ausgabe sieht dann etwa wie in Bild 5 aus. Welche Elemente dieser Ausgabe wir später noch benötigen, schauen wir uns gleich an.

Ausgabe der Eigenschaften der Notebook-Elemente

Bild 5: Ausgabe der Eigenschaften der Notebook-Elemente

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar