Verwenden von Excel VBA zum Übertragen von Inhalten auf OneNote - TechTV-Artikel

Im August veröffentlichte Microsoft die Version SP1 von OneNote. Dies ist ein Muss. Sie haben viele unglaubliche Funktionen hinzugefügt, darunter eine Anwendungsprogrammierschnittstelle, über die andere Anwendungen Daten an OneNote senden können.

Microsoft bietet mehrere hervorragende Websites an, auf denen Sie lernen, wie Sie VB.Net verwenden, um Daten in OneNote zu übertragen. Da dies jedoch die Site ist, sind Sie und ich sowie die anderen 200 Millionen Office-Benutzer am meisten besorgt darüber, wie Daten mithilfe von Office VBA an OneNote übertragen werden können. Ich bin froh zu sagen, dass dies getan werden kann. Diese Seite führt Sie durch alles, was Sie brauchen, um es zu erledigen.

Ich gehe davon aus, dass Sie mit VBA mäßig vertraut sind. Wenn nicht, empfehle ich VBA & Macros für Microsoft Excel, das Buch, das entwickelt wurde, um jemanden in die VBA-Lernkurve aufzunehmen.

Überblick

Sie können Daten an OneNote senden, indem Sie die Daten als XML-Daten formatieren. XML ist ein ziemlich neues Konzept. Es ist wie HTML. Stellen Sie sich das als CSV-Datei über Steroide vor. Sie können meine Einführung in XML lesen.

Grundsätzlich muss Ihr VBA-Programm eine XML-Datei schreiben und dann den Inhalt der XML-Datei mithilfe der .Import-Methode an OneNote übergeben. Die XML-Datei muss folgende Elemente enthalten:

  • Ein EnsurePage-Element für jede Seite, auf die Sie schreiben möchten. Wenn die Seite nicht vorhanden ist, erstellt OneNote die Seite für Sie. Theoretisch sollten Sie die Kontrolle haben und die Seite nach einer bestimmten vorhandenen Seite platzieren. In der Praxis scheint dies jedoch nicht zu funktionieren.
  • Ein PlaceObject-Element für jedes Element, das Sie der Seite hinzufügen möchten. Sie geben den X & Y-Speicherort für den Artikel und die Quelle des Artikels an. Ein Element kann entweder ein Bild, ein Tintenobjekt oder Text im HTML-Format sein. Sie würden denken, da OneNote aus HTML liest, könnten Sie tatsächlich eine Tabelle mit TR- und TD-Tags übergeben, aber dies funktioniert nicht. Sie können nur Text mit BR- und P-Tags übergeben, um Zeilenvorschübe hinzuzufügen. UL & LI-Tags scheinen zu funktionieren. Schriftarten funktionieren.

Die Gotcha

Um eine vorhandene Seite zu aktualisieren, müssen Sie die GUID (Global Unique Identifier) ​​für diese Seite kennen. Es scheint keine Möglichkeit zu geben, die GUID für eine vorhandene Seite in OneNote zu finden. Dies bedeutet, dass Sie Elemente auf einer vorhandenen Seite nur aktualisieren oder löschen können, wenn Sie die Seite programmgesteuert erstellt und die zum Erstellen dieser Seite verwendete GUID in Ihrer Arbeitsmappe gespeichert haben. Im folgenden Beispiel wird eine abgelegene Stelle im Arbeitsblatt verwendet, um die GUID für die Seite, die Datentabelle und das Diagramm zu speichern.

GUIDs

Jede neue Seite in OneNote benötigt eine GUID. Jedes neue Objekt auf einer Seite benötigt eine GUID. Während es einfach ist, GUIDs aus VB.Net zu generieren, war es schwierig, einen Weg zu finden, um GUIDs aus VBA zu generieren. Alle 200 Millionen Office VBA-Benutzer müssen Michael Kaplan von Trigeminal Software einen Tipp geben. Michael scheint der einzige auf der Welt zu sein, der den Code zum Generieren einer GUID aus VBA gebrochen hat. Er hat diesen Code liebenswürdig mit der Welt geteilt. Den vollständigen Code finden Sie auf seiner Website. Mit Michaels Erlaubnis habe ich hier nur die Funktionen kopiert, die zum Generieren einer neuen GUID in VBA erforderlich sind. Fügen Sie ein Modul in Ihr Projekt ein und fügen Sie den folgenden Code in dieses Modul ein.

