İçeriği OneNote'a Aktarmak için Excel VBA'yı Kullanma - TechTV Makaleleri

Ağustos ayında Microsoft, OneNote'un SP1 sürümünü yayımladı. Bu, sahip olunması gereken bir yükseltmedir. Diğer uygulamaların OneNote'a veri göndermesine olanak tanıyan bir uygulama programlama arabirimi dahil birçok inanılmaz özellik eklediler.

Microsoft, verileri OneNote'a aktarmak için VB.Net'i nasıl kullanacağınızı öğretecek birkaç mükemmel web sitesi sunar. Ancak burası site olduğu için, siz ve ben ve diğer 200 milyon Office kullanıcısı, Office VBA kullanarak verileri OneNote'a nasıl ileteceğiniz konusunda en çok endişeliyiz. Bunun YAPILABİLECEĞİNİ söylemekten mutluluk duyuyorum. Bu sayfa, yapmanız gereken her şeyde size yol gösterecektir.

VBA'ya kısmen aşina olduğunuzu varsayacağım. Değilseniz, birisini VBA öğrenme eğrisini yükseltmek için tasarlanmış kitap olan Microsoft Excel için VBA ve Makroları şiddetle tavsiye ederim.

Genel Bakış

Verileri XML verisi olarak biçimlendirerek OneNote'a gönderebilirsiniz. XML oldukça yeni bir kavramdır. Bir tür HTML gibidir. Steroidlerle ilgili bir CSV dosyası olarak düşünün. XML'e Girişimi okuyabilirsiniz.

Temel olarak, VBA programınızın bir XML dosyası yazması ve ardından XML dosyasının içeriğini .Import yöntemini kullanarak OneNote'a iletmesi gerekir. XML dosyasının şu öğeleri içermesi gerekir:

  • Yazmak istediğiniz her sayfa için bir EnsurePage öğesi. Sayfa yoksa, OneNote sizin için sayfayı oluşturacaktır. Teorik olarak, sayfayı belirli bir mevcut sayfadan sonra kontrol etmeniz ve yerleştirmeniz gerekir. Ancak pratikte bu işe yaramıyor gibi görünüyor.
  • Sayfaya eklemek istediğiniz her öğe için bir PlaceObject öğesi. Öğe için X ve Y konumunu ve öğenin kaynağını belirtirsiniz. Bir öğe, bir görüntü, bir Ink nesnesi veya HTML biçiminde bir metin olabilir. OneNote HTML'den okuduğundan, TR ve TD etiketleri olan bir tabloyu gerçekten geçebileceğinizi düşünürdünüz, ancak bu işe yaramıyor. Satır besleme eklemek için BR ve P etiketleriyle metin iletmekle sınırlandırılırsınız. UL ve LI etiketlerinin çalıştığı görülüyor. Yazı tipi etiketleri işe yarıyor.

Gotcha

Var olan bir sayfayı güncellemek için, o sayfanın Küresel Benzersiz Tanımlayıcıyı (GUID) bilmeniz gerekir. OneNote'ta var olan bir sayfanın GUID'sini bulmanın bir yolu yok gibi görünüyor. Bu, mevcut bir sayfadaki öğeleri yalnızca sayfayı programlı olarak oluşturduysanız ve bu sayfayı oluşturmak için kullanılan GUID'yi çalışma kitabınızda sakladıysanız güncelleyebileceğiniz veya silebileceğiniz anlamına gelir. Aşağıdaki örnek, sayfa, veri tablosu ve grafik için GUID'yi kaydetmek için çalışma sayfasında kullanılmayan bir yer kullanır.

GUID'ler

OneNote'taki her yeni sayfanın bir GUID'ye ihtiyacı vardır. Bir sayfaya yerleştirilen her yeni nesnenin bir GUID'ye ihtiyacı vardır. VB.Net'ten GUID'ler oluşturmak kolay olsa da, VBA'dan GUID'ler üretmenin bir yolunu bulmak çok zordu. 200 milyon Office VBA kullanıcısının tümü, Trigeminal Software'den Michael Kaplan'a bir ipucu vermelidir. Michael, VBA'dan nasıl GUID oluşturulacağına dair kodu kıran dünyadaki tek kişi gibi görünüyor. Bu kodu dünya ile nezaketle paylaştı. Kodun tamamını web sitesinde kontrol edin. Michael'ın izniyle, burada sadece VBA'da yeni bir GUID oluşturmak için gereken işlevleri kopyaladım. Projenize bir modül ekleyin ve bu modüle aşağıdaki kodu ekleyin.

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

Referans Ekleme

VBA'da, OneNote 1.1 Nesne Kitaplığına bir başvuru eklemek için Araçlar - Başvurular'ı kullanın. Bu, yeni bir CSimpleImporter nesnesi bildirmenize ve ardından nesnede .Import ve .NavigateToPage yöntemlerini kullanmanıza olanak tanır.

Vaka Analizi

Bu Excel çalışma kitabı günlük bir raporlama sistemi içerir. Yerel bir mağaza zincirindeki her mağaza için bir çalışma sayfası vardır. Her sayfa, günlük satışları gösteren bir tablo ve aylık hedefe doğru ilerlemeyi gösteren bir grafik içerir.

VBA kodu, DailySales adlı yeni bir bölüm ekleyecektir. Her mağaza için bir yeni sayfa eklenecektir. Çalışma sayfasındaki Grafik bir GIF dosyası olarak dışa aktarılır ve OneNote'a aktarılır. Çalışma sayfasındaki veriler OneNote'a HTML sütunu olarak eklenir.

Günlük satışlar

Excel'de aşağıdaki kod kullanılır.

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.

Ilginç makaleler...