Powershell エクセルVBAの定数のリストを作る Make Constants Excel VBA Enumurations

```powershell
#Set-ExecutionPolicy RemoteSigned -Scope Process -Force
$vbcrlf = "`r`n"
Try{
$xl = New-Object -ComObject Excel.Application;$xlEnums = New-Object -TypeName PSObject;$xl.GetType().Assembly.GetExportedTypes() | Where-Object {$_.IsEnum} | ForEach-Object {$enums = $_ ; $enums.GetEnumNames() | ForEach-Object {$xlEnums | Add-Member -MemberType NoteProperty -Name $_ -Value $enums::($_)}}
$xlEnums | gm -MemberType Properties | Export-Csv "F:\testxl.csv" -Force  -NoTypeInformation
$ar = $xlEnums -split ";"
$ar | ForEach-Object{$enumname = $_ ; Write-Host $enumname  $xlEnums._$enumname.value__}
}Finally{
clear-variable ar
clear-variable xlenums
$xl.quit()
$xl,$ar,$xlEnums  | foreach{$_ = $null}
}

```

```powershell
$xlEnums | gm -MemberType Properties | Export-Csv "C:\hoge\testxl.csv" -Force  -NoTypeInformation
```
この行で出力先が決まっています。C:\hoge\testxl.csv これを書き換えてください。

#元サイトと課題

[#PSTip Working with Excel constants - Powershell Magazine](http://www.powershellmagazine.com/2013/03/20/pstip-working-with-excel-constants/)
こちらが元サイトですが、定数の値が知りたいときは上記のスクリプトを起動させたのち、パワーシェルのコンソール画面(青い画面)で

```powershell
$xlEnums.xlRight.value__
```
としてエンターを押すと値が出力されます。（原文は`$xlEnum`ですが、この中身はコレクションであるため、`$`xlEnum***s***に変えてあります。)
つまり、`$xlEnums.`上記で出力した定数(インテリジェンスが効く）に続けて`.value__`をくわえ、エンターを押すとでます。
しかしこの方法では一つ一つ入力しなといけません。\$ar以降はそれを解決しようとして挫折した部分です。
##定数を値を得るほかの方法
###オブジェクトブラウザ
値を得る方法は、一覧表で求められた定数をEXCELでALT+F11 で VBEditorを開きF2でオブジェクトをブラウザを開き、検索欄に定数を入れます。
※OUTLOOK　Word などほかのアプリの定数の値を求める場合は、求めたいライブラリを参照設定してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/ac8b4a6b-37e3-073e-b4d2-8c2f99c4aaf5.png)
この方法は左下に表示される
Const xlDown = -4121をVBScript VBAはそのままコピーすればよい点です
またメンバーの親名 Excel.XLDirectionということもわかります。
つまり修飾子を入れると Excel.XLDirection.xlDownが正式名称(Excel.Application.XLDireciton.xlDownではない)で、これはクロスプラットフォーム(仮)で使います。

###イミディエイトウィンドウ
?xlDownと入力すると単純に値が求められます。大文字でも小文字でもよいです。

![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/126919/3a66962e-c6ca-3e34-d827-8b4bd8958764.jpeg)

1度に1つしか求められませんが、Constを検索するだけで作ってくれるオブジェクトブラウザはとても便利です。最もイミディエイトで値だけ求める方法も手軽です。

##あらためてPowershellの起動法
###1.Powershell ISEの起動
PowershellのスクリプトはPowershell ISEを探し出し起動します。Win10は64と32とありますが、どちらでもよいです。
###2.スクリプトのコピー
白い画面に上記のスクリプトをコピーします。
###3.セキュリティの解除
青い画面の方に

```powershell

Set-ExecutionPolicy RemoteSigned -Scope Process -Force
```

と入力してEnterを押します。
###4.スクリプトの起動
そのあと、白い画面をクリックしてF5キーを押してください。

##TypeLib Information(tlbinf32.dll)がなき今

以前はこのようなオブジェクトブラウザ、組み込み定数の出力はTypeLib Information(tlbinf32.dll)を利用することでした。
これを利用すればVBAでもVBSでも出力できたのです。
[組み込み定数を列挙するVBAマクロ](https://www.ka-net.org/blog/?p=4585)
[VBA TLI.TLIApplication](http://blog.goo.ne.jp/end-u/e/afd1c4a12ad798bfa4f2820e8f517389)
しかしWindows10ではこのDllがないため動きません。このスクリプトはこの代替です。
今のところ値は出せませんが、その代わり説明が英語で出せます。その点が優れています。またTLIではクラス名が必要でしたが、上記の場合はエクセルでは必要がありません。

#oleview.exe
[](https://docs.microsoft.com/ja-jp/visualstudio/)
C:\Program Files (x86) \Windows Kits\8.0\bin\x86\
自分のオフィス2016 64bitをインストールした状態では
C:\Program Files (x86)\Windows Kits\10\bin\x64\oleview.exe
にありましたが、わかりづらいですね。起動するときにもエラーが出ます。

[WindowsのCOM/OLEの情報を見る「oleview.exe」の起動時に「iviewers.dll」が無いと怒られたときの対処法](https://qiita.com/zakuroishikuro/items/d9530f6feb5467fc318b)
最も右クリックから「管理者として実行」が良いようです。
###開き方
Type Libraries>Microsoft Excel xx.00.0 Object Library> で右クリックで Viewを選択
なお、GUIDもここでクリップボードにコピーできます。この機能も重要ですね。
値が出るのはいいのですが、一覧性に欠けるのが難点です。また値が大きいと0x00000表記になります。（マウスポインターを定数に重ねると10進表示なのに...）
たとえばTypeDef Enum xlDirectionの項目で
const int xlDown = -4121 と左側には表示されているのに、コピペできる左側には
const int xlDown = 0xffffefe7;
と表示されます。うまくいかないですね。このOLEVierはC言語に対応するためのものではないでしょうか。