Menggunakan Excel VBA untuk Mendorong Konten ke OneNote - Artikel TechTV

Pada bulan Agustus, Microsoft merilis OneNote versi SP1. Ini adalah peningkatan yang harus dimiliki. Mereka menambahkan banyak fitur luar biasa, termasuk antarmuka pemrograman aplikasi yang memungkinkan aplikasi lain memasukkan data ke OneNote.

Microsoft menawarkan beberapa situs web luar biasa yang akan mengajari Anda cara menggunakan VB.Net untuk memasukkan data ke OneNote. Namun, karena ini adalah situsnya, Anda dan saya serta 200 juta pengguna Office lainnya sangat khawatir tentang cara mendorong data ke OneNote menggunakan Office VBA. Saya senang untuk mengatakan bahwa ini DAPAT dilakukan. Halaman ini akan memandu Anda melalui semua yang Anda butuhkan untuk menyelesaikannya.

Saya akan berasumsi bahwa Anda cukup familiar dengan VBA. Jika tidak, saya sangat merekomendasikan VBA & Macro untuk Microsoft Excel, buku yang dirancang untuk membawa seseorang meningkatkan kurva pembelajaran VBA.

Gambaran

Anda bisa mengirim data ke OneNote dengan memformat data sebagai data XML. XML adalah konsep yang cukup baru. Ini seperti HTML. Anggap saja sebagai file CSV tentang steroid. Anda bisa membaca Pengantar XML saya.

Pada dasarnya, program VBA Anda perlu menulis file XML, lalu meneruskan konten file XML ke OneNote menggunakan metode .Import. File XML harus berisi elemen-elemen ini:

  • Elemen EnsurePage untuk setiap halaman tempat Anda ingin menulis. Jika halaman tersebut tidak ada, OneNote akan membuatkan halaman tersebut untuk Anda. Secara teori, Anda diharapkan memiliki kontrol dan menempatkan halaman setelah halaman tertentu yang ada. Namun, dalam praktiknya, ini tampaknya tidak berhasil.
  • Elemen PlaceObject untuk setiap item yang ingin Anda tambahkan ke halaman. Anda menentukan lokasi X & Y untuk item dan sumber item. Item dapat berupa gambar, objek Tinta, atau teks dalam format HTML. Anda akan berpikir bahwa karena OneNote membaca dari HTML, Anda sebenarnya bisa melewatkan tabel dengan tag TR dan TD, tetapi ini tidak berhasil. Anda dibatasi untuk meneruskan teks dengan tag BR dan P untuk menambahkan umpan baris. Tag UL & LI tampaknya berfungsi. Tag font berfungsi.

Gotcha

Untuk memperbarui halaman yang ada, Anda harus mengetahui Pengenal Unik Secara Global (GUID) untuk halaman tersebut. Tampaknya tidak ada cara untuk menemukan GUID untuk halaman yang sudah ada di OneNote. Ini berarti Anda hanya bisa memperbarui atau menghapus item di halaman yang sudah ada jika Anda secara terprogram membuat halaman dan telah menyimpan GUID yang digunakan untuk membuat halaman tersebut di buku kerja Anda. Contoh di bawah ini menggunakan tempat terpencil di lembar kerja untuk menyimpan GUID untuk halaman, tabel data, dan bagan.

GUID

Setiap halaman baru di OneNote membutuhkan GUID. Setiap objek baru yang ditempatkan di halaman membutuhkan GUID. Meskipun mudah untuk menghasilkan GUID dari VB.Net, menemukan cara untuk menghasilkan GUID dari VBA masih sulit dilakukan. Semua 200 juta pengguna Office VBA harus memberikan petunjuk kepada Michael Kaplan dari Trigeminal Software. Michael tampaknya menjadi satu-satunya orang di dunia yang memecahkan kode tentang cara membuat GUID dari VBA. Dia dengan murah hati membagikan kode ini kepada dunia. Lihat kode lengkapnya di situsnya. Dengan izin Michael, saya hanya menyalin fungsi yang diperlukan untuk menghasilkan GUID baru di VBA di sini. Masukkan modul dalam proyek Anda dan sertakan kode berikut dalam modul itu.

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

Menambahkan Referensi

Di VBA, gunakan Alat - Referensi untuk menambahkan referensi ke Perpustakaan Objek OneNote 1.1. Ini akan memungkinkan Anda untuk mendeklarasikan objek CSimpleImporter baru dan kemudian menggunakan metode .Import dan .NavigateToPage pada objek tersebut.

Studi kasus

Buku kerja Excel ini berisi sistem pelaporan harian. Ada satu lembar kerja untuk setiap toko di rantai toko lokal. Setiap halaman berisi tabel yang menunjukkan penjualan harian dan grafik yang menunjukkan kemajuan menuju tujuan bulanan.

Kode VBA akan menambahkan bagian baru yang disebut DailySales. Satu halaman baru akan ditambahkan untuk setiap toko. Bagan dari lembar kerja diekspor sebagai file GIF dan diimpor ke OneNote. Data dari lembar kerja ditambahkan ke OneNote sebagai kolom HTML.

Penjualan Harian

Kode berikut digunakan di 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 yang menarik...