'------------------------------------------ ' basGuid from http://www.trigeminal.com/code/guids.bas ' You may use this code in your applications, just make ' sure you keep the (c) notice and don't publish it anywhere ' as your own ' Copyright (c) 1999 Trigeminal Software, Inc. All Rights Reserved '------------------------------------------ Option Compare Binary ' Note that although Variants now have ' a VT_GUID type, this type is unsupported in VBA, ' so we must define our own here that will have the same ' binary layout as all GUIDs are expected by COM to ' have. Public Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(7) As Byte End Type Public Declare Function StringFromGUID2 Lib "ole32.dll" _ (rclsid As GUID, ByVal lpsz As Long, ByVal cbMax As Long) As Long Public Declare Function CoCreateGuid Lib "ole32.dll" _ (rclsid As GUID) As Long '------------------------------------------------------------ ' StGuidGen ' ' Generates a new GUID, returning it in canonical ' (string) format '------------------------------------------------------------ Public Function StGuidGen() As String Dim rclsid As GUID If CoCreateGuid(rclsid) = 0 Then StGuidGen = StGuidFromGuid(rclsid) End If End Function '------------------------------------------------------------ ' StGuidFromGuid ' ' Converts a binary GUID to a canonical (string) GUID. '------------------------------------------------------------ Public Function StGuidFromGuid(rclsid As GUID) As String Dim rc As Long Dim stGuid As String ' 39 chars for the GUID plus room for the Null char stGuid = String$(40, vbNullChar) rc = StringFromGUID2(rclsid, StrPtr(stGuid), Len(stGuid) - 1) StGuidFromGuid = Left$(stGuid, rc - 1) End Function

Hinzufügen einer Referenz

Verwenden Sie in VBA Tools - Referenzen, um einen Verweis auf die OneNote 1.1-Objektbibliothek hinzuzufügen. Auf diese Weise können Sie ein neues CSimpleImporter-Objekt deklarieren und dann die Methoden .Import und .NavigateToPage für das Objekt verwenden.

Fallstudie

Diese Excel-Arbeitsmappe enthält ein tägliches Berichtssystem. Für jedes Geschäft in einer lokalen Geschäftskette gibt es ein Arbeitsblatt. Jede Seite enthält eine Tabelle mit den täglichen Verkäufen und eine Tabelle mit den Fortschritten auf dem Weg zum monatlichen Ziel.

Der VBA-Code fügt einen neuen Abschnitt namens DailySales hinzu. Für jedes Geschäft wird eine neue Seite hinzugefügt. Das Diagramm aus dem Arbeitsblatt wird als GIF-Datei exportiert und in OneNote importiert. Die Daten aus dem Arbeitsblatt werden OneNote als HTML-Spalte hinzugefügt.

Tägliche Verkäufe

Der folgende Code wird in Excel verwendet.

Sub CreateUpdateOneNoteReport() ' Requires basGuid module from above Dim Cht As Chart fname = "C:OneNoteImport.xml" On Error Resume Next Kill (fname) On Error GoTo 0 ' Do we need new GUID's? For Each ws In ThisWorkbook.Worksheets If Not ws.Range("J22").Value> "" Then ws.Range("J22").Value = StGuidGen() End If If Not ws.Range("J23").Value> "" Then ws.Range("J23").Value = StGuidGen() End If If Not ws.Range("J24").Value> "" Then ws.Range("J24").Value = StGuidGen() End If Next ws ' Build a temporary XML file fname = "C:OneNoteImport.xml" On Error Resume Next Kill (fname) On Error GoTo 0 Open fname For Output As #1 Print #1, " " Print #1, " " ' Make sure that for each page, we have a page FirstPage = True DateStr = Format(Date - 1, "yyyy-mm-dd") & "T21:00:00-06:00" For Each ws In ThisWorkbook.Worksheets ThisTitle = ws.Name ThisGuid = ws.Range("J22").Value Print #1, " " FirstPage = False LastGuid = ThisGuid Next ws For Each ws In ThisWorkbook.Worksheets ThisTitle = ws.Name ThisImage = "C: " & ThisTitle & ".gif" ThisGuid = ws.Range("J22").Value ChartGuid = ws.Range("J24").Value TableGuid = ws.Range("J23").Value ' Export the Chart Set Cht = ws.ChartObjects(1).Chart Cht.Export Filename:=ThisImage, FilterName:="GIF" ' Place the Chart on the top, right side Print #1, "" Print #1, " " Print #1, "" Print #1, " " Print #1, " " Print #1, "  
Resulting OneNote Notebook

Apparent Bugs

In the book, I mentioned an apparent bug with "insertafter". I forgot that XML is case sensitive. If you use "insertAfter", then everything works fine. Thanks to Donovan Lange at Microsoft for pointing this out.

I am guessing that the next issue is not a bug - the code is probably working like Microsoft intended, but they missed an opportunity to do something the right way. You are allowed to specify a date and time in the EnsurePage section of the XML. This date and time is only used if the page does not exist. Given that Microsoft later allows us to update the page by remembering the GUID, they really should have allowed us to update the date and time on the page. In the example here, we are pushing new data each day, yet the date is always going to show that it is as of the first time that the program was run. This is disappointing.

Interessante Beiträge...