PowerShellからExcelをあれこれ » 履歴 » バージョン 3
sylow castle, 2019/09/25 19:47
| 1 | 1 | sylow castle | # PowerShellからExcelをあれこれ |
|---|---|---|---|
| 2 | |||
| 3 | ## 概要 |
||
| 4 | |||
| 5 | 動かしたいなぁということで調べたことをまとめる。 |
||
| 6 | |||
| 7 | ### COMオブジェクト |
||
| 8 | |||
| 9 | Coponent Object Modelの略、Microsoftの技術。 |
||
| 10 | ソフトウェアを動かすためのインターフェースらしい。 |
||
| 11 | |||
| 12 | 参考 Wikipedia https://ja.wikipedia.org/wiki/Component_Object_Model |
||
| 13 | |||
| 14 | 各アプリケーション(とその内部コンポーネント)を表現するオブジェクト群を使って、外部のプログラムからソフトウェアの機能を使えるようにしたしろもの。 |
||
| 15 | 例えばExcelのCOMオブジェクトを呼ぶと丸ごとExcelのプロセスが起動する。 |
||
| 16 | |||
| 17 | たぶんVBScriptとか、VBAとかも内部的にはこれを使っているんじゃないかなぁ。 |
||
| 18 | COMオブジェクトを抑えればVBAの勉強にもなる。その逆もしかり。 |
||
| 19 | 膨大なプロパティ・メソッドが存在するのでVBAやマクロから学んだほうがいい気がする。 |
||
| 20 | |||
| 21 | 参考 Excelオブジェクトモデル https://docs.microsoft.com/ja-jp/visualstudio/vsto/excel-object-model-overview?view=vs-2019 |
||
| 22 | |||
| 23 | ### アンマネージド |
||
| 24 | |||
| 25 | .NETで動かすソフトウェアは基本、.NETの実行環境(CLR、共通言語ランタイム)が色々管理してくれる。 |
||
| 26 | ただし、.NET上で動いていないものを動かすとき、.NETはそのコードを管理できないためそこは管理外ということでunmanaged。 |
||
| 27 | アンマネージドなコードを実行するときは、リソースの開放とかを手動でやらなければならなくなったりする。 |
||
| 28 | 例えば今回のExcelオブジェクトは開放し忘れるとExcelのプロセスが残り続けたりする。 |
||
| 29 | |||
| 30 | 生成は色々なときやるけど、COMオブジェクトの開放は以下のメソッドを使う。 |
||
| 31 | |||
| 32 | > ' xlObjectの解放 |
||
| 33 | > System.Runtime.InteropServices.Marshal.ReleaseComObject(xlObject) |
||
| 34 | |||
| 35 | PowerShellでやるときは以下のようになるのかな。 |
||
| 36 | |||
| 37 | ``` |
||
| 38 | $ [System.Runtime.InteropServices.Marshal]::ReleaseComObject(xlObject) |
||
| 39 | ``` |
||
| 40 | |||
| 41 | リソースがリークしないように開放するのは、生成したのと逆順に開放していくのがコツらしい。 |
||
| 42 | Excelの場合は、Application -> Workbook -> Worksheet -> Rangeっていうような階層構造になっているのでこの順番で開放していくことになるっぽい。 |
||
| 43 | |||
| 44 | 参考 COMオブジェクトを解放する http://exceldotnet.lance40.com/comrelease.html |
||
| 45 | |||
| 46 | ### Excelの勉強 |
||
| 47 | |||
| 48 | とりあえずこれ見ておこう。 |
||
| 49 | Excelオブジェクトモデル https://docs.microsoft.com/ja-jp/visualstudio/vsto/excel-object-model-overview?view=vs-2019 |
||
| 50 | |||
| 51 | 2 | sylow castle | 古い情報だけど、絵になってて見やすい。互換性のためにも基本は変わっていない(はず) |
| 52 | https://docs.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa141044(v=office.10)?redirectedfrom=MSDN |
||
| 53 | |||
| 54 | 1 | sylow castle | VBA <-> COMオブジェクトと並行して考えられる・学べるのでVBAやVBScriptの解説サイト、コードを読むのも勉強になる。 |
| 55 | |||
| 56 | そういや社会人最初の仕事はACCESS VBAだったなぁ。Accessのオブジェクトモデルも見たなぁ、懐かしい。 |
||
| 57 | 2 | sylow castle | |
| 58 | 3 | sylow castle | ### スニペット |
| 59 | |||
| 60 | Excelオブジェクトの作成とメンバー一覧取得 |
||
| 61 | ``` |
||
| 62 | $excel = New-Object -ComObject Excel.Applicatio |
||
| 63 | $excel | Get-Member |
||
| 64 | ``` |
||
| 65 | |||
| 66 | $excel | Get-Member と $excel.GetType().DeclaredMembersの結果が違うのは何なんだろう… |
||
| 67 | |||
| 68 | 2 | sylow castle | |
| 69 | ### メモ |
||
| 70 | |||
| 71 | 最近のExcelはJavaScript APIなんて備えていたのか |
||
| 72 | |||
| 73 | - https://docs.microsoft.com/en-us/office/dev/add-ins/excel/excel-add-ins-overview |
||
| 74 | - https://docs.microsoft.com/ja-jp/office/dev/add-ins/reference/overview/excel-add-ins-reference-overview |
||
| 75 | 1 | sylow castle | |
| 76 | ## 参考 |
||
| 77 | |||
| 78 | - Wikipedia https://ja.wikipedia.org/wiki/Component_Object_Model |
||
| 79 | - Excelオブジェクトモデル https://docs.microsoft.com/ja-jp/visualstudio/vsto/excel-object-model-overview?view=vs-2019 |
||
| 80 | - COMオブジェクトを解放する http://exceldotnet.lance40.com/comrelease.html |