Uporaba Excela VBA za potiskanje vsebine v OneNote - Članki TechTV

Avgusta je Microsoft izdal različico SP1 programa OneNote. To je nujna nadgradnja. Dodali so veliko neverjetnih funkcij, vključujejo vmesnik za programiranje aplikacij, ki drugim aplikacijam omogoča potiskanje podatkov v OneNote.

Microsoft ponuja več odličnih spletnih mest, ki vas bodo naučila, kako uporabljati VB.Net za potiskanje podatkov v OneNote. Ker pa je to spletno mesto, vas in mene in ostalih 200 milijonov uporabnikov sistema Office najbolj skrbi, kako podatke pošiljati v OneNote s sistemom Office VBA. Z veseljem rečem, da je to LAHKO narediti. Ta stran vas bo vodila skozi vse, kar potrebujete za to.

Predvidevam, da VBA dobro poznate. Če niste, toplo priporočam VBA & Macros za Microsoft Excel, knjigo, ki je namenjena temu, da nekoga popelje po krivulji učenja VBA.

Pregled

Podatke lahko pošljete v OneNote tako, da jih oblikujete kot podatke XML. XML je dokaj nov koncept. To je nekako kot HTML. Pomislite na to kot na datoteko CSV na steroidih. Lahko si preberete moj Uvod v XML.

V bistvu mora vaš program VBA zapisati datoteko XML in nato z metodo .Import posredovati vsebino datoteke XML v OneNote. Datoteka XML mora vsebovati te elemente:

  • Element EnsurePage za vsako stran, na katero želite pisati. Če stran ne obstaja, jo bo ustvaril OneNote. V teoriji naj bi imeli nadzor in postavili stran za določeno obstoječo stranjo. Vendar se v praksi zdi, da to ne deluje.
  • PlaceObject element za vsak element, ki ga želite dodati na stran. Določite lokacijo X & Y za element in vir elementa. Element je lahko slika, predmet s črnilom ali besedilo v obliki HTML. Mislili bi, da lahko OneNote bere iz HTML-ja, dejansko lahko prenesete tabelo z oznakama TR in TD, vendar to ne deluje. Omejeni ste na posredovanje besedila z oznakama BR in P za dodajanje virov vrstice. Zdi se, da oznake UL in LI delujejo. Oznake pisav delujejo.

Gotcha

Če želite posodobiti obstoječo stran, morate poznati globalni enolični identifikator (GUID) za to stran. Zdi se, da ni mogoče najti GUID-a za obstoječo stran v programu OneNote. To pomeni, da lahko posodobite ali izbrišete elemente na obstoječi strani samo, če ste programsko ustvarili stran in ste v delovni zvezek shranili GUID, uporabljen za ustvarjanje te strani. Spodnji primer uporablja mesto na delovnem listu, da shranite GUID za stran, podatkovno tabelo in grafikon.

GUID-ji

Vsaka nova stran v OneNotu potrebuje GUID. Vsak nov objekt na strani potrebuje GUID. Čeprav je enostavno ustvariti GUID-je iz VB.Net, je iskanje načina za generiranje GUID-jev iz VBA nedosegljivo. Vseh 200 milijonov uporabnikov Officea VBA mora dati piko na i Michaelu Kaplanu iz programske opreme Trigeminal. Zdi se, da je Michael edini na svetu, ki je prekinil kodo o tem, kako iz VBA ustvariti GUID. To milost je prijazno delil s svetom. Poglejte celotno kodo na njegovi spletni strani. Z Michaelovim dovoljenjem sem tukaj kopiral samo funkcije, potrebne za ustvarjanje novega GUID-ja v VBA. V svoj projekt vstavite modul in v ta modul vključite naslednjo kodo.

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

Dodajanje reference

V VBA uporabite Orodja - sklici, da dodate sklic na knjižnico predmetov OneNote 1.1. To vam bo omogočilo, da deklarirate nov objekt CSimpleImporter in nato na objektu uporabite metode .Import in .NavigateToPage.

Študija primera

Ta Excelov delovni zvezek vsebuje sistem dnevnega poročanja. V lokalni verigi trgovin je en delovni list za vsako trgovino. Vsaka stran vsebuje tabelo, ki prikazuje dnevno prodajo, in grafikon, ki prikazuje napredek pri doseganju mesečnega cilja.

Koda VBA bo dodala nov razdelek z imenom DailySales. Za vsako trgovino bo dodana ena nova stran. Grafikon z delovnega lista se izvozi kot datoteka GIF in uvozi v OneNote. Podatki z delovnega lista se v OneNote dodajo kot stolpec HTML.

Dnevna prodaja

V Excelu se uporablja naslednja koda.

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.

Zanimive Članki...