Brug af Excel VBA til at skubbe indhold til OneNote - TechTV-artikler

I august udgav Microsoft version SP1 af OneNote. Dette er en must-have opgradering. De tilføjede mange utrolige funktioner, inkluderer en applikationsprogrammeringsgrænseflade, der giver andre applikationer mulighed for at skubbe data til OneNote.

Microsoft tilbyder flere fremragende websteder, der lærer dig, hvordan du bruger VB.Net for at skubbe data ind i OneNote. Men da dette er stedet, er du og jeg og de andre 200 millioner Office-brugere mest bekymrede over, hvordan man skubber data til OneNote ved hjælp af Office VBA. Jeg er glad for at kunne sige, at dette KAN gøres. Denne side vil lede dig gennem alt hvad du behøver for at få det gjort.

Jeg antager, at du er moderat fortrolig med VBA. Hvis du ikke er det, anbefaler jeg stærkt VBA og makroer til Microsoft Excel, bogen designet til at tage nogen op i VBA-læringskurven.

Oversigt

Du kan sende data til OneNote ved at formatere dataene som XML-data. XML er et ret nyt koncept. Det er som HTML. Tænk på det som en CSV-fil på steroider. Du kan læse min introduktion til XML.

Grundlæggende skal dit VBA-program skrive en XML-fil ud og derefter sende indholdet af XML-filen til OneNote ved hjælp af .Import-metoden. XML-filen skal indeholde disse elementer:

  • Et EnsurePage-element for hver side, som du vil skrive til. Hvis siden ikke findes, opretter OneNote siden for dig. I teorien skal du have kontrol og placere siden efter en bestemt eksisterende side. I praksis ser det imidlertid ikke ud til at fungere.
  • Et PlaceObject-element for hvert element, som du vil føje til siden. Du angiver X & Y-placeringen for varen og kilden for varen. Et element kan enten være et billede, et blækobjekt eller tekst i HTML-format. Du tror, ​​at da OneNote læser fra HTML, kan du faktisk videregive en tabel med TR- og TD-tags, men dette fungerer ikke. Du er begrænset til at sende tekst med BR- og P-tags for at tilføje linefeeds. UL & LI tags, der ser ud til at virke. Font tags fungerer.

Gotcha

For at opdatere en eksisterende side skal du kende den globalt unikke identifikator (GUID) for den side. Der ser ikke ud til at være en måde at finde GUID til en eksisterende side i OneNote. Dette betyder, at du kun kan opdatere eller slette elementer på en eksisterende side, hvis du programmatisk oprettede siden og har gemt GUID'en, der blev brugt til at oprette siden i din projektmappe. Eksemplet nedenfor bruger et sted, der ikke er tilfældet på regnearket til at gemme GUID til siden, datatabellen og diagrammet.

GUID'er

Hver ny side i OneNote har brug for en GUID. Hvert nyt objekt, der placeres på en side, har brug for en GUID. Mens det er let at generere GUID'er fra VB.Net, har det været vanskeligt at finde en måde at generere GUID'er fra VBA på. Alle 200 millioner Office VBA-brugere har brug for at give et tip af loftet til Michael Kaplan fra Trigeminal Software. Michael ser ud til at være den eneste fyr i verden, der bryder koden om, hvordan man genererer en GUID fra VBA. Han har nådigt delt denne kode med verden. Tjek den komplette kode på hans hjemmeside. Med Michaels tilladelse har jeg kun kopieret de nødvendige funktioner til at generere en ny GUID i VBA her. Indsæt et modul i dit projekt, og medtag følgende kode i det modul.

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

Tilføjelse af en reference

I VBA skal du bruge Værktøjer - Referencer til at tilføje en reference til OneNote 1.1-objektbiblioteket. Dette giver dig mulighed for at erklære et nyt CSimpleImporter-objekt og derefter bruge .Import- og .NavigateToPage-metoderne på objektet.

Casestudie

Denne Excel-projektmappe indeholder et dagligt rapporteringssystem. Der er et regneark for hver butik i en lokal butikskæde. Hver side indeholder en tabel, der viser det daglige salg og et diagram, der viser fremskridt hen imod det månedlige mål.

VBA-koden tilføjer et nyt afsnit kaldet DailySales. En ny side tilføjes for hver butik. Diagrammet fra regnearket eksporteres som en GIF-fil og importeres til OneNote. Dataene fra regnearket føjes til OneNote som en HTML-kolonne.

Dagligt salg

Følgende kode bruges i 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 artikler...