SlideShare une entreprise Scribd logo
1  sur  45
Télécharger pour lire hors ligne
こじらせ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
• 実装

Contenu connexe

Tendances

PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015
PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015
PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015Hikari Fukasawa
 
Web技術勉強会 第33回
Web技術勉強会 第33回Web技術勉強会 第33回
Web技術勉強会 第33回龍一 田中
 
WinFormsからWPFへ
WinFormsからWPFへWinFormsからWPFへ
WinFormsからWPFへYamamoto Reki
 
PHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さPHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さShinichi Takahashi
 
ストアアプリのXamlを解説
ストアアプリのXamlを解説ストアアプリのXamlを解説
ストアアプリのXamlを解説Makoto Nishimura
 
〜laravel で学ぶ MVC
 〜laravel で学ぶ MVC 〜laravel で学ぶ MVC
〜laravel で学ぶ MVCmikakane
 
これからのJavaのとっかかりを掴む #jdt51 #kanjava
これからのJavaのとっかかりを掴む #jdt51 #kanjavaこれからのJavaのとっかかりを掴む #jdt51 #kanjava
これからのJavaのとっかかりを掴む #jdt51 #kanjavairof N
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Narami Kiyokura
 

Tendances (9)

PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015
PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015
PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015
 
Web技術勉強会 第33回
Web技術勉強会 第33回Web技術勉強会 第33回
Web技術勉強会 第33回
 
WinFormsからWPFへ
WinFormsからWPFへWinFormsからWPFへ
WinFormsからWPFへ
 
SwiftSession5
SwiftSession5SwiftSession5
SwiftSession5
 
PHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さPHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さ
 
ストアアプリのXamlを解説
ストアアプリのXamlを解説ストアアプリのXamlを解説
ストアアプリのXamlを解説
 
〜laravel で学ぶ MVC
 〜laravel で学ぶ MVC 〜laravel で学ぶ MVC
〜laravel で学ぶ MVC
 
これからのJavaのとっかかりを掴む #jdt51 #kanjava
これからのJavaのとっかかりを掴む #jdt51 #kanjavaこれからのJavaのとっかかりを掴む #jdt51 #kanjava
これからのJavaのとっかかりを掴む #jdt51 #kanjava
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
 

En vedette

ぜんぶScalaでやってみた
ぜんぶScalaでやってみたぜんぶScalaでやってみた
ぜんぶScalaでやってみた力世 山本
 
なんちゃってIo tで朝活してみよう!
なんちゃってIo tで朝活してみよう!なんちゃってIo tで朝活してみよう!
なんちゃってIo tで朝活してみよう!Kazuhiko Kurimura
 
社内LT大会#3 2016-4-28 Vuls
社内LT大会#3 2016-4-28 Vuls社内LT大会#3 2016-4-28 Vuls
社内LT大会#3 2016-4-28 VulsKota Kanbe
 
競プロ、なんでお前たちやらないの?
競プロ、なんでお前たちやらないの?競プロ、なんでお前たちやらないの?
競プロ、なんでお前たちやらないの?Shota Tsukamoto
 
GISについてのお話
GISについてのお話GISについてのお話
GISについてのお話futureotsuka
 
Seleniumのモバイル版「Appium」を使ってみた
Seleniumのモバイル版「Appium」を使ってみたSeleniumのモバイル版「Appium」を使ってみた
Seleniumのモバイル版「Appium」を使ってみたyamapy black
 
Spring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなしSpring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなしSatoshi Kisanuki
 
電通大発、働き方を伝えるメディア  UEQareer
電通大発、働き方を伝えるメディア  UEQareer電通大発、働き方を伝えるメディア  UEQareer
電通大発、働き方を伝えるメディア  UEQareerKen Takahashi
 
なれる!デザイナー(ロゴ作りから始めるデザイン入門)
なれる!デザイナー(ロゴ作りから始めるデザイン入門)なれる!デザイナー(ロゴ作りから始めるデザイン入門)
なれる!デザイナー(ロゴ作りから始めるデザイン入門)hiroki tanaka
 
マイナーデスクトップOsたち
マイナーデスクトップOsたちマイナーデスクトップOsたち
マイナーデスクトップOsたちMasaki Matsumoto
 
IoTでアヒルを動かしてみました
IoTでアヒルを動かしてみましたIoTでアヒルを動かしてみました
IoTでアヒルを動かしてみましたKota Takebayashi
 
ログモニタリングツールを自作した話
ログモニタリングツールを自作した話ログモニタリングツールを自作した話
ログモニタリングツールを自作した話Hiroki Takeda
 
未来太郎と未来花子
未来太郎と未来花子未来太郎と未来花子
未来太郎と未来花子ming li
 
AI(強化学習)でロボットに学習させてみた
AI(強化学習)でロボットに学習させてみたAI(強化学習)でロボットに学習させてみた
AI(強化学習)でロボットに学習させてみたakmtt
 

En vedette (20)

ぜんぶScalaでやってみた
ぜんぶScalaでやってみたぜんぶScalaでやってみた
ぜんぶScalaでやってみた
 
なんちゃってIo tで朝活してみよう!
なんちゃってIo tで朝活してみよう!なんちゃってIo tで朝活してみよう!
なんちゃってIo tで朝活してみよう!
 
社内LT大会#3 2016-4-28 Vuls
社内LT大会#3 2016-4-28 Vuls社内LT大会#3 2016-4-28 Vuls
社内LT大会#3 2016-4-28 Vuls
 
競プロ、なんでお前たちやらないの?
競プロ、なんでお前たちやらないの?競プロ、なんでお前たちやらないの?
競プロ、なんでお前たちやらないの?
 
GISについてのお話
GISについてのお話GISについてのお話
GISについてのお話
 
Seleniumのモバイル版「Appium」を使ってみた
Seleniumのモバイル版「Appium」を使ってみたSeleniumのモバイル版「Appium」を使ってみた
Seleniumのモバイル版「Appium」を使ってみた
 
Spring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなしSpring frameworkが大好きなおはなし
Spring frameworkが大好きなおはなし
 
Grep
GrepGrep
Grep
 
電通大発、働き方を伝えるメディア  UEQareer
電通大発、働き方を伝えるメディア  UEQareer電通大発、働き方を伝えるメディア  UEQareer
電通大発、働き方を伝えるメディア  UEQareer
 
なれる!デザイナー(ロゴ作りから始めるデザイン入門)
なれる!デザイナー(ロゴ作りから始めるデザイン入門)なれる!デザイナー(ロゴ作りから始めるデザイン入門)
なれる!デザイナー(ロゴ作りから始めるデザイン入門)
 
マイナーデスクトップOsたち
マイナーデスクトップOsたちマイナーデスクトップOsたち
マイナーデスクトップOsたち
 
IoTでアヒルを動かしてみました
IoTでアヒルを動かしてみましたIoTでアヒルを動かしてみました
IoTでアヒルを動かしてみました
 
20160811車載
20160811車載20160811車載
20160811車載
 
Future_Lt20160810
Future_Lt20160810Future_Lt20160810
Future_Lt20160810
 
20160810-lt-cygwin
20160810-lt-cygwin20160810-lt-cygwin
20160810-lt-cygwin
 
ログモニタリングツールを自作した話
ログモニタリングツールを自作した話ログモニタリングツールを自作した話
ログモニタリングツールを自作した話
 
20161119 lt
20161119 lt20161119 lt
20161119 lt
 
未来太郎と未来花子
未来太郎と未来花子未来太郎と未来花子
未来太郎と未来花子
 
Spark CL
Spark CLSpark CL
Spark CL
 
AI(強化学習)でロボットに学習させてみた
AI(強化学習)でロボットに学習させてみたAI(強化学習)でロボットに学習させてみた
AI(強化学習)でロボットに学習させてみた
 

こじらせVBA