Sisällön siirtäminen OneNoteen Excel VBA: n avulla - TechTV-artikkelit

Elokuussa Microsoft julkaisi OneNoten SP1-version. Tämä on pakollinen päivitys. He lisäsivät monia uskomattomia ominaisuuksia, mukaan lukien sovellusohjelmointirajapinnan, jonka avulla muut sovellukset voivat siirtää tietoja OneNoteen.

Microsoft tarjoaa useita erinomaisia ​​verkkosivustoja, jotka opettavat käyttämään VB.Netiä tietojen siirtämiseksi OneNoteen. Mutta koska tämä on sivusto, sinä ja minä ja muut 200 miljoonaa Office-käyttäjää olemme eniten huolissamme siitä, kuinka tietoja voidaan siirtää OneNoteen Office VBA: n avulla. Olen iloinen voidessani sanoa, että tämä voidaan tehdä. Tämä sivu opastaa sinut läpi kaiken, mitä tarvitset sen tekemiseen.

Oletan, että tunnet kohtuullisen hyvin VBA: n. Jos et ole, suosittelen VBA ja makrot Microsoft Excelille, kirja, joka on suunniteltu viemään joku ylös VBA-oppimiskäyrälle.

Yleiskatsaus

Voit lähettää tietoja OneNotelle muotoilemalla tiedot XML-tiedoiksi. XML on melko uusi käsite. Se on eräänlainen kuin HTML. Ajattele sitä CSV-tiedostona steroideista. Voit lukea Johdatus XML: ään.

Pohjimmiltaan VBA-ohjelmasi on kirjoitettava XML-tiedosto ja siirrettävä sitten XML-tiedoston sisältö OneNotelle .Import-menetelmällä. XML-tiedoston on sisällettävä seuraavat elementit:

  • EnsurePage-elementti jokaiselle sivulle, jolle haluat kirjoittaa. Jos sivua ei ole, OneNote luo sivun sinulle. Teoriassa oletettavasti sinulla on hallinta ja sijoita sivu tietyn olemassa olevan sivun jälkeen. Käytännössä tämä ei kuitenkaan näytä toimivan.
  • PlaceObject-elementti jokaiselle kohteelle, jonka haluat lisätä sivulle. Määrität alkion X & Y-sijainnin ja kohteen lähteen. Kohde voi olla joko kuva, musteobjekti tai teksti HTML-muodossa. Luulisi, että koska OneNote lukee HTML: stä, voit todella siirtää taulukon, jossa on TR- ja TD-tunnisteet, mutta tämä ei toimi. Voit vain siirtää tekstiä BR- ja P-tunnisteilla rivinsyötteiden lisäämiseksi. UL- ja LI-tunnisteet näyttävät toimivan. Kirjasintunnisteet toimivat.

Gotcha

Olemassa olevan sivun päivittämiseksi sinun on tiedettävä kyseisen sivun yleinen yksilöllinen tunniste (GUID). Vaikuttaa siltä, ​​ettei ole tapaa etsiä olemassa olevan sivun GUID-tunnusta OneNotesta. Tämä tarkoittaa, että voit päivittää tai poistaa olemassa olevan sivun kohteita vain, jos olet luonut sivun ohjelmallisesti ja olet tallentanut kyseisen sivun luomiseen käytetyn GUID-tunnuksen työkirjaasi. Alla oleva esimerkki käyttää laskentataulukon poissaolevaa paikkaa sivun, tietotaulukon ja kaavion GUID-tunnuksen tallentamiseen.

GUID: t

Jokainen uusi sivu OneNotessa tarvitsee GUID-tunnuksen. Jokainen uusi sivulle sijoitettu objekti tarvitsee GUID: n. Vaikka GUID-tunnusten luominen VB.Net-verkosta on helppoa, on ollut vaikea löytää tapaa luoda GUID-tunnuksia VBA: sta. Kaikkien 200 miljoonan Office VBA -käyttäjän on annettava kärki Trigeminal Software -yrityksen Michael Kaplanille. Michael näyttää olevan ainoa kaveri maailmassa, joka rikkoo koodin GUID: n luomisesta VBA: sta. Hän on jakanut tämän koodin ystävällisesti maailmalle. Katso täydellinen koodi hänen verkkosivustoltaan. Michaelin luvalla olen kopioinut vain toiminnot, joita tarvitaan uuden GUID: n luomiseen VBA: ssa. Lisää moduuli projektiisi ja lisää seuraava koodi siihen.

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

Viitteen lisääminen

Lisää VBA: ssa VBA-työkalut viittauksella OneNote 1.1 -objektikirjastoon. Tämän avulla voit ilmoittaa uuden CSimpleImporter-objektin ja käyttää sitten objektissa .Import- ja .NavigateToPage-menetelmiä.

Tapaustutkimus

Tämä Excel-työkirja sisältää päivittäisen raportointijärjestelmän. Paikallisessa kauppaketjussa on yksi laskentataulukko kutakin kauppaa varten. Jokaisella sivulla on taulukko, joka näyttää päivittäisen myynnin, ja kaavio, joka osoittaa edistymisen kuukausittaisen tavoitteen saavuttamisessa.

VBA-koodi lisää uuden osan nimeltä DailySales. Yksi uusi sivu lisätään kutakin kauppaa kohti. Taulukon kaavio viedään GIF-tiedostona ja tuodaan OneNoteen. Taulukon tiedot lisätään OneNoteen HTML-sarakkeena.

Päivittäinen myynti

Seuraavaa koodia käytetään Excelissä.

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.

Mielenkiintoisia artikkeleita...