Používanie programu Excel VBA na presúvanie obsahu do OneNotu - Články z TechTV

V auguste spoločnosť Microsoft vydala verziu SP1 pre OneNote. Toto je nevyhnutná aktualizácia. Pridali veľa neuveriteľných funkcií, vrátane aplikačného programovacieho rozhrania, ktoré umožňuje iným aplikáciám posielať údaje do OneNotu.

Microsoft ponúka niekoľko vynikajúcich webov, ktoré vás naučia používať VB.Net na tlačenie údajov do OneNotu. Keďže sa však jedná o tento web, vy a ja a ďalších 200 miliónov používateľov balíka Office sa najviac zaujímame o to, ako tlačiť údaje do OneNotu pomocou balíka Office VBA. S radosťou môžem povedať, že sa to dá urobiť. Táto stránka vás prevedie všetkým, čo potrebujete, aby ste to dosiahli.

Budem predpokladať, že ste mierne oboznámení s VBA. Ak nie ste, veľmi odporúčam VBA a makrá pre Microsoft Excel, knihu navrhnutú tak, aby niekoho posunula v kurze učenia VBA.

Prehľad

Údaje môžete do OneNotu posielať formátovaním údajov ako údajov XML. XML je pomerne nový koncept. Je to niečo ako HTML. Predstavte si to ako súbor CSV o steroidoch. Môžete si prečítať môj Úvod do XML.

Váš program VBA v zásade musí vypísať súbor XML a potom odovzdať obsah súboru XML do OneNotu pomocou metódy .Import. Súbor XML musí obsahovať tieto prvky:

  • Element EnsurePage pre každú stránku, na ktorú chcete zapisovať. Ak stránka neexistuje, OneNote ju vytvorí. Teoreticky by ste mali mať kontrolu a umiestniť stránku za konkrétnu existujúcu stránku. Zdá sa však, že v praxi to nefunguje.
  • Element PlaceObject pre každú položku, ktorú chcete pridať na stránku. Zadáte umiestnenie X & Y pre položku a zdroj položky. Položkou môže byť buď obrázok, atramentový objekt, alebo text vo formáte HTML. Mohli by ste si myslieť, že keďže OneNote číta z HTML, môžete skutočne odovzdať tabuľku so značkami TR a TD, ale to nefunguje. Na pridávanie riadkov ste obmedzený na odovzdávanie textu so značkami BR a P. Zdá sa, že značky UL a LI fungujú. Značky písma fungujú.

Gotcha

Ak chcete aktualizovať existujúcu stránku, musíte poznať globálne jedinečný identifikátor (GUID) pre túto stránku. Zdá sa, že neexistuje spôsob, ako nájsť identifikátor GUID pre existujúcu stránku v OneNote. To znamená, že položky na existujúcej stránke môžete aktualizovať alebo odstraňovať, iba ak ste stránku vytvorili programovo a do zošita ste uložili identifikátor GUID použitý na vytvorenie tejto stránky. Nasledujúci príklad používa miesto v pracovnom hárku, ktoré nie je v súlade s uložením identifikátora GUID pre stránku, tabuľku údajov a graf.

GUID

Každá nová stránka v OneNote potrebuje GUID. Každý nový objekt umiestnený na stránke vyžaduje identifikátor GUID. Aj keď je ľahké generovať GUID z VB.Net, hľadanie spôsobu, ako generovať GUID z VBA, bolo neuchopiteľné. Všetkých 200 miliónov používateľov Office VBA musí dať špičku Michaelovi Kaplanovi zo spoločnosti Trigeminal Software. Zdá sa, že Michael je jediný na svete, ktorý prelomil kód generovania GUID z VBA. Vľúdne zdieľal tento kódex so svetom. Celý kód nájdete na jeho webovej stránke. S povolením Michaela som tu skopíroval iba funkcie potrebné na vygenerovanie nového identifikátora GUID vo VBA. Vložte modul do svojho projektu a vložte do neho nasledujúci kód.

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

Pridanie referencie

Vo VBA pridajte pomocou nástrojov - referencie odkaz na objektovú knižnicu OneNote 1.1. To vám umožní deklarovať nový objekt CSimpleImporter a potom na objekte použiť metódy .Import a .NavigateToPage.

Prípadová štúdia

Tento zošit programu Excel obsahuje systém denných správ. Pre každý obchod v miestnej sieti obchodov existuje jeden pracovný hárok. Každá stránka obsahuje tabuľku s dennými tržbami a graf s pokrokom pri dosahovaní mesačného cieľa.

Kód VBA pridá novú sekciu s názvom DailySales. Pre každý obchod bude pridaná jedna nová stránka. Graf z hárka sa exportuje ako súbor GIF a importuje sa do OneNotu. Údaje z hárka sa do OneNotu pridávajú ako stĺpec HTML.

Denný predaj

V programe Excel sa používa nasledujúci kód.

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.

Zaujímavé články...