Používání aplikace Excel VBA k odesílání obsahu do OneNotu - Články TechTV

V srpnu společnost Microsoft vydala verzi SP1 aplikace OneNote. Toto je nutný upgrade. Přidali mnoho neuvěřitelných funkcí, včetně rozhraní pro programování aplikací, které umožňuje dalším aplikacím odesílat data do OneNotu.

Microsoft nabízí několik skvělých webů, které vás naučí používat VB.Net k odesílání dat do OneNotu. Jelikož se však jedná o web, vy i já a dalších 200 milionů uživatelů Office se nejvíce zajímáme o to, jak pomocí Office VBA odeslat data do OneNotu. Jsem rád, že mohu říci, že to lze provést. Tato stránka vás provede vším, co k dokončení potřebujete.

Předpokládám, že jste mírně obeznámeni s VBA. Pokud nejste, velmi doporučuji VBA a makra pro Microsoft Excel, knihu navrženou tak, aby někoho posunula na křivku učení VBA.

Přehled

Data můžete do OneNotu odeslat formátováním dat jako data XML. XML je poměrně nový koncept. Je to něco jako HTML. Přemýšlejte o tom jako o souboru CSV se steroidy. Můžete si přečíst můj Úvod do XML.

V zásadě musí váš program VBA napsat soubor XML a poté předat obsah souboru XML do OneNotu pomocí metody .Import. Soubor XML musí obsahovat tyto prvky:

  • Prvek EnsurePage pro každou stránku, na kterou chcete zapisovat. Pokud stránka neexistuje, OneNote ji vytvoří za vás. Teoreticky byste měli mít kontrolu a umístit stránku za konkrétní existující stránku. V praxi se však zdá, že to nefunguje.
  • Element PlaceObject pro každou položku, kterou chcete přidat na stránku. Určete umístění X & Y pro položku a zdroj položky. Položkou může být obrázek, inkoustový objekt nebo text ve formátu HTML. Myslíte si, že protože OneNote čte z HTML, můžete ve skutečnosti předat tabulku se značkami TR a TD, ale to nefunguje. Jste omezeni na předávání textu se značkami BR a P, abyste přidali řádkování. Značky UL a LI vypadají, že fungují. Značky písma fungují.

Gotcha

Chcete-li aktualizovat existující stránku, musíte znát Globálně jedinečný identifikátor (GUID) pro danou stránku. Zdá se, že neexistuje způsob, jak najít identifikátor GUID pro existující stránku ve OneNotu. To znamená, že můžete aktualizovat nebo mazat položky na existující stránce pouze v případě, že jste programově vytvořili stránku a uložili identifikátor GUID použitý k vytvoření této stránky v sešitu. Následující příklad používá místo v listu pro uložení identifikátoru GUID pro stránku, tabulku dat a graf.

GUID

Každá nová stránka ve OneNotu potřebuje identifikátor GUID. Každý nový objekt umístěný na stránce potřebuje identifikátor GUID. I když je snadné generovat GUID z VB.Net, hledání způsobu, jak generovat GUID z VBA, bylo nepolapitelné. Všech 200 milionů uživatelů Office VBA musí dát špičku Michaelovi Kaplanovi ze společnosti Trigeminal Software. Michael se zdá být jediným člověkem na světě, který porušil kód, jak generovat GUID z VBA. S laskavostí sdílel tento kód se světem. Podívejte se na kompletní kód na jeho webových stránkách. Se souhlasem Michaela jsem zde zkopíroval pouze funkce potřebné k vygenerování nového identifikátoru GUID ve VBA. Vložte modul do projektu a vložte do něj následující 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

Přidání odkazu

Ve VBA přidejte odkaz na Knihovnu objektů OneNote 1.1 pomocí Nástroje - Odkazy. To vám umožní deklarovat nový objekt CSimpleImporter a poté použít metody .Import a .NavigateToPage na objekt.

Případová studie

Tento sešit aplikace Excel obsahuje systém denních zpráv. Pro každý obchod v místním řetězci obchodů existuje jeden list. Každá stránka obsahuje tabulku zobrazující denní tržby a graf ukazující pokrok směrem k měsíčnímu cíli.

Kód VBA přidá novou sekci nazvanou DailySales. Pro každý obchod bude přidána jedna nová stránka. Graf z listu se exportuje jako soubor GIF a importuje se do OneNotu. Data z listu se do OneNotu přidají jako sloupec HTML.

Denní prodej

Následující kód se používá v aplikaci 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.

Zajímavé články...