プロジェクト

全般

プロフィール

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