Excel VBA gebruiken om inhoud naar OneNote te pushen - TechTV-artikelen

In augustus heeft Microsoft versie SP1 van OneNote uitgebracht. Dit is een upgrade die je moet hebben. Ze hebben veel ongelooflijke functies toegevoegd, waaronder een applicatie-programmeerinterface waarmee andere applicaties gegevens naar OneNote kunnen pushen.

Microsoft biedt verschillende uitstekende websites die u leren hoe u VB.Net kunt gebruiken om gegevens naar OneNote te pushen. Maar aangezien dit de site is, maken jij en ik en de andere 200 miljoen Office-gebruikers zich het meest zorgen over hoe je gegevens naar OneNote kunt pushen met Office VBA. Ik ben blij te kunnen zeggen dat dit kan worden gedaan. Op deze pagina leest u alles wat u nodig heeft om het voor elkaar te krijgen.

Ik ga er vanuit dat je redelijk bekend bent met VBA. Als je dat niet bent, raad ik VBA & Macros voor Microsoft Excel ten zeerste aan, het boek dat is ontworpen om iemand de VBA-leercurve op te leiden.

Overzicht

U kunt gegevens naar OneNote verzenden door de gegevens op te maken als XML-gegevens. XML is een vrij nieuw concept. Het lijkt een beetje op HTML. Beschouw het als een CSV-bestand op steroïden. U kunt mijn inleiding tot XML lezen.

Kortom, uw VBA-programma moet een XML-bestand wegschrijven en vervolgens de inhoud van het XML-bestand doorgeven aan OneNote met behulp van de .Import-methode. Het XML-bestand moet deze elementen bevatten:

  • Een VerzekerPage-element voor elke pagina waarnaar u wilt schrijven. Als de pagina niet bestaat, maakt OneNote de pagina voor u. In theorie zou je de controle moeten hebben en de pagina achter een specifieke bestaande pagina plaatsen. In de praktijk blijkt dit echter niet te werken.
  • Een PlaceObject-element voor elk item dat u aan de pagina wilt toevoegen. U specificeert de X & Y-locatie voor het item en de bron van het item. Een item kan een afbeelding, een Ink-object of tekst in HTML-indeling zijn. Je zou denken dat, aangezien OneNote uit HTML leest, je daadwerkelijk een tabel met TR- en TD-tags zou kunnen passeren, maar dit werkt niet. U bent beperkt tot het doorgeven van tekst met BR- en P-tags om linefeeds toe te voegen. UL- en LI-tags lijken te werken. Lettertypetags werken.

De Gotcha

Om een ​​bestaande pagina bij te werken, moet u de Globally Unique Identifier (GUID) voor die pagina kennen. Er lijkt geen manier te zijn om de GUID voor een bestaande pagina in OneNote te vinden. Dit betekent dat u alleen items op een bestaande pagina kunt bijwerken of verwijderen als u de pagina programmatisch hebt gemaakt en de GUID die is gebruikt om die pagina te maken, in uw werkmap hebt opgeslagen. Het onderstaande voorbeeld gebruikt een afgelegen plek op het werkblad om de GUID voor de pagina, de gegevenstabel en het diagram op te slaan.

GUID's

Elke nieuwe pagina in OneNote heeft een GUID nodig. Elk nieuw object dat op een pagina wordt geplaatst, heeft een GUID nodig. Hoewel het gemakkelijk is om GUID's te genereren vanuit VB.Net, was het moeilijk om een ​​manier te vinden om GUID's te genereren vanuit VBA. Alle 200 miljoen Office VBA-gebruikers moeten Michael Kaplan van Trigeminal Software een topje van de pet geven. Michael lijkt de enige man ter wereld te zijn die de code breekt voor het genereren van een GUID vanuit VBA. Hij heeft deze code op genadige wijze met de wereld gedeeld. Bekijk de volledige code op zijn website. Met Michael's toestemming heb ik hier alleen de functies gekopieerd die nodig zijn om een ​​nieuwe GUID in VBA te genereren. Voeg een module in uw project in en neem de volgende code op in die module.

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

Een referentie toevoegen

Gebruik in VBA Tools - References om een ​​verwijzing naar de OneNote 1.1-objectbibliotheek toe te voegen. Hiermee kunt u een nieuw CSimpleImporter-object declareren en vervolgens de .Import- en .NavigateToPage-methoden voor het object gebruiken.

Casestudy

Deze Excel-werkmap bevat een dagelijks rapportagesysteem. Er is één werkblad voor elke winkel in een plaatselijke winkelketen. Elke pagina bevat een tabel met de dagelijkse verkopen en een grafiek met de voortgang naar het maandelijkse doel.

De VBA-code voegt een nieuwe sectie toe met de naam DailySales. Voor elke winkel wordt een nieuwe pagina toegevoegd. De grafiek uit het werkblad wordt geëxporteerd als een GIF-bestand en geïmporteerd in OneNote. De gegevens van het werkblad worden als HTML-kolom aan OneNote toegevoegd.

Dagelijkse verkoop

De volgende code wordt gebruikt in 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.

Interessante artikelen...