„Excel VBA“ naudojimas turinio perkėlimui į „OneNote“ - „TechTV“ straipsniai

Rugpjūtį „Microsoft“ išleido „OneNote“ SP1 versiją. Tai yra būtinas atnaujinimas. Jie pridėjo daug neįtikėtinų funkcijų, įskaitant programų programavimo sąsają, leidžiančią kitoms programoms perkelti duomenis į „OneNote“.

„Microsoft“ siūlo keletą puikių svetainių, kurios išmokys jus naudoti „VB.Net“, norėdami perkelti duomenis į „OneNote“. Kadangi tai yra svetainė, jūs, aš ir kiti 200 milijonų „Office“ vartotojų labiausiai rūpinamės, kaip perkelti duomenis į „OneNote“ naudojant „Office VBA“. Man malonu pasakyti, kad tai GALI būti padaryta. Šiame puslapyje rasite viską, ko jums reikia, kad tai atliktumėte.

Aš manysiu, kad jūs esate vidutiniškai susipažinęs su VBA. Jei ne, labai rekomenduoju VBA ir makrokomandas „Microsoft Excel“ - knygai, skirtai pakelti asmenį į VBA mokymosi kreivę.

Apžvalga

Duomenis galite siųsti į „OneNote“, formatuodami duomenis kaip XML duomenis. XML yra gana nauja sąvoka. Tai tarsi HTML. Pagalvokite apie tai kaip apie CSV failą apie steroidus. Galite perskaityti mano XML įvadą.

Iš esmės jūsų VBA programa turi išrašyti XML failą, tada perduoti XML failo turinį „OneNote“ naudodama .Import metodą. XML faile turi būti šie elementai:

  • „EnsurePage“ elementas kiekvienam puslapiui, į kurį norite rašyti. Jei puslapio nėra, „OneNote“ sukurs puslapį jums. Teoriškai turėtumėte kontroliuoti ir įdėti puslapį po konkretaus esamo puslapio. Tačiau praktiškai tai neatrodo veiksminga.
  • „PlaceObject“ elementas kiekvienam elementui, kurį norite pridėti prie puslapio. Nurodote elemento X ir Y vietą ir elemento šaltinį. Elementas gali būti vaizdas, rašalo objektas arba HTML formato tekstas. Galėtumėte pagalvoti, kad kadangi „OneNote“ skaito iš HTML, iš tikrųjų galite perduoti lentelę su TR ir TD žymomis, tačiau tai neveikia. Norėdami pridėti eilučių srautus, galite perduoti tekstą tik su BR ir P žymomis. UL ir LI žymos gali veikti. Šrifto žymos veikia.

Gotča

Norėdami atnaujinti esamą puslapį, turite žinoti to puslapio visuotinį unikalų identifikatorių (GUID). Panašu, kad nėra būdo rasti „OneNote“ esamo puslapio GUID. Tai reiškia, kad esamo puslapio elementus galite atnaujinti arba ištrinti tik tuo atveju, jei programiškai sukūrėte puslapį ir savo darbaknygėje išsaugojote GUID, naudojamą tam puslapiui kurti. Toliau pateiktame pavyzdyje darbalapyje naudojama ne vieta, kad būtų išsaugotas puslapio, duomenų lentelės ir diagramos GUID.

GUID

Kiekvienam naujam „OneNote“ puslapiui reikia GUID. Kiekvienam naujam objektui, esančiam puslapyje, reikia GUID. Nors lengva generuoti GUID iš VB.Net, rasti būdą, kaip generuoti GUID iš VBA, buvo nesuprantama. Visi 200 milijonų „Office VBA“ vartotojų turi suteikti „Trigeminal“ programinės įrangos Michaelui Kaplanui ribą. Panašu, kad Maiklas yra vienintelis vaikinas pasaulyje, sulaužęs kodą, kaip sugeneruoti GUID iš VBA. Jis maloningai pasidalijo šiuo kodu su pasauliu. Patikrinkite visą kodą jo svetainėje. Gavęs Michaelo leidimą, čia nukopijavau tik tas funkcijas, kurių reikia norint sukurti naują GUID VBA. Įdėkite modulį į savo projektą ir įtraukite į šį modulį šį kodą.

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

Nuorodos pridėjimas

VBA naudokite įrankius - nuorodos, kad pridėtumėte nuorodą į „OneNote 1.1“ objektų biblioteką. Tai leis jums deklaruoti naują objektą „CSimpleImporter“ ir tada objekte naudoti .Import ir .NavigateToPage metodus.

Atvejo analizė

Šioje „Excel“ darbaknygėje yra kasdieninė ataskaitų teikimo sistema. Vietiniame parduotuvių tinkle kiekvienai parduotuvei yra po vieną darbalapį. Kiekviename puslapyje yra lentelė, rodanti dienos pardavimus, ir diagrama, rodanti pažangą siekiant mėnesio tikslo.

VBA kodas pridės naują skyrių, vadinamą „DailySales“. Kiekvienai parduotuvei bus pridėtas vienas naujas puslapis. Diagrama iš darbalapio eksportuojama kaip GIF failas ir importuojama į „OneNote“. Duomenys iš darbalapio pridedami prie „OneNote“ kaip HTML stulpelis.

Dienos pardavimas

Šis „Excel“ naudojamas kodas.

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.

Įdomios straipsniai...