U kolovozu je Microsoft objavio verziju SP1 programa OneNote. Ovo je nadogradnja koju morate imati. Dodali su mnoge nevjerojatne značajke, uključuju sučelje za programiranje aplikacija koje omogućuje drugim aplikacijama da guraju podatke u OneNote.
Microsoft nudi nekoliko izvrsnih web stranica koje će vas naučiti kako koristiti VB.Net za guranje podataka u OneNote. No, budući da je ovo web mjesto, vas i mene i ostalih 200 milijuna korisnika Officea najviše brine kako preusmjeriti podatke u OneNote pomoću Office VBA. Sretna sam što mogu reći da se to MOŽE učiniti. Ova će vas stranica provesti kroz sve što vam je potrebno da to obavite.
Pretpostavit ću da ste umjereno upoznati s VBA-om. Ako niste, toplo preporučujem VBA i makronaredbe za Microsoft Excel, knjigu koja je dizajnirana da nekoga odvede do VBA krivulje učenja.
Pregled
Podatke možete poslati u OneNote formatiranjem podataka kao XML podataka. XML je prilično nov koncept. To je poput HTML-a. Shvatite to kao CSV datoteku na steroidima. Možete pročitati moj Uvod u XML.
U osnovi, vaš VBA program mora zapisati XML datoteku, a zatim proslijediti sadržaj XML datoteke u OneNote pomoću metode .Import. XML datoteka mora sadržavati ove elemente:
- Element EnsurePage za svaku stranicu na koju želite pisati. Ako stranica ne postoji, OneNote će je stvoriti za vas. U teoriji biste trebali imati kontrolu i postaviti stranicu nakon određene postojeće stranice. Međutim, u praksi to izgleda ne djeluje.
- PlaceObject element za svaku stavku koju želite dodati na stranicu. Navedite X & Y mjesto za stavku i izvor stavke. Stavka može biti slika, tinta ili tekst u HTML formatu. Pomislili biste da, budući da OneNote čita iz HTML-a, zapravo možete proslijediti tablicu s TR i TD oznakama, ali to ne funkcionira. Ograničeni ste na prosljeđivanje teksta s BR i P oznakama za dodavanje linijskih feedova. Čini se da UL & LI oznake rade. Oznake fonta rade.
Gotcha
Da biste ažurirali postojeću stranicu, morate znati globalni jedinstveni identifikator (GUID) za tu stranicu. Čini se da ne postoji način za pronalaženje GUID-a za postojeću stranicu u programu OneNote. To znači da stavke na postojećoj stranici možete ažurirati ili izbrisati samo ako ste stranicu programski kreirali i u svoju radnu knjigu pohranili GUID koji se koristi za izradu te stranice. Primjer u nastavku koristi mjesto na putu na radnom listu za spremanje GUID-a za stranicu, tablicu podataka i grafikon.
GUID-ovi
Svaka nova stranica u programu OneNote treba GUID. Svaki novi objekt smješten na stranici treba GUID. Iako je lako generirati GUID-ove iz VB.Net-a, pronalaženje načina za generiranje GUID-ova iz VBA-a bilo je nedostižno. Svih 200 milijuna korisnika Office VBA-a mora dati kratak udarac Michaelu Kaplanu iz softvera Trigeminal. Čini se da je Michael jedini čovjek na svijetu koji je prekršio kôd o tome kako generirati GUID iz VBA-a. Ljubazno je podijelio ovaj kod sa svijetom. Potpuni kod pogledajte na njegovoj web stranici. Uz Michaelovo dopuštenje, ovdje sam kopirao samo funkcije potrebne za generiranje novog GUID-a u VBA. U svoj projekt umetnite modul i u njega uključite sljedeći kod.
'------------------------------------------ ' 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
Dodavanje reference
U VBA koristite Alati - reference da biste dodali referencu na biblioteku objekata OneNote 1.1. To će vam omogućiti da deklarirate novi objekt CSimpleImporter, a zatim koristite metode .Import i .NavigateToPage na objektu.
Studija slučaja
Ova Excel radna knjiga sadrži sustav dnevnog izvještavanja. Postoji lokalni radni list za svaku trgovinu u lokalnom lancu trgovina. Svaka stranica sadrži tablicu s dnevnom prodajom i tablicu s prikazom napretka prema mjesečnom cilju.
VBA kôd dodati će novi odjeljak pod nazivom DailySales. Za svaku će se trgovinu dodati po jedna nova stranica. Grafikon s radnog lista izvozi se kao GIF datoteka i uvozi u OneNote. Podaci s radnog lista dodaju se u OneNote kao HTML stupac.

Sljedeći se kôd koristi u programu 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.