ExcelVBA怖いよ


初めまして、とある企業内で、サーバ管理してます。

検索すると、とにかく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至上主義の人にもセーフですね。

ではでは、次回の講釈で。続きが書けるといいなぁ。