Коришћење Екцел ВБА за пребацивање садржаја на ОнеНоте - Чланци ТецхТВ

У августу је Мицрософт објавио верзију СП1 ОнеНоте-а. Ово је обавезна надоградња. Додали су многе невероватне функције, укључују интерфејс за програмирање апликација који омогућава другим апликацијама да пребацују податке у ОнеНоте.

Мицрософт нуди неколико изврсних веб локација које ће вас научити како да користите ВБ.Нет за убацивање података у ОнеНоте. Али, с обзиром да је ово веб локација, вас и мене и осталих 200 милиона корисника система Оффице највише брине како да податке проследите у ОнеНоте помоћу система Оффице ВБА. Срећан сам што могу да кажем да се ово МОЖЕ учинити. Ова страница ће вас провести кроз све што вам је потребно да то обавите.

Претпостављам да сте умерено упознати са ВБА. Ако нисте, топло препоручујем ВБА и макронаредбе за Мицрософт Екцел, књигу дизајнирану да некога одведе до ВБА криве учења.

Преглед

Податке можете послати у ОнеНоте тако што ћете их форматирати као КСМЛ податке. КСМЛ је прилично нов концепт. То је некако као ХТМЛ. Замислите то као ЦСВ датотеку на стероидима. Можете прочитати мој Увод у КСМЛ.

У основи, ваш ВБА програм треба да напише КСМЛ датотеку, а затим проследи садржај КСМЛ датотеке у ОнеНоте помоћу методе .Импорт. КСМЛ датотека треба да садржи следеће елементе:

  • Елемент ЕнсуреПаге за сваку страницу на коју желите да пишете. Ако страница не постоји, ОнеНоте ће је створити за вас. У теорији би требало да имате контролу и поставите страницу након одређене постојеће странице. Међутим, у пракси то изгледа не функционише.
  • ПлацеОбјецт елемент за сваку ставку коју желите да додате на страницу. Наведите Кс & И локацију за ставку и извор ставке. Ставка може бити слика, мастило или текст у ХТМЛ формату. Помислили бисте да, пошто ОнеНоте чита из ХТМЛ-а, заправо можете проследити табелу са ознакама ТР и ТД, али ово не функционише. Ограничени сте на прослеђивање текста са БР и П ознакама да бисте додали феедфеедс. Чини се да УЛ & ЛИ тагови раде. Ознаке фонтова раде.

Тхе Готцха

Да бисте ажурирали постојећу страницу, морате знати глобални јединствени идентификатор (ГУИД) за ту страницу. Чини се да не постоји начин за проналажење ГУИД-а за постојећу страницу у ОнеНоте-у. То значи да ставке на постојећој страници можете ажурирати или избрисати само ако сте страницу програмски креирали и у својој радној свесци сачували ГУИД који се користи за креирање те странице. Пример у наставку користи место на путу на радном листу за чување ГУИД-а за страницу, табелу података и графикон.

ГУИД-ови

За сваку нову страницу у програму ОнеНоте потребан је ГУИД. За сваки нови објект смештен на страници потребан је ГУИД. Иако је лако генерирати ГУИД-ове из ВБ.Нет-а, проналажење начина за генерирање ГУИД-ова из ВБА-а било је недостижно. Свих 200 милиона корисника Оффице ВБА треба да дају кратак одговор Мајклу Каплану из компаније Тригеминал Софтваре. Чини се да је Мицхаел једини човек на свету који је прекршио код о томе како генерисати ГУИД од ВБА. Љубазно је делио овај код са светом. Погледајте целокупан код на његовој веб локацији. Уз Мајклово одобрење, овде сам копирао само функције потребне за генерисање новог ГУИД-а у ВБА. У свој модул уметните модул и у њега укључите следећи код.

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

Додавање референце

У ВБА користите Алати - референце да бисте додали референцу на библиотеку објеката ОнеНоте 1.1. То ће вам омогућити да декларишете нови ЦСимплеИмпортер објекат, а затим да користите методе .Импорт и .НавигатеТоПаге на објекту.

Истраживање случаја

Ова Екцел радна свеска садржи систем дневног извештавања. У локалном ланцу продавница постоји по један радни лист за сваку продавницу. Свака страница садржи табелу која приказује дневну продају и графикон који показује напредак ка месечном циљу.

ВБА код ће додати нови одељак под називом ДаилиСалес. За сваку продавницу биће додата по једна нова страница. Графикон са радног листа се извози као ГИФ датотека и увози у ОнеНоте. Подаци са радног листа додају се у ОнеНоте као ХТМЛ колона.

Дневна продаја

Следећи код се користи у програму Екцел.

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.

Занимљиви Чланци...