Використання Excel VBA для надсилання вмісту в OneNote - Статті TechTV

У серпні Microsoft випустила версію SP1 OneNote. Це обов’язкове оновлення. Вони додали багато неймовірних функцій, включають інтерфейс прикладного програмування, який дозволяє іншим програмам надсилати дані до OneNote.

Корпорація Майкрософт пропонує кілька чудових веб-сайтів, які навчать вас користуватися VB.Net для переміщення даних у OneNote. Але оскільки це веб-сайт, ми з вами та іншими 200 мільйонами користувачів Office найбільше стурбовані тим, як надсилати дані до OneNote за допомогою Office VBA. Я радий сказати, що це МОЖЕ зробити. Ця сторінка проведе вас через усе, що вам потрібно, щоб це зробити.

Я припускаю, що ви помірно знайомі з VBA. Якщо ви цього не зробите, я настійно рекомендую VBA та макроси для 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, здається, працюють. Теги шрифтів працюють.

The Gotcha

Щоб оновити існуючу сторінку, ви повинні знати глобальний унікальний ідентифікатор (GUID) для цієї сторінки. Здається, немає способу знайти GUID для існуючої сторінки в OneNote. Це означає, що ви можете оновлювати або видаляти елементи на існуючій сторінці, лише якщо ви програмно створили сторінку та зберегли GUID, який використовувався для створення цієї сторінки, у вашій книзі. У наведеному нижче прикладі використовується недоступне місце на аркуші для збереження GUID для сторінки, таблиці даних та діаграми.

GUID

Кожна нова сторінка в OneNote потребує GUID. Кожен новий об’єкт, розміщений на сторінці, потребує GUID. Незважаючи на те, що генерувати GUID з VB.Net легко, пошук способу генерування GUID з VBA було невдалим. Усі 200 мільйонів користувачів Office VBA повинні повідомити Майкла Каплана з Trigeminal Software. Майкл, здається, єдиний хлопець у світі, який порушив код про те, як генерувати GUID з VBA. Він люб’язно поділився цим кодом зі світом. Перевірте повний код на його веб-сайті. З дозволу Майкла я скопіював тут лише функції, необхідні для створення нового 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.

Цікаві статті...