Utilisation d'Excel VBA pour pousser du contenu vers OneNote - Articles TechTV

En août, Microsoft a publié la version SP1 de OneNote. Il s'agit d'une mise à niveau indispensable. Ils ont ajouté de nombreuses fonctionnalités incroyables, notamment une interface de programmation d'application qui permet à d'autres applications de pousser des données vers OneNote.

Microsoft propose plusieurs excellents sites Web qui vous apprendront à utiliser VB.Net afin de pousser des données dans OneNote. Mais, puisqu'il s'agit du site, vous et moi, ainsi que les 200 autres millions d'utilisateurs d'Office, sommes les plus préoccupés par la manière de transférer des données vers OneNote à l'aide d'Office VBA. Je suis heureux de dire que cela PEUT être fait. Cette page vous expliquera tout ce dont vous avez besoin pour y parvenir.

Je suppose que vous êtes moyennement familier avec VBA. Si vous ne l'êtes pas, je recommande vivement VBA & Macros for Microsoft Excel, le livre conçu pour amener quelqu'un dans la courbe d'apprentissage VBA.

Aperçu

Vous pouvez envoyer des données à OneNote en formatant les données en tant que données XML. XML est un concept assez nouveau. C'est un peu comme du HTML. Considérez-le comme un fichier CSV sur les stéroïdes. Vous pouvez lire mon Introduction à XML.

Fondamentalement, votre programme VBA doit écrire un fichier XML, puis transmettre le contenu du fichier XML à OneNote à l'aide de la méthode .Import. Le fichier XML doit contenir ces éléments:

  • Un élément EnsurePage pour chaque page sur laquelle vous souhaitez écrire. Si la page n'existe pas, OneNote créera la page pour vous. En théorie, vous êtes censé avoir le contrôle et placer la page après une page existante spécifique. Cependant, dans la pratique, cela ne semble pas fonctionner.
  • Un élément PlaceObject pour chaque élément que vous souhaitez ajouter à la page. Vous spécifiez l'emplacement X et Y de l'élément et la source de l'élément. Un élément peut être une image, un objet Ink ou du texte au format HTML. On pourrait penser que puisque OneNote lit du HTML, vous pourriez en fait passer une table avec des balises TR et TD, mais cela ne fonctionne pas. Vous êtes limité à passer du texte avec des balises BR et P pour ajouter des sauts de ligne. Les balises UL et LI semblent fonctionner. Les balises de police fonctionnent.

Le Gotcha

Afin de mettre à jour une page existante, vous devez connaître l'identificateur global unique (GUID) de cette page. Il ne semble pas y avoir de moyen de trouver le GUID d'une page existante dans OneNote. Cela signifie que vous ne pouvez mettre à jour ou supprimer des éléments sur une page existante que si vous avez créé la page par programme et avez stocké le GUID utilisé pour créer cette page dans votre classeur. L'exemple ci-dessous utilise un emplacement à l'écart sur la feuille de calcul pour enregistrer le GUID de la page, de la table de données et du graphique.

GUID

Chaque nouvelle page dans OneNote a besoin d'un GUID. Chaque nouvel objet placé sur une page a besoin d'un GUID. Bien qu'il soit facile de générer des GUID à partir de VB.Net, trouver un moyen de générer des GUID à partir de VBA a été difficile à atteindre. Les 200 millions d'utilisateurs d'Office VBA doivent donner un conseil à Michael Kaplan de Trigeminal Software. Michael semble être le seul au monde à casser le code sur la façon de générer un GUID à partir de VBA. Il a gracieusement partagé ce code avec le monde. Consultez le code complet sur son site Web. Avec la permission de Michael, je n'ai copié que les fonctions nécessaires pour générer un nouveau GUID dans VBA ici. Insérez un module dans votre projet et incluez le code suivant dans ce module.

'------------------------------------------ ' 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

Ajouter une référence

Dans VBA, utilisez Outils - Références pour ajouter une référence à la bibliothèque d'objets OneNote 1.1. Cela vous permettra de déclarer un nouvel objet CSimpleImporter, puis d'utiliser les méthodes .Import et .NavigateToPage sur l'objet.

Étude de cas

Ce classeur Excel contient un système de rapport quotidien. Il existe une feuille de calcul pour chaque magasin d'une chaîne de magasins locale. Chaque page contient un tableau montrant les ventes quotidiennes et un graphique montrant la progression vers l'objectif mensuel.

Le code VBA ajoutera une nouvelle section appelée DailySales. Une nouvelle page sera ajoutée pour chaque boutique. Le graphique de la feuille de calcul est exporté sous forme de fichier GIF et importé dans OneNote. Les données de la feuille de calcul sont ajoutées à OneNote en tant que colonne HTML.

Ventes quotidiennes

Le code suivant est utilisé dans Excel.

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.

Articles intéressants...