プロジェクト

全般

プロフィール

PowerShellからExcelをあれこれ » 履歴 » バージョン 2

« 前 - バージョン 2/4 (差分) - 次 » - 最新版
健二 酒井, 2019/09/24 21:29


PowerShellからExcelをあれこれ

概要

動かしたいなぁということで調べたことをまとめる。

COMオブジェクト

Coponent Object Modelの略、Microsoftの技術。
ソフトウェアを動かすためのインターフェースらしい。

参考 Wikipedia https://ja.wikipedia.org/wiki/Component_Object_Model

各アプリケーション(とその内部コンポーネント)を表現するオブジェクト群を使って、外部のプログラムからソフトウェアの機能を使えるようにしたしろもの。
例えばExcelのCOMオブジェクトを呼ぶと丸ごとExcelのプロセスが起動する。

たぶんVBScriptとか、VBAとかも内部的にはこれを使っているんじゃないかなぁ。
COMオブジェクトを抑えればVBAの勉強にもなる。その逆もしかり。
膨大なプロパティ・メソッドが存在するのでVBAやマクロから学んだほうがいい気がする。

参考 Excelオブジェクトモデル https://docs.microsoft.com/ja-jp/visualstudio/vsto/excel-object-model-overview?view=vs-2019

アンマネージド

.NETで動かすソフトウェアは基本、.NETの実行環境(CLR、共通言語ランタイム)が色々管理してくれる。
ただし、.NET上で動いていないものを動かすとき、.NETはそのコードを管理できないためそこは管理外ということでunmanaged。
アンマネージドなコードを実行するときは、リソースの開放とかを手動でやらなければならなくなったりする。
例えば今回のExcelオブジェクトは開放し忘れるとExcelのプロセスが残り続けたりする。

生成は色々なときやるけど、COMオブジェクトの開放は以下のメソッドを使う。

' xlObjectの解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlObject)

PowerShellでやるときは以下のようになるのかな。

$ [System.Runtime.InteropServices.Marshal]::ReleaseComObject(xlObject)

リソースがリークしないように開放するのは、生成したのと逆順に開放していくのがコツらしい。
Excelの場合は、Application -> Workbook -> Worksheet -> Rangeっていうような階層構造になっているのでこの順番で開放していくことになるっぽい。

参考 COMオブジェクトを解放する http://exceldotnet.lance40.com/comrelease.html

Excelの勉強

とりあえずこれ見ておこう。

Excelオブジェクトモデル https://docs.microsoft.com/ja-jp/visualstudio/vsto/excel-object-model-overview?view=vs-2019

古い情報だけど、絵になってて見やすい。互換性のためにも基本は変わっていない(はず)
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa141044(v=office.10)?redirectedfrom=MSDN

VBA <-> COMオブジェクトと並行して考えられる・学べるのでVBAやVBScriptの解説サイト、コードを読むのも勉強になる。

そういや社会人最初の仕事はACCESS VBAだったなぁ。Accessのオブジェクトモデルも見たなぁ、懐かしい。

メモ

最近のExcelはJavaScript APIなんて備えていたのか

参考