こじらせVBA
普通のVBAでは物足りないアナタへ
2016/4/28
Future Architect
ohya
みなさんVBA好きですか?
VBA(マクロ)への不満
 VB歴20年くらい(VB4→VB5→VB6→VBA)
 レガシー言語
 コレクションの機能がしょぼすぎる
 関数型とかムリ
 ファーストクラスファンクションじゃない
 クロージャも書けない
 マクロモジュールを外出し(共通化)できない
 もはや罰ゲームの領域
このLTは、
アラフィフのおっさんが
VBAの不満に対して
斜め上から
果敢に挑戦して (こじらせて) いった物語
VBAへの不満を解決するアレ
こじらせ その1/VBAでテンプレート
こじらせ その2/VBAでAltJS
こじらせ その3/VBAでAjax
こじらせ その4/VBAでHttpServer
まとめ
お話の流れ
VBAへの不満を
ほぼ解決してくれるアレ
それが
ScriptControl
ScriptControlとは?
 ActiveScriptを利用するためのOCX
 VBAから利用可能
 各種スクリプト言語へ統一的にアクセスできる
実行環境(VM)みたいなもの
 VBScript/JScriptが呼び出せる
 良い点
 VBAからシームレスな呼出が可能
 スクリプトの実行タイムアウトが設定できる
 無限ループが数秒で終了する!!
 悪い点
 デバッグが絶望的
 基本は、print文デバッグ
VBA
Script
Control JavaScript①読込
②呼出
③結果
だいたいこんな感じ
ScriptControl利用コード
ポイント
・言語を”JScript”に設定(“VBScript”も可能)
・AddCodeで関数(コード)を追加
・CodeObject経由で、追加した関数を呼び出せる
掲載しているスクリプトの動作環境は、
MS Office 2010の32ビット版でのみ動作します
MS Office 2013/2016では動作検証していません。
注意
こじらせ その1
VBAでテンプレート
こじらせ度 ★☆☆☆☆
VBAからテキストを自動生成
したいのに、
VBAにはメジャーな
テンプレートエンジンがない
JavaScriptなら
たくさんある!!
じゃあ、それ使っちゃいましょう
Underscore.jsの利用サンプル
VBAコード userfunc.js
ポイント
・外部JSライブラリを読み込み、AddCodeでコードを追加
・テンプレート展開処理も外部ファイルに記述
Underscore.jsはこっちで
利用しています
 JSON2(JScriptにはないので)
 ES6-Promise(非同期制御 ※2)
 sprintf(文字列編集)
 MD5(ハッシュ)
※1.Node.jsで動くJSならだいたい動作します。
※2.たまにブラウザ環境やES5依存のメソッドを
呼んでいるものとかあります。
⇒setTimeoutとかArray.isArrayとか。
※ライブラリ依存関係により、順番にロードする必要もあるかも
便利なJavaScriptいろいろ※1
こじらせ その2
VBAでAltJS
こじらせ度 ★★★☆☆
みなさんJavaScript好きですか?
JavaScriptへの不満
 VBAよりは若干マシ
 JavaScriptじゃなくてJScript
 Prototypeベースクラスシステム
 functionじゃなくて=>とか->とか使いたい
 {}とか書きたくない
 スコープがアレだし
“JScript”でもコンパイルできる
いい感じのAltJS言語ないかなー?
CoffeeScriptは
Coffee言語(Pythonっぽい)を
JavaScriptに変換する
トランスパイラ
変換サンプル
コンパイル
ポイント
・ブロックはインデントベース({}等はない)
・式ベース言語
・JSON表記もインデントベース(カンマ省略)
・変換後のJSもだいたい読める
CoffeeScript JavaScript
再びUnderscore.jsサンプル
①VBAコード
②compileutil.js
③userfunc.coffee
ポイント
・コンパイラを追加(AddCode)
・CoffeeScriptをロード&コンパイル
・トリプルクォートを使って改行入り
文字列リテラルを容易に記述
ScriptControlなら
別の言語処理系も動かせる!!
※Dart/TypeScriptはまだ試したこと無いです
※WebServer側のAssetパイプラインなら可能かも
こじらせ その3
VBAでAJAX
こじらせ度 ★★★☆☆
JavaScriptからは、
XmlHttpRequestが使えます
実際には、
” MSXML2.XMLHTTP.3.0”
ということは、
AjaxによるAPIのリクエスト
や
スクリプトファイルのダウンロード
とかも出来るわけです。
loadFromUrl関数(同期ダウンロード)
みたびUnderscore.js
ポイント
• BootStrap的なコードはローカルからロード
• 共通で利用できるコードは、WEBからダウンロード
• CDN/ローカルサーバーの使い分け
• このしくみにより、マクロ・スクリプト配布が不要となります
よーく見直すと
 JSライブラリ/ソースを動的にダウンロードして、
 ScriptControlにコード追加して、
 そのコードを実行する
ブラウザの動作と等価ですね
さらにこじらせると…
エンタープライズVBA?(3層)的な何かを実現
ポイント
• 最小限のVBAコード
• スクリプトの事前配布が不要
• JSはユニットテスト可
• クライアントにODBCドライバ不要
• Webクライアントへの置き換えも
容易
こじらせ その4
VBAでHttpServer
こじらせ度 ★★★★★
VBAにてHttpクライアントとして
利用できることはわかった
でも、サーバー処理を実現できる
ものなんて無いでしょ?
その名も
MS WinSock Control
MS WinSock Controlとは
 Microsoft謹製ActiveX
 サーバーソケットもオープン可能
 クライアントから接続してくるとイベント発生
 あとは“がんばって”HTTPプロトコルを実装
Httpサーバー作ってみた
マクロの
実行結果
• ExcelマクロをHTTP経由で実行できるRPCマクロサーバー
• シングルスレッドで動作
• 同時に複数リクエストを行うとハングwww
• Webサーバのコア部分はCoffeeScriptで実装
• 調子にのってmultipart/form-dataに対応。
ファイルアップロードも可能に
出来上がったもの
まとめ
ScriptControlを使うと・・・
 豊富なJavaScriptライブラリを利用できるよ
 AltJSも使えるよ
 スクリプトの動的読込&実行ができるよ
 デバッグは地獄だよ
是非、
ScriptControlで
遊んでみてください!!
(訂正)サンプルコード中の間違い
• サンプルコードにて、Array関数で配列を作成し、JavaScript関数に引き渡している表
記がありますが、実際には動作しません。以下の関数に置き換えることにより利用で
きます。
• Array → jsArray
• 実装

こじらせVBA