Menggunakan Excel VBA untuk Mendorong Kandungan ke Artikel OneNote - TechTV

Pada bulan Ogos, Microsoft mengeluarkan versi SP1 OneNote. Ini adalah peningkatan yang mesti ada. Mereka menambahkan banyak fitur luar biasa, termasuk antara muka pengaturcaraan aplikasi yang membolehkan aplikasi lain mendorong data ke OneNote.

Microsoft menawarkan beberapa laman web yang sangat baik yang akan mengajar anda bagaimana menggunakan VB.Net untuk memasukkan data ke OneNote. Tetapi, kerana ini adalah laman web ini, anda dan saya serta 200 juta pengguna Office yang lain sangat mengambil berat tentang bagaimana mendorong data ke OneNote menggunakan Office VBA. Saya dengan senang hati mengatakan bahawa ini BOLEH dilakukan. Halaman ini akan memandu anda melalui semua yang anda perlukan untuk menyelesaikannya.

Saya akan menganggap bahawa anda agak biasa dengan VBA. Sekiranya tidak, saya sangat mengesyorkan VBA & Makro untuk Microsoft Excel, buku yang direka untuk membawa seseorang mengikuti kurva pembelajaran VBA.

Gambaran keseluruhan

Anda dapat mengirim data ke OneNote dengan memformat data sebagai data XML. XML adalah konsep yang agak baru. Ia seperti HTML. Anggaplah ia sebagai fail CSV mengenai steroid. Anda boleh membaca Pengenalan saya kepada XML.

Pada dasarnya, program VBA anda perlu menulis fail XML, kemudian menyampaikan isi fail XML ke OneNote menggunakan kaedah .Import. Fail XML perlu mengandungi unsur-unsur ini:

  • Elemen EnsurePage untuk setiap halaman yang ingin anda tulis. Sekiranya halaman tidak ada, OneNote akan membuat halaman untuk anda. Secara teori, anda seharusnya mempunyai kawalan dan meletakkan halaman setelah halaman tertentu yang ada. Walau bagaimanapun, dalam praktiknya, ini nampaknya tidak berfungsi.
  • Elemen PlaceObject untuk setiap item yang ingin anda tambahkan ke halaman. Anda menentukan lokasi X & Y untuk item dan sumber item tersebut. Item boleh berupa gambar, objek Tinta, atau teks dalam format HTML. Anda akan berfikir bahawa kerana OneNote membaca dari HTML, anda sebenarnya boleh memberikan jadual dengan tag TR dan TD, tetapi ini tidak berjaya. Anda terhad untuk menghantar teks dengan tag BR dan P untuk menambahkan feed line. Tanda UL & LI kelihatan berfungsi. Tag fon berfungsi.

The Gotcha

Untuk mengemas kini halaman yang ada, anda mesti mengetahui Pengenal Unik Globally (GUID) untuk halaman tersebut. Nampaknya tidak ada cara untuk mencari GUID untuk halaman yang ada di OneNote. Ini bermaksud bahawa anda hanya boleh mengemas kini atau menghapus item pada halaman yang ada jika anda membuat halaman secara terprogram dan menyimpan GUID yang digunakan untuk membuat halaman tersebut di buku kerja anda. Contoh di bawah menggunakan tempat di luar pada lembaran kerja untuk menyimpan GUID untuk halaman, jadual data dan carta.

PANDUAN

Setiap halaman baru di OneNote memerlukan GUID. Setiap objek baru yang diletakkan di halaman memerlukan GUID. Walaupun mudah untuk menghasilkan GUID dari VB.Net, mencari jalan untuk menghasilkan GUID dari VBA telah sukar difahami. Semua 200 juta pengguna Office VBA perlu memberikan tip topi kepada Michael Kaplan dari Trigeminal Software. Michael nampaknya satu-satunya lelaki di dunia yang melanggar kod bagaimana menghasilkan GUID dari VBA. Dia telah berkongsi kod ini dengan baik kepada dunia. Lihat kod lengkap di laman webnya. Dengan izin Michael, saya hanya menyalin fungsi yang diperlukan untuk menghasilkan GUID baru di VBA di sini. Masukkan modul dalam projek anda dan sertakan kod berikut dalam modul tersebut.

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

Menambah Rujukan

Di VBA, gunakan Alat - Rujukan untuk menambahkan rujukan ke Perpustakaan Objek OneNote 1.1. Ini akan membolehkan anda menyatakan objek CSimpleImporter baru dan kemudian menggunakan kaedah .Import dan .NavigateToPage pada objek tersebut.

Kajian kes

Buku kerja Excel ini mengandungi sistem pelaporan harian. Terdapat satu lembaran kerja untuk setiap kedai di rangkaian kedai tempatan. Setiap halaman mengandungi jadual yang menunjukkan penjualan harian dan carta yang menunjukkan kemajuan menuju matlamat bulanan.

Kod VBA akan menambah bahagian baru yang disebut DailySales. Satu halaman baru akan ditambahkan untuk setiap kedai. Carta dari lembaran kerja dieksport sebagai fail GIF dan diimport ke OneNote. Data dari lembaran kerja ditambahkan ke OneNote sebagai lajur HTML.

Jualan Harian

Kod berikut digunakan dalam 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.

Artikel menarik...