Χρήση του Excel VBA για προώθηση περιεχομένου στο OneNote - Άρθρα TechTV

Τον Αύγουστο, η Microsoft κυκλοφόρησε την έκδοση SP1 του OneNote. Αυτή είναι μια απαραίτητη αναβάθμιση. Πρόσθεσαν πολλές απίστευτες δυνατότητες, συμπεριλαμβανομένης μιας διεπαφής προγραμματισμού εφαρμογών που επιτρέπει σε άλλες εφαρμογές να προωθούν δεδομένα στο OneNote.

Η Microsoft προσφέρει αρκετούς εξαιρετικούς ιστότοπους που θα σας διδάξουν πώς να χρησιμοποιήσετε το VB.Net για να μεταφέρετε δεδομένα στο OneNote. Όμως, επειδή αυτός είναι ο ιστότοπος, εσείς και εγώ και οι άλλοι 200 ​​εκατομμύρια χρήστες του Office ανησυχούμε περισσότερο για τον τρόπο προώθησης δεδομένων στο OneNote χρησιμοποιώντας το Office VBA. Είμαι στην ευχάριστη θέση να πω ότι αυτό μπορεί να γίνει. Αυτή η σελίδα θα σας καθοδηγήσει σε όλα όσα χρειάζεστε για να το ολοκληρώσετε.

Θα υποθέσω ότι είστε μέτρια εξοικειωμένοι με το VBA. Εάν δεν είστε, συνιστώ ανεπιφύλακτα το VBA & Macros για το Microsoft Excel, το βιβλίο που έχει σχεδιαστεί για να μεταφέρει κάποιον στην καμπύλη εκμάθησης VBA.

ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ

Μπορείτε να στείλετε δεδομένα στο OneNote μορφοποιώντας τα δεδομένα ως δεδομένα XML. Το XML είναι μια αρκετά νέα ιδέα. Είναι σαν HTML. Σκεφτείτε το ως αρχείο CSV για στεροειδή. Μπορείτε να διαβάσετε την Εισαγωγή μου στο XML.

Βασικά, το πρόγραμμα VBA πρέπει να συντάξει ένα αρχείο XML και, στη συνέχεια, να μεταβιβάσει το περιεχόμενο του αρχείου XML στο OneNote χρησιμοποιώντας τη μέθοδο .Import. Το αρχείο XML πρέπει να περιέχει αυτά τα στοιχεία:

  • Ένα στοιχείο EnsurePage για κάθε σελίδα στην οποία θέλετε να γράψετε. Εάν η σελίδα δεν υπάρχει, το OneNote θα δημιουργήσει τη σελίδα για εσάς. Θεωρητικά, υποτίθεται ότι έχετε τον έλεγχο και τοποθετείτε τη σελίδα μετά από μια συγκεκριμένη υπάρχουσα σελίδα. Ωστόσο, στην πράξη, αυτό δεν φαίνεται να λειτουργεί.
  • Ένα στοιχείο PlaceObject για κάθε στοιχείο που θέλετε να προσθέσετε στη σελίδα. Καθορίζετε την τοποθεσία X & Y για το αντικείμενο και την πηγή του αντικειμένου. Ένα στοιχείο μπορεί να είναι εικόνα, αντικείμενο μελανιού ή κείμενο σε μορφή HTML. Θα νομίζατε ότι αφού το OneNote διαβάζει από HTML, θα μπορούσατε πραγματικά να περάσετε έναν πίνακα με ετικέτες TR και TD, αλλά αυτό δεν λειτουργεί. Περιορίζεστε στη διαβίβαση κειμένου με ετικέτες BR και P για να προσθέσετε τροφοδοσίες γραμμής. Οι ετικέτες UL & LI φαίνεται να λειτουργούν. Οι ετικέτες γραμματοσειράς λειτουργούν.

Το Gotcha

Για να ενημερώσετε μια υπάρχουσα σελίδα, πρέπει να γνωρίζετε το Globally Unique Identifier (GUID) για αυτήν τη σελίδα. Δεν φαίνεται να υπάρχει τρόπος να βρείτε το GUID για μια υπάρχουσα σελίδα στο OneNote. Αυτό σημαίνει ότι μπορείτε να ενημερώσετε ή να διαγράψετε στοιχεία σε μια υπάρχουσα σελίδα μόνο εάν δημιουργήσατε τη σελίδα μέσω προγραμματισμού και έχετε αποθηκεύσει το GUID που χρησιμοποιήθηκε για τη δημιουργία αυτής της σελίδας στο βιβλίο εργασίας σας. Το παρακάτω παράδειγμα χρησιμοποιεί μια εκτός δρόμου θέση στο φύλλο εργασίας για να αποθηκεύσει το GUID για τη σελίδα, τον πίνακα δεδομένων και το γράφημα.

ΟΔΗΓΙΕΣ

Κάθε νέα σελίδα στο OneNote χρειάζεται ένα GUID. Κάθε νέο αντικείμενο που τοποθετείται σε μια σελίδα χρειάζεται ένα GUID. Αν και είναι εύκολο να δημιουργήσετε GUID από το VB.Net, η εύρεση ενός τρόπου δημιουργίας GUID από το VBA ήταν αόριστη. Και οι 200 ​​εκατομμύρια χρήστες του Office VBA πρέπει να δώσουν μια συμβουλή στο Michael Kaplan του Trigeminal Software Ο Μάικλ φαίνεται να είναι ο μόνος τύπος στον κόσμο που έσπασε τον κώδικα για το πώς να δημιουργήσει ένα GUID από το VBA. Έχει μοιραστεί ευγενικά αυτόν τον κώδικα με τον κόσμο. Ελέγξτε τον πλήρη κώδικα στον ιστότοπό του. Με την άδεια του Michael, έχω αντιγράψει μόνο τις λειτουργίες που απαιτούνται για τη δημιουργία ενός νέου GUID στο VBA εδώ. Εισαγάγετε μια ενότητα στο έργο σας και συμπεριλάβετε τον ακόλουθο κώδικα σε αυτήν την ενότητα.

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

Προσθήκη αναφοράς

Στο VBA, χρησιμοποιήστε Εργαλεία - Αναφορές για να προσθέσετε μια αναφορά στη βιβλιοθήκη αντικειμένων του OneNote 1.1. Αυτό θα σας επιτρέψει να δηλώσετε ένα νέο αντικείμενο CSimpleImporter και στη συνέχεια να χρησιμοποιήσετε τις μεθόδους .Import και .NavigateToPage στο αντικείμενο.

Μελέτη περίπτωσης

Αυτό το βιβλίο εργασίας του Excel περιέχει ένα καθημερινό σύστημα αναφοράς. Υπάρχει ένα φύλλο εργασίας για κάθε κατάστημα σε μια τοπική αλυσίδα καταστημάτων. Κάθε σελίδα περιέχει έναν πίνακα που δείχνει τις καθημερινές πωλήσεις και ένα γράφημα που δείχνει την πρόοδο προς τον μηνιαίο στόχο.

Ο κώδικας VBA θα προσθέσει μια νέα ενότητα που ονομάζεται DailySales. Μία νέα σελίδα θα προστεθεί για κάθε κατάστημα. Το γράφημα από το φύλλο εργασίας εξάγεται ως αρχείο GIF και εισάγεται στο OneNote. Τα δεδομένα από το φύλλο εργασίας προστίθενται στο OneNote ως στήλη HTML.

Ημερήσιες πωλήσεις

Ο ακόλουθος κωδικός χρησιμοποιείται στο 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.

ενδιαφέροντα άρθρα...