初めまして、とある企業内で、サーバ管理してます。
検索すると、とにかくQiitaにお世話になっているので、少しは恩返し(なるのか?)と思って、何かと乗り切っていることを、バレないように書こうかなと。
泣けてくるぜレガシーVBA###
いきなり、キミ、スクリプト出来るので、VBAも出来るよね?
と渡される、何の仕様も残っていないVBAファイル。
近代化よろしくと言われても、どうすりゃいいの?
中身を覘くと、VBA好きの現場の方が、ネット見て、くみ上げた超大作。
もちろん、あとから直すことを考えていないので、もう力業のオンパレード。
しかも、現場はExcel以外受け付けないよと言われる始末。
僕も知らなかったのですが、VB.netぐらいのコトが出来るだろうと舐めてたら、
.netのクラス読み出せたら簡単だろうと高をくくってると
実は、VBAとVBって別物なんですね。
調べても、ズバッと言ってくれてるサイトは無いし、ここでメモとして書いておこう。
そこで、外部プログラムをキックですよ###
ExcelVBA→Powershell→CSV出力→ExcelVBA
この方法だと、時代遅れ(失礼)なVBAを使わなくて済む。
あと、ExcelVBAからのキックだと、副産物として、
必要なライブラリーを読み込むことが可能になります。
Powershell5.1だと、例えば、標準で、AccountManagementがロードされていないわけで、
classを利用している場合、Add-Typeしていても、瞬間Error、この辺が防げるのが強み。
Dim objWSH as Object
Set objWSH = CreateObject("Wscript.shell")
objWSH.Run "powershell -Nologo -ExecutionPolicy RemoteSigned -Command " test.ps1
test.ps1の前に、ロードしたいモジュールを記述するとOK
"Add-Type 'System.DirectoryService.AccountManagement';"
※ADを検索するのに、DirectorySearcherを使っている方は、比較的簡単に使える、AccountManagementを利用すると、若干楽になるかも。なぜか、標準で読み込まれないんですよね。
後は、外部で実行、結果をCSVにして、VBAでCSV読み込みにして、完了。
見た目は、Excelで操作しているので、Excel至上主義の人にもセーフですね。
ではでは、次回の講釈で。続きが書けるといいなぁ。