Microsoft Excelとの接続

Excel オブジェクトモデルについて

外部アプリケーションに接続するにあたって、そのアプリケーションのオブジェクトモデルについて知ることができなければなりません。Excel の場合は、Excel から「Microsoft Visual Basic Appication」を表示させ、そこのヘルプからオブジェクトモデルについてオンラインの情報を得ることができます。勝手がわかっているなら、直接検索してオンラインのヘルプに飛んでも良いでしょう。また、Microsoft Office のオブジェクトモデルについては、Visual Basic 用に「~ VBA」 として書籍が多くありますので、そちらも参考になります。

Excel の VLA オブジェクトを作成できたあとは、vlax-dump-object 関数を使って情報を表示させることもできますが、失敗して AutoCAD が停止することもあるなど不安定な場合があります。その他全般的に、無効な VLA オブジェクトのメソッドを呼び出したりプロパティを参照しようとしたりすると、場合によっては AutoCAD が停止するほどのエラーになります。不確定な場合は、vlax-object-released-p 関数で確認を行いますが完全とは言えません。しかし正しい方法でアクセスすれば大丈夫ですので、小さな実験を行いながら進めていってください。

以降では、Excel の VLA オブジェクトの操作を見ていきます。「タイプライブラリ」は使用しない方法で行ってみます。

アプリケーション

次のコードは、EXCEL の Application オブジェクトを得て表示モードにします。

(setq excelApplication (vlax-get-or-create-object "Excel.Application"))
(vlax-put-property excelApplication 'Visible :vlax-true)

次は、Excel アプリケーションを終了させます。ブックが開かれて編集されていた場合は確認のダイアログが出ます。

(vlax-invoke-method excelApplication 'Quit)

対象の Excel アプリケーションが終了した場合、シンボルに代入されている Excel の VLA オブジェクトは無効になったので解放します。

(vlax-release-object excelApplication)

先に説明したとおり、 Excel の Application オブジェクトの解放と Excel アプリケーションの終了は別々のものです。以降の例では、Application オブジェクトに限らず、ワークブックなど外部の VLA オブジェクトの解放は必要に応じて行ってください。

ブック

以降では、シンボル excelApplication には有効な Excel アプリケーションオブジェクトが代入されているとします。

Excel のブックは Workbook オブジェクトで表されます。Workbook オブジェクトは Application オブジェクトの Workbooks コレクションから取得できます。

(setq workbooks (vlax-get-property excelApplication 'Workbooks))

新しいブックを開きます。

(setq workbook (vlax-invoke-method workbooks 'Add))

次は既存のブックを開きます。

(setq workbook (vlax-invoke-method workbooks 'Open "myBook.xlsx"))

次はアクティブなブックを得ます。

(setq workbook (vlax-get-property excelApplication 'ActiveWorkbook))

次はブックをアクティブにします。これは Excel アプリケーションの中で最前面に表示されることになりますが、別プロセスの Excel アプリケーションや Windows で実行中のすべてのアプリケーションのウィンドウの最前面ではありません。

(vlax-invoke-method workbook 'Activate)

次はブックを名前を付けてファイルに保存します。引数は、最低以下のものが必要です。

(vlax-invoke-method
workbook ; VLA-Object
'SaveAs ; method
"myBook(2).xlsx" ; Filename
-4143 ; FileFormat : xlWorkbookNormal
"" ; Password
"" ; WriteResPassword
:vlax-False ; ReadOnlyRecommended
:vlax-False ; CreateBackup
1 ; AccessMode
)

次は開かれているブックを閉じます。ブックが編集されていた場合は、保存の確認ダイアログが出ます。

(vlax-invoke-method workbook 'Close)

ブックをすべて閉じても、まだ Windows 内では Excel アプリケーションは存在していますので、必要ならアプリケーションに対して QUIT を行います。

ウィンドウ

Excel のウィンドウは Window オブジェクトで表されます。

アプリケーションの Windows プロパティで Excel 全体のウィンドウのコレクションを得られます。 特定のブックに関連したものは、そのブックの Windows プロパティからコレクションを得ることができます。このコレクションでは、インデックスは 1 から始まり、1 がアクティブなウィンドウを指します。 次は、ブックのウィンドウが最小化されていた場合は表示します。シンボル workbook には、有効な Workbook オブジェクトが代入されているとします。

(setq window (vlax-get-property (vlax-get-property workbook 'Windows) 'Item 1))
(if (= (vlax-get-property window 'WindowState) -4140 ;|xlMinimized|;)
(vlax-put-property window 'WindowState -4143 ;|xlNormal |;)
)

ワークシート

Excel のワークシートは、Worksheet オブジェクトで表されます。Worksheet オブジェクトは Workbook オブジェクトの Worksheets コレクションから取得できます。このコレクションでは、インデックスは 1 から始まり、1 がアクティブなシートを指します。また、インデックスの代わりに、シートの名前からWorksheet オブジェクトを得ることもできます。

次はブックのワークシートの名前をすべて表示します。

(setq sheets (vlax-get-property workbook 'Worksheets))
(vlax-for sheet sheets (princ (vlax-get-property sheet 'Name)))

以降では、シンボル sheets に有効な Worksheets コレクションが代入されているとします。

新しいシートを作成します。

(vlax-invoke-method sheets 'Add)

「Sheet2」をアクティブにし、選択状態にします。

(vlax-invoke-method (vlax-get-property sheets 'Item "Sheet2") 'Activate)

「Sheet2」に加えて「Sheet1」を選択状態にします。

(vlax-invoke-method (vlax-get-property sheets 'Item "Sheet1") 'Select :vlax-False)

次は Excel アプリケーションの中で現在アクティブなワークシートを得ます。

(setq sheet (vlax-get-property excelApplication 'ActiveSheet))

特定のブックに関連したものは、その Workbook オブジェクトの ActiveSheet プロパティから一番手前のシートのオブジェクトが得られます。