Używanie Excel VBA do przesyłania treści do OneNote - artykuły TechTV

W sierpniu Microsoft wydał wersję SP1 programu OneNote. To obowiązkowa aktualizacja. Dodali wiele niesamowitych funkcji, w tym interfejs programowania aplikacji, który umożliwia innym aplikacjom przesyłanie danych do OneNote.

Firma Microsoft oferuje kilka doskonałych witryn internetowych, które nauczą Cię, jak używać VB.Net do przesyłania danych do programu OneNote. Ale ponieważ jest to witryna, Ty i ja oraz pozostałe 200 milionów użytkowników pakietu Office jesteście najbardziej zaniepokojeni sposobem przesyłania danych do programu OneNote za pomocą Office VBA. Cieszę się, że mogę to zrobić. Ta strona przeprowadzi Cię przez wszystko, czego potrzebujesz, aby to zrobić.

Zakładam, że znasz język VBA na średnim poziomie. Jeśli nie, bardzo polecam VBA i makra dla Microsoft Excel, książkę zaprojektowaną, aby pomóc komuś w nauce VBA.

Przegląd

Możesz wysyłać dane do programu OneNote, formatując je jako dane XML. XML to całkiem nowa koncepcja. To trochę jak HTML. Pomyśl o tym jak o pliku CSV dotyczącym sterydów. Możesz przeczytać moje Wprowadzenie do XML.

Zasadniczo program VBA musi wypisać plik XML, a następnie przekazać zawartość pliku XML do programu OneNote przy użyciu metody .Import. Plik XML musi zawierać następujące elementy:

  • Element RememberPage dla każdej strony, na której chcesz pisać. Jeśli strona nie istnieje, program OneNote utworzy ją za Ciebie. Teoretycznie powinieneś mieć kontrolę i umieścić stronę po określonej istniejącej stronie. Jednak w praktyce wydaje się, że to nie działa.
  • Element PlaceObject dla każdego elementu, który chcesz dodać do strony. Określ lokalizację X i Y dla elementu oraz źródło elementu. Elementem może być obraz, obiekt Ink lub tekst w formacie HTML. Można by pomyśleć, że skoro OneNote czyta z HTML, w rzeczywistości można przekazać tabelę ze znacznikami TR i TD, ale to nie działa. Jesteś ograniczony do przekazywania tekstu za pomocą znaczników BR i P, aby dodać wysunięcia wiersza. Tagi UL i LI wydają się działać. Tagi czcionek działają.

Gotcha

Aby zaktualizować istniejącą stronę, musisz znać unikalny identyfikator globalny (GUID) dla tej strony. Wygląda na to, że nie ma sposobu na znalezienie identyfikatora GUID dla istniejącej strony w programie OneNote. Oznacza to, że możesz aktualizować lub usuwać elementy na istniejącej stronie tylko wtedy, gdy programowo utworzyłeś stronę i zapisałeś identyfikator GUID użyty do utworzenia tej strony w skoroszycie. W poniższym przykładzie zastosowano miejsce na uboczu w arkuszu do zapisania identyfikatora GUID strony, tabeli danych i wykresu.

Identyfikatory GUID

Każda nowa strona w programie OneNote wymaga identyfikatora GUID. Każdy nowy obiekt umieszczony na stronie wymaga identyfikatora GUID. Chociaż generowanie identyfikatorów GUID z VB.Net jest łatwe, znalezienie sposobu na wygenerowanie identyfikatorów GUID z VBA było nieuchwytne. Wszystkich 200 milionów użytkowników Office VBA musi dać wskazówkę Michaelowi Kaplanowi z Trigeminal Software. Wydaje się, że Michael jest jedynym facetem na świecie, który złamał kod dotyczący generowania GUID z VBA. Łaskawie podzielił się tym kodem ze światem. Sprawdź cały kod na jego stronie internetowej. Za zgodą Michaela skopiowałem tutaj tylko funkcje potrzebne do wygenerowania nowego identyfikatora GUID w VBA. Wstaw moduł do projektu i dołącz następujący kod do tego modułu.

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

Dodawanie odniesienia

W języku VBA użyj Narzędzia - Referencje, aby dodać odwołanie do biblioteki obiektów programu OneNote 1.1. Umożliwi to zadeklarowanie nowego obiektu CSimpleImporter, a następnie użycie metod .Import i .NavigateToPage na obiekcie.

Studium przypadku

Ten skoroszyt programu Excel zawiera codzienny system raportowania. Dla każdego sklepu w lokalnej sieci sklepów istnieje jeden arkusz roboczy. Każda strona zawiera tabelę pokazującą dzienną sprzedaż oraz wykres przedstawiający postęp w realizacji celu miesięcznego.

Kod VBA doda nową sekcję o nazwie DailySales. Dla każdego sklepu zostanie dodana jedna nowa strona. Wykres z arkusza jest eksportowany jako plik GIF i importowany do programu OneNote. Dane z arkusza są dodawane do programu OneNote jako kolumna HTML.

Dzienna sprzedaż

Poniższy kod jest używany w programie 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.

Interesujące artykuły...