Az Excel VBA használata a tartalom OneNote-ra tolásához - TechTV cikkek

Augusztusban a Microsoft kiadta a OneNote SP1 változatát. Ez egy kötelező frissítés. Számos hihetetlen funkcióval bővítették az alkalmazási programozási felületet, amely lehetővé teszi más alkalmazások számára, hogy adatokat továbbítsanak a OneNote-ba.

A Microsoft számos kiváló weboldalt kínál, amelyek megtanítják Önt a VB.Net használatára az adatok OneNote-ba történő tolásához. De mivel ez a webhely, Ön és én, valamint a többi 200 millió Office-felhasználó aggódunk a legjobban azzal kapcsolatban, hogyan lehet adatokat továbbítani a OneNote-ba az Office VBA használatával. Örömmel mondhatom, hogy ez megvalósítható. Ez az oldal végigvezeti mindazt, ami a megvalósításához szükséges.

Feltételezem, hogy Ön mérsékelten ismeri a VBA-t. Ha nem, akkor nagyon ajánlom a VBA és makrók használatát a Microsoft Excel programhoz, amely azt a könyvet tervezte, hogy valaki felemelje a VBA tanulási görbét.

Áttekintés

Az adatokat XML-formátumban formázva küldheti el a OneNote-nak. Az XML egy meglehetősen új fogalom. Olyan, mint a HTML. Gondoljon CSV fájlként a szteroidokra. Elolvashatja az XML bevezetésemet.

Alapvetően a VBA programjának ki kell írnia egy XML fájlt, majd az .Import módszerrel továbbítania kell az XML fájl tartalmát a OneNote-hoz. Az XML fájlnak a következő elemeket kell tartalmaznia:

  • EnsurePage elem minden olyan oldalhoz, amelyhez írni akar. Ha az oldal nem létezik, a OneNote létrehozza az oldalt az Ön számára. Elméletileg állítólag Önnek van irányítása és az oldalt egy adott létező oldal után kell elhelyeznie. Úgy tűnik azonban, hogy a gyakorlatban ez nem működik.
  • A PlaceObject elem minden elemhez, amelyet hozzá kíván adni az oldalhoz. Megadja az elem X & Y helyét és az elem forrását. Az elem lehet kép, Ink objektum vagy HTML formátumú szöveg. Azt gondolhatja, hogy mivel a OneNote HTML-ről olvas, valóban átadhat egy táblázatot TR és TD címkékkel, de ez nem működik. Csak a BR és P címkékkel ellátott szöveg továbbítására korlátozódhat a sorcsatornák hozzáadásához. Az UL & LI címkék működőképesnek tűnnek. A betűtípusok működnek.

A Gotcha

Meglévő oldal frissítéséhez ismernie kell az adott oldal globálisan egyedi azonosítóját (GUID). Úgy tűnik, hogy nem lehet megtalálni a meglévő oldal GUID azonosítóját a OneNote-ban. Ez azt jelenti, hogy csak akkor frissíthet vagy törölhet egy meglévő oldalt, ha programszerűen létrehozta az oldalt, és az oldal létrehozásához használt GUID-t elmentette a munkafüzetbe. Az alábbi példa a munkalapon kívüli helyet használ az oldal, az adattábla és a diagram GUID azonosítójának mentésére.

GUID-ok

A OneNote minden új oldalához GUID szükséges. Az oldalon elhelyezett minden új objektumnak szüksége van GUID-re. Bár könnyen generálható GUID a VB.Net-ből, a GUID generálásának módja a VBA-ból megfoghatatlan volt. Mind a 200 millió Office VBA felhasználónak meg kell adnia a felső határt Michael Kaplannak, a Trigeminal Software-től. Úgy tűnik, hogy Michael az egyetlen srác a világon, aki megtörte a GUID generálásának kódját a VBA-ból. Kegyesen megosztotta ezt a kódot a világgal. Nézze meg a teljes kódot a weboldalán. Michael engedélyével csak azokat a funkciókat másoltam le, amelyek szükségesek egy új GUID létrehozásához a VBA-ban. Helyezzen be egy modult a projektjébe, és foglalja bele a következő kódot a modulba.

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

Referencia hozzáadása

A VBA-ban az Eszközök - Hivatkozások használatával adhat hozzá hivatkozást a OneNote 1.1 objektumtárhoz. Ez lehetővé teszi egy új CSimpleImporter objektum bejelentését, majd az .Import és .NavigateToPage metódusok használatát az objektumon.

Esettanulmány

Ez az Excel munkafüzet napi jelentési rendszert tartalmaz. A helyi üzletlánc minden üzletéhez egy-egy munkalap tartozik. Minden oldal tartalmaz egy táblázatot, amely a napi eladásokat mutatja, és egy diagramot, amely bemutatja a havi cél elérésének előrehaladását.

A VBA kód egy új szakaszt ad hozzá DailySales néven. Minden üzlethez egy új oldal kerül. A munkalapon található diagram GIF fájlként kerül exportálásra és importálva a OneNote-ba. A munkalap adatai HTML oszlopként kerülnek a OneNote-ba.

Napi értékesítés

A következő kódot használja az 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.

érdekes cikkek...