Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

こじらせVBA

3,012 views

Published on

斜め上からVBAを利用しようとしてみた資料です。

Published in: Software
  • Be the first to comment

  • Be the first to like this

こじらせVBA

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

×