Utilizarea Excel VBA pentru a împinge conținutul pe OneNote - Articole TechTV

În august, Microsoft a lansat versiunea SP1 a OneNote. Acesta este un upgrade obligatoriu. Au adăugat multe caracteristici incredibile, includ o interfață de programare a aplicațiilor care permite altor aplicații să împingă datele pe OneNote.

Microsoft oferă câteva site-uri web excelente care vă vor învăța cum să utilizați VB.Net pentru a introduce datele în OneNote. Dar, întrucât acesta este site-ul, tu și cu mine și ceilalți 200 de milioane de utilizatori Office suntem cei mai preocupați de cum să împingem datele către OneNote folosind Office VBA. Sunt bucuros să spun că acest lucru POATE fi făcut. Această pagină vă va conduce prin tot ceea ce aveți nevoie pentru a o face.

Voi presupune că sunteți moderat familiarizat cu VBA. Dacă nu sunteți, vă recomand cu tărie VBA și Macros pentru Microsoft Excel, cartea concepută pentru a lua pe cineva în curba de învățare VBA.

Prezentare generală

Puteți trimite date către OneNote formatând datele ca date XML. XML este un concept destul de nou. Este un fel de HTML. Gândiți-vă la asta ca la un fișier CSV pe steroizi. Puteți citi Introducerea mea în XML.

Practic, programul dvs. VBA trebuie să scrie un fișier XML, apoi să transmită conținutul fișierului XML către OneNote folosind metoda .Import. Fișierul XML trebuie să conțină aceste elemente:

  • Un element EnsurePage pentru fiecare pagină pe care doriți să o scrieți. Dacă pagina nu există, OneNote va crea pagina pentru dvs. În teorie, ar trebui să dețineți controlul și să plasați pagina după o anumită pagină existentă. Cu toate acestea, în practică, acest lucru nu pare să funcționeze.
  • Un element PlaceObject pentru fiecare element pe care doriți să îl adăugați la pagină. Specificați locația X & Y pentru articol și sursa elementului. Un articol poate fi fie o imagine, un obiect Ink sau text în format HTML. Ați crede că, din moment ce OneNote citește din HTML, puteți trece de fapt un tabel cu etichete TR și TD, dar acest lucru nu funcționează. Sunteți limitat la trecerea textului cu etichete BR și P pentru a adăuga feed-uri de linie. Etichetele UL și LI să pară că funcționează. Etichetele cu fonturi funcționează.

Gotcha

Pentru a actualiza o pagină existentă, trebuie să cunoașteți identificatorul unic global (GUID) pentru acea pagină. Nu pare să existe o modalitate de a găsi GUID-ul pentru o pagină existentă în OneNote. Aceasta înseamnă că puteți actualiza sau șterge elemente de pe o pagină existentă numai dacă ați creat pagina programatic și ați stocat GUID-ul folosit pentru a crea acea pagină în registrul dvs. de lucru. Exemplul de mai jos folosește un loc în afara foii de lucru pentru a salva GUID-ul pentru pagină, tabelul de date și grafic.

GUID-uri

Fiecare pagină nouă din OneNote are nevoie de un GUID. Fiecare obiect nou plasat pe o pagină are nevoie de un GUID. Deși este ușor să generați GUID-uri din VB.Net, găsirea unei modalități de a genera GUID-uri din VBA a fost evazivă. Toți cei 200 de milioane de utilizatori Office VBA trebuie să acorde un vârf al capacului lui Michael Kaplan de la Trigeminal Software. Michael pare a fi singurul tip din lume care a încălcat codul cu privire la modul de a genera un GUID din VBA. El a împărtășit cu blândețe acest cod lumii. Consultați codul complet de pe site-ul său web. Cu permisiunea lui Michael, am copiat aici doar funcțiile necesare pentru a genera un nou GUID în VBA. Introduceți un modul în proiectul dvs. și includeți următorul cod în acel modul.

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

Adăugarea unei referințe

În VBA, utilizați Instrumente - Referințe pentru a adăuga o referință la biblioteca de obiecte OneNote 1.1. Acest lucru vă va permite să declarați un nou obiect CSimpleImporter și apoi să utilizați metodele .Import și .NavigateToPage pe obiect.

Studiu de caz

Acest registru de lucru Excel conține un sistem de raportare zilnic. Există o foaie de lucru pentru fiecare magazin dintr-un lanț local de magazine. Fiecare pagină conține un tabel care prezintă vânzările zilnice și un grafic care arată progresul către obiectivul lunar.

Codul VBA va adăuga o nouă secțiune numită DailySales. O nouă pagină va fi adăugată pentru fiecare magazin. Diagrama din foaia de lucru este exportată ca fișier GIF și importată în OneNote. Datele din foaia de lucru sunt adăugate la OneNote ca o coloană HTML.

Vânzări zilnice

Următorul cod este utilizat în 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.

Articole interesante...