- ホーム
- Other
- controlnotes
NotesをVBAでコントロールするTips
VBAでNotesメールを送る程度は、拾得物のコードを使って行っておりましたが、それ以上は進めないでいました。
ここでNotesのデータベースからのデータ取り込みにまじめに取り組んでみました。
まず、試行錯誤の結果のTipsをご披露させていただきます。
(追記)Notes VBAでググると結構上位に表示される事を知りました。具体的なサンプルコードがみたい方は、メニューのOtherからご覧下さい。
1.コントロールの方法に二種類ある
a.OLEによる方法
Set Session = CreateObject("Notes.NotesSession")
b.COMによる方法
Set Session = CreateObject("Lotus.NotesSession")
OLEとCOMの違いはいまいち理解できないが、巷に(特にUSAに)よくみられるのはOLEのコード
こちらは実行時バインディングしかできないそうなので、コピペして使う分には良いが、
Notesのオブジェクトを良く理解していない者(自分の事)には、応用が利かない。
COMの方は参照設定すれば、インテリセンスが利くので、当たりをつけながら進められる。
最初二種類の違いを知らなかったため、OLEのコードをCOMの方に転用しようとして、いちいち型違いで凹まされました。
2.インテリセンスが利くCOMによる方法でやろうと思いましたが、参考文献が少ないです。
日本語の参考記事
http://www.ibm.com/developerworks/jp/lotus/iris_today/20000103_1.html
こちらで言及されている、Lotus Domino and Notes ToolKit for COM なるものは見つけられないでいます。
Notesのオブジェクトの理解についてはLotus Script for Visual Basic Programmersという文献が役に立ちました。
VBでコントロールする若干のサンプルも載っています。
http://www.redbooks.ibm.com/redbooks/pdfs/sg244856.pdf
LotusScriptに関する日本語のヘルプサイトです。
http://www.bcom.co.jp/help/help65_designer.nsf/Main?OpenFrameSet
3.Tips
・Lotus Domino Objectsに参照設定する必要があります。
・OLEによる方法と異なり、Initializeが必要となります。これをしないと、下記のエラーになります。
実行時エラー '-2147217013 (8004118b)': Session has not been initialized
・Initializeはパスワードを入力するか、Initializeの引数として渡してやる必要があります。後者だとコード中に
平文でパスワードを入れておく必要があり、ほとんど自分しか使わないのにVBAプロジェクトの保護をかけるのも面倒なので、
何か良い方法はないかと探しております。
・コレクションがVariant型の配列として得られるため、For Each でオブジェクトとしてループを回せず、またコレクションに
CountやLengthといったプロパティが無い場合があり、
For i=0 to Ubound(Variant型配列)Next
でループを回さないといけないケースが多いように感じます。
オブジェクトのコレクションとして扱う場合も、総個数が分からないので、NextSibilingがNothingとなるまでループを
回すといった方法が必要な場合もあります。(特にOLEの場合)
・また、一つしか要素を戻さないと思われるケースでもVariant型配列で返すため、Variant配列(0)でアクセスしないと
ならない場合もあります。
メールDBの文書が、開いていないとき、GetfirstItem("Subject").textが空文字を返すので混乱してしまったのですが
(Getfirstitem("Body").Textは、開いていようといまいと取得可能なので)、
一旦buf=Getfirstitem("Subject").valuesといった形でVariant配列型の配列に受けて、buf(0)という形で
アクセスできます。
・EmbeddedObjects属性を持つNotesRichTextItemはコレクションがなく、NotesItemのコレクションの中で、Typeが
RICHTEXT = 1のitemを、NotesRichTextItemに代入して、インテリセンスを利かせてコードを書く必要があります。
・メールデータベースのフィールド名(カラム名)は、データベースのプロパティで表示されるものとは異なり、一般的な
Subject, SendTo, Body等でアクセするする必要があります。(コードではitem.nameで取得できます)
他のデータベースについては、データベースの各記事上で右クリックして選択できるプロパティで知ることができる名前が通用します。
・Notesに文書を削除しても、Viewから消えないことがあるというバグがあります。ループを回してDocumentを取得していて、
GetFirstItem("Subject")等が、オブジェクトを戻さないという訳の分からないエラーが出て悩まされました。Viewを見ても、
当然Subjectが空のメールなど見当たりません。文字列化した発信日時をキーにしていたため、エラーが発生するメールを
見つけることが出来、開いて中味を見ようとすると、削除されているという、Notesを使っているとおなじみのエラーが発生して、
訳が分かりました。View.Refreshをコードに足してみましたが、効果はなく、Rebuildしないとダメみたいです。
4.余談
上記のIBMの記事のタイトルが、R5.0.2bからの...とあるのを見て、昔5000円位で買った、Notes5 PC対応版の存在を
思い出し、CDを引っ張り出しました。VirtualBoxのWin2Kにインストールしようとして、誤ってWindows7Home 64bitに
インストールしてみましたが、メールを使う程度は動作しました。(Webを見ようとするとハングアップしてしまいましたが。)これに
参照設定してみようとすると、Lotus Domino Objectは存在せず、Lotus Notes Automation Classesというのが
ありました。オブジェクトブラウザで見るとそれらしいメンバが並んでいます。
インテリセンスを使ってコードは書けるのですが、オブジェクト変数に設定しようとすると-「New キーワードの使用法が不正です」。
CreateObjectすると、「実行時エラー '429':ActiveX コンポーネントはオブジェクトを作成できません。」となってしまいます。
バージョンを確認すると、R5.0.1bなのがまずいのか?残念。
インテリセンスを用いて書いたコードを、CreateObject("Notes.NotesSession")に書き換え、オブジェクトもすべて
Object型に置換して実行すると動作しましたので、一応開発環境ができました。VBE上でObject型で記述していても、
何故かプロパティを勝手に大文字、小文字に書き換えてくれる場合があります。
ただし、Docs.Countが使えない等、微妙な違いがあります。
不安定ながら開発環境ができて、トライアルはだいぶ進みました。
5.Lotus Domino Designerの無償化
Windows7Home(64)にインストールしたNotes5が不安定なので、VirtualBoxのWin2Kにインストールしてみたら、
やっぱりOLEが不安定だったというトホホな経験を経て、未だにNotes(Domino?)4.6を使用している会社もある様だし、
ひょっとしてNotes5のUpdateが無いかとダメ元で探していて、Lotus Domino Designer (V8.5.3)が開発用に
無償でダウンロードできる事を知りました。1Gの巨大ファイルをダウンロードして、VirtualBoxにインストールして確認すると、
Domino Designerだけでなく、Notes Clientもついています。(開発しても確認できなければ意味が無いので当然か..)
使用環境はWindowsのPro以上とありましたが、Winodws7Home(64)にもインストールでき、VBEの参照設定で、
Lotus Domino Objectが確認できました。
http://www.ibm.com/developerworks/downloads/ls/dominodesigner/index.html?S_TACT=105AGX28&S_CMP=DLMAIN