Excel VBA izmantošana satura pārsūtīšanai uz OneNote - TechTV raksti

Augustā Microsoft izlaida OneNote SP1 versiju. Šis ir obligāts jauninājums. Viņi pievienoja daudzas neticamas funkcijas, tostarp lietojumprogrammu saskarni, kas ļauj citām lietojumprogrammām virzīt datus uz OneNote.

Microsoft piedāvā vairākas izcilas vietnes, kas iemācīs jums izmantot VB.Net, lai datus ievietotu OneNote. Bet, tā kā šī ir vietne, jūs un mani un pārējos 200 miljonus Office lietotāju visvairāk uztrauc tas, kā datus nosūtīt uz OneNote, izmantojot Office VBA. Ar prieku varu teikt, ka to VAR izdarīt. Šī lapa iepazīstinās jūs ar visu nepieciešamo, lai to paveiktu.

Es pieņemu, ka jūs esat vidēji pazīstams ar VBA. Ja jūs tā neesat, es ļoti iesaku VBA un makro programmai Microsoft Excel - grāmatai, kas paredzēta, lai kādu paceltu VBA mācīšanās līknē.

Pārskats

Datus varat nosūtīt uz OneNote, formatējot datus kā XML datus. XML ir diezgan jauns jēdziens. Tas ir sava veida HTML. Padomājiet par to kā par steroīdu CSV failu. Jūs varat izlasīt manu ievadu XML.

Būtībā jūsu VBA programmai ir jāizraksta XML fails, pēc tam jānodod XML faila saturs OneNote, izmantojot metodi .Import. XML failā jābūt šādiem elementiem:

  • EnsurePage elements katrai lapai, kurai vēlaties rakstīt. Ja lapas nav, OneNote izveidos lapu jums. Teorētiski jums vajadzētu kontrolēt un ievietot lapu aiz konkrētas esošās lapas. Tomēr praksē tas, šķiet, nedarbojas.
  • PlaceObject elements katram objektam, kuru vēlaties pievienot lapai. Jūs norādāt vienuma X & Y atrašanās vietu un vienuma avotu. Vienums var būt gan attēls, gan tintes objekts, gan teksts HTML formātā. Jūs domājat, ka, tā kā OneNote lasa no HTML, jūs faktiski varētu nodot tabulu ar TR un TD tagiem, taču tas nedarbojas. Lai pievienotu rindiņu plūsmas, jūs varat pārsūtīt tekstu tikai ar BR un P tagiem. Lai UL un LI tagi darbotos. Fontu tagi darbojas.

Gotča

Lai atjauninātu esošu lapu, jums jāzina šīs lapas globālais unikālais identifikators (GUID). Šķiet, ka nav iespējas atrast GUID esošai lapai pakalpojumā OneNote. Tas nozīmē, ka esošās lapas vienumus var atjaunināt vai izdzēst tikai tad, ja esat programmatiski izveidojis lapu un darbgrāmatā esat saglabājis šīs lapas izveidošanai izmantoto GUID. Lai saglabātu lapas, datu tabulas un diagrammas GUID, darblapā zemāk esošajā piemērā tiek izmantota nevieta vieta darblapā.

GUID

Katrai jaunai OneNote lapai ir nepieciešams GUID. Katram jaunam objektam, kas ievietots lapā, ir nepieciešams GUID. Lai gan ir viegli ģenerēt GUID no VB.Net, ir grūti atrast veidu, kā ģenerēt GUID no VBA. Visiem 200 miljoniem Office VBA lietotāju ir jāpiešķir vāciņa gals Maiklam Kaplanam no Trigeminal Software. Maikls, šķiet, ir vienīgais puisis pasaulē, kurš pārkāpa kodu, kā ģenerēt GUID no VBA. Viņš ir laipni dalījies ar šo kodu ar pasauli. Pārbaudiet pilnu kodu viņa vietnē. Ar Maikla atļauju šeit esmu nokopējis tikai funkcijas, kas nepieciešamas, lai VBA izveidotu jaunu GUID. Ievietojiet projektā moduli un iekļaujiet šajā modulī šādu kodu.

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

Atsauces pievienošana

VBA izmantojiet Rīki - Atsauces, lai pievienotu atsauci uz OneNote 1.1 objektu bibliotēku. Tas ļaus jums deklarēt jaunu CSimpleImporter objektu un pēc tam objektā izmantot metodes .Import un .NavigateToPage.

Gadījuma izpēte

Šajā Excel darbgrāmatā ir ikdienas pārskatu sistēma. Vietējā veikalu tīklā katram veikalam ir viena darblapa. Katrā lappusē ir tabula, kurā parādīti ikdienas pārdošanas apjomi, un diagramma, kas parāda progresu mēneša mērķa sasniegšanā.

VBA kods pievienos jaunu sadaļu ar nosaukumu DailySales. Katram veikalam tiks pievienota viena jauna lapa. Diagramma no darblapas tiek eksportēta kā GIF fails un importēta uz OneNote. Dati no darblapas tiek pievienoti OneNote kā HTML kolonna.

Dienas pārdošanas apjomi

Programmā Excel tiek izmantots šāds kods.

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.

Interesanti raksti...