Exceli VBA kasutamine sisu OneNote'i tõukamiseks - TechTV artiklid

Augustis avaldas Microsoft OneNote'i versiooni SP1. See on kohustuslik uuendus. Nad lisasid palju uskumatuid funktsioone, sealhulgas rakenduse programmeerimisliidest, mis võimaldab teistel rakendustel andmeid OneNote'i edastada.

Microsoft pakub mitmeid suurepäraseid veebisaite, mis õpetavad VB.Neti kasutamist andmete OneNote'i sisestamiseks. Kuid kuna see on see sait, olete teie ja mina ning ülejäänud 200 miljonit Office'i kasutajat kõige rohkem mures selle pärast, kuidas Office VBA abil andmeid OneNote'i edastada. Mul on hea meel öelda, et seda saab teha. See leht tutvustab teid kõigest, mida vajate selle saavutamiseks.

Eeldan, et olete VBA-ga mõõdukalt tuttav. Kui te seda ei tee, soovitan tungivalt VBA ja makrosid Microsoft Exceli jaoks - see raamat on mõeldud selleks, et keegi VBA õppimiskõverale viia.

Ülevaade

Andmeid saate OneNote'i saata, vormindades andmed XML-andmetena. XML on üsna uus mõiste. See on umbes nagu HTML. Mõelge sellele kui steroidide CSV-failile. Võite lugeda minu sissejuhatust XML-i.

Põhimõtteliselt peab teie VBA-programm välja kirjutama XML-faili, seejärel edastama XML-faili sisu OneNote'ile meetodi .Import abil. XML-fail peab sisaldama neid elemente:

  • Element EnsurePage iga lehe jaoks, millele soovite kirjutada. Kui lehte pole olemas, loob OneNote selle lehe teie jaoks. Teoreetiliselt peaks teil olema kontroll ja leht asetage konkreetse olemasoleva lehe järele. Kuid praktikas ei näi see toimivat.
  • Element PlaceObject iga üksuse jaoks, mille soovite lehele lisada. Määrate üksuse X & Y asukoha ja üksuse allika. Üksus võib olla pilt, Ink-objekt või HTML-vormingus tekst. Võiksite arvata, et kuna OneNote loeb HTML-ist, võite tegelikult edastada TR- ja TD-siltidega tabeli, kuid see ei toimi. Ridevoogude lisamiseks piirdute BR ja P siltidega teksti edastamisega. UL & LI sildid töötavad. Fonditähised töötavad küll.

Gotcha

Olemasoleva lehe värskendamiseks peate teadma selle lehe globaalselt ainulaadset identifikaatorit (GUID). Tundub, et pole võimalust leida OneNote'is olemasoleva lehe GUID. See tähendab, et olemasoleva lehe üksusi saate värskendada või kustutada ainult siis, kui olete lehe programmiliselt loonud ja selle lehe loomiseks kasutatud GUID-i töövihikusse salvestanud. Allpool olevas näites kasutatakse lehe, andmetabeli ja diagrammi GUID-i salvestamiseks töölehel väljapoole jäävat kohta.

GUID-id

Iga uus OneNote'i leht vajab GUID-i. Iga uus lehele paigutatud objekt vajab GUID-i. Kuigi VB.Netist on lihtne GUID-sid genereerida, on VBA-st GUID-ide loomiseks viisi leidmine olnud raskesti mõistetav. Kõik 200 miljonit Office VBA kasutajat peavad Trigeminal Tarkvara Michael Kaplanile andma ülempiiri. Michael näib olevat ainus kutt maailmas, kes rikkus koodi, kuidas VBA-st GUID luua. Ta on seda koodi lahkelt maailmaga jaganud. Tutvuge tema veebisaidi täieliku koodiga. Michaeli loal olen siia kopeerinud VBA-s uue GUID-i loomiseks vajalikud funktsioonid. Sisestage oma projekti moodul ja lisage sellesse moodulisse järgmine kood.

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

Viite lisamine

VBA-s lisage OneNote 1.1 objektide teeki viite lisamiseks Tööriistad - Viited. See võimaldab teil deklareerida uue objekti CSimpleImporter ja seejärel kasutada objektil meetodeid .Import ja .NavigateToPage.

Juhtumiuuring

See Exceli töövihik sisaldab igapäevast aruandlussüsteemi. Kohalikus kauplusteketis on iga poe jaoks üks tööleht. Igal lehel on tabel, mis näitab igapäevast müüki, ja diagramm, mis näitab igakuise eesmärgi saavutamist.

VBA kood lisab uue jaotise DailySales. Iga poe kohta lisatakse üks uus leht. Töölehe diagramm eksporditakse GIF-failina ja imporditakse OneNote'i. Töölehe andmed lisatakse OneNote'i HTML-veeruna.

Igapäevane müük

Excelis kasutatakse järgmist koodi.

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.

Huvitavad Artiklid...