2023/03/22

Notes - Excel 連携:#1)Excel オブジェクトの作成

ノーツは1つの製品で非常に幅広いエリアをカバーする素晴らしい製品ですが、苦手とする部分も存在します。

例えば、帳票の出力やグラフ表示です。ノーツの機能拡張を期待するところですが、現時点では他のアプリケーションの力を借りる必要があります。今の時代、1製品に頼るのではなく、組み合わせて課題解決する方が一般的かもしれません。情シス部門の腕の見せどころといえますね。

今回のシリーズでは、ノーツから Excel の機能を利用して、ノーツの機能を補いより活用する方法を検討していきます。

初回は、ノーツから Excel を操作する方法について整理します。

実現には、LotusScript の CreateObject 関数を使用します。

例えば、エージェントで以下のように作成し、実行すると新しい Excel のワークブックがデスクトップに表示されます。

Sub Initialize
   Dim oXls As Variant

   Set oXls = CreateObject("Excel.Application")
   Call oXls.Workbooks.Add
   oXls.Visible = True
End Sub

CreateObject 関数は、指定されたクラスの OLE Automation オブジェクトを作成します。引数の"Excel.Application"が、Excel を表すクラス名で、生成するオブジェクト毎にあらかじめ定義されています。Windows では、ProgID と呼び、レジストリ内に登録されているらしいです。

オブジェクトが生成されると、oXls 変数に代入されます。オブジェクトなので、Set が必要となります。


コーディング時の注意

オブジェクト生成以降は、そのオブジェクトが持つプロパティやメソッドをコールして、プログラムを完成させます。Domino Designer にしてみると、そのオブジェクトは海のものとも山のものともわかりませんので、プロパティやメソッド、引数のチェックはできません。タイプミスしても Notes Class のようにコンパイルエラーはでません。実行して初めてエラーとなるので、記述には十分注意してください。

同じ理由で、デバッグ時もオブジェクト内のプロパティは参照できません。


オブジェクトの管理

続いて、CreateObject 関数利用時の挙動の確認と注意です。

先のサンプルを実行すると、デスクトップに Excel が起動しました。エージェントの実行が終了しても、Excel は起動したままとなっていました。これは、Excel がノーツのエージェントとは別プロセスで実行していることになります。

試しに、「oXls.Visible = True」をコメントアウトして実行してみてください。Windows のタスクマネージャを開くと Excel のタスクが残ったままとなります。そして、UI に表示できないので、タスクマネージャから強制終了するしかありません。

これを回避するためには、以下のように、コードでオブジェクトを終了します。ここでは、Excel をクローズして、オブジェクト変数に Nothing を代入しています。

Sub Initialize
   Dim oXls As Variant

   Set oXls = CreateObject("Excel.Application")
   Call oXls.Workbooks.Add
   'oXls.Visible = True

   Call oXls.Workbooks(1).Close(True)
   Set oXls = Nothing

End Sub

このように終了処理を確実に行うと、実行後 OS にゴミが残りません。また、うまくコントロールできるようになると、UI に一切表示することなく Excel の操作ができるようになります。


Excel オブジェクト構造の調べ方

先述した通り、CreateObject した Excel では、Domino Designer からプロパティやメソッドは参照できません。それらを調べるためには、Microsoft Learn の力を借りることになります。

https://learn.microsoft.com/ja-jp/office/vba/api/overview/excel

CreateObject("Excel.Application") で作成されるオブジェクトは、引数の通り Excel の Application オブジェクトとなります。Microsoft Learn の『オブジェクト モデル』より、Application オブジェクトを探してみてください。ありましたか?

この記事を書いている時点では、”Application オブジェクト” ではなく ”アプリケーション オブジェクト”と表示されていました。

このサイトは機械翻訳されているようで、不必要に日本語化されていることがありますので、注意して参照ください。


UI表示は遅い?

今回のサンプルで、Application クラスの Visible プロパティを True に設定することにより、Excel を UI に表示できることを紹介しました。

オブジェクト生成時に、UI に表示すると、プログラムの実行状況が目に見えるので、挙動が確認できて面白いです。

ただ、UI に表示する分、処理速度は下がります。こんな時は、UI の表示を処理の最後に変更すれば、少しは改善できます。

Notes - Excel 連携 次回

0 件のコメント:

コメントを投稿