Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
VBAナメてた
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Narazaka
April 27, 2016
Programming
2
2.3k
VBAナメてた
〜VBAを使ったら絶対に後悔する7つの理由〜
社内でLTしたスライドです
Narazaka
April 27, 2016
Tweet
Share
More Decks by Narazaka
See All by Narazaka
UEFIでうごくゲームを作ってみた〜2017年夏休みの自由研究〜
narazaka
0
8.4k
伺か on Browser
narazaka
0
1.5k
真のrequire()をブラウザで
narazaka
0
1.4k
Excelは殺す絶対にだ
narazaka
0
890
Other Decks in Programming
See All in Programming
Symfony + NelmioApiDocBundle を使った スキーマ駆動開発 / Schema Driven Development with NelmioApiDocBundle
okashoi
0
200
The free-lunch guide to idea circularity
hollycummins
0
290
PHPで TLSのプロトコルを実装してみる
higaki_program
0
300
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
470
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
350
ロボットのための工場に灯りは要らない
watany
11
3k
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
510
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.3k
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
350
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
120
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
170
Understanding Apache Lucene - More than just full-text search
spinscale
0
130
Featured
See All Featured
The Language of Interfaces
destraynor
162
26k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
180
Context Engineering - Making Every Token Count
addyosmani
9
770
Mobile First: as difficult as doing things right
swwweet
225
10k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
140
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
What does AI have to do with Human Rights?
axbom
PRO
1
2k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
990
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
770
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
180
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
80
Transcript
VBA ナメてた @narazaka
奈良阪 自己紹介 Twitter: Github: npm: CPAN: RubyGems: ドリコム2015 新卒入社 サーバーサイドRuby
好きな言語: Perl / CoffeeScript / Ruby / C# / Ceylon? その他: 伺か/ 漫画読み描き/OP アニメ愛好家/ 鉄 @narazaka @Narazaka @narazaka NARAZAKA Narazaka
VBA (Visual Basic for Applications) 1994 年のExcel5.0 から付属したマクロ用言語 Excel が有名だがWord
やPowerPoint 等でも使える
顧客が説明した要件 プランナーさん: クエスト作成を便利にしてや 奈良阪: xlsx 使っとるしVBA やと移行コスト低そうか?
プログラマの見積もり プランナーさん: ウィッスオナシャス 奈良阪: メンテコスト高いらしい 奈良阪: 綺麗にかいたらそんなでもないやろ( 慢心)
VBA ナメてました
「Excel マクロつらい」
謎のセル指定
なるほど…… ?
VBA 、オブジェクト指向言語らしい? クラス書いたらよくね?
適切な変数名でマシになるっしょ? table_area = Range(area_begin, area_end)
……
クラスにもした 変数名関数名とかにも気を配った
None
でもそういう問題ではなかった
VBA || 20 世紀のMS 製品
最近のMicrosoft に毒気を抜かれて忘れていた
生産性が惨殺される体感
古き良きM$ を思い出させてくれる糞仕様の数々
7 連発
VBA を使ったら絶対に後悔 する7 つの理由 ( 煽りタイトル)
1. 不完全な型システム
VBA は一応オプショナルな変数型指定 を持ちます
TypeScript のように、変数宣言時や関数宣言時にオプショ ンで型をつけられる これは良い
型付で宣言された変数はエディタ上でインスペクタが出て 使えるメソッドとかが出てくる これも良い
型情報最高!!
にもかかわらず
エディタでもコンパイラでも型チェッ クされない
?
「型が一致しません ( エラー 13) 」はランタイムエラー
引数の順番とか間違えてても全部ランタイムエラー
せっかく入力したのに…… 型情報の持ち腐れ
不完全な型システムややつ らい
dis ばかりでは一面的なので他言語などと比較して ※許せる点 エディタ上だけとはいえインスペクタ働くのは良い 実行時型判定でエラるので早期エラー発見にはなる どちらかといえば「口惜しい」 その他付随したしんどい点 変数名の補完はしてくれないのでめんどい
2. プリミティブ型とオブジ ェクト型で代入の方法が異 なる
VBA は一応オブジェクト指向言語
プリミティブ型とオブジェクト型 C++ やJava と同じ感じ プリミティブ型: Integer, Boolean 等 オブジェクト型: Range,
ユーザ定義等
プリミティブ型とオブジェクト型で代 入の方法が異なる
?
プリミティブ型は Value = 1
オブジェクト型は Set Value = New MyClass
オブジェクト型の場合先頭に をつけなければならない
ミス→ ランタイムエラー エディタは検出してくれない しかもエラーメッセージが謎
検出困難 なれるとそこまで間違わなくなるが、書き始めた初期はヤ バかった。
似たようなつらみ 関数とサブルーチン 返値あり -> 関数 (Function) 返値なし -> サブルーチン (Sub)
の別もある(Fortran にもある)
呼び出し書式が違う
関数は引数に括弧をつける Set Data = Table.GetData(Row, True)
サブルーチンではつけない Table.AddData RowData, True
関数呼び出しの不整合→ ラ ンタイムエラー エディタはスルー
つらい
プリミティブ型とオブジェクト型で代 入の方法が異なる 関数とサブルーチンの呼び出し方法が 異なる つらい
※許せる点 C++ でも値とポインタとの別があるし、(* をつける場合が 有るので) 代入方法が異なると言えなくもない 関数とサブルーチンの別はFortran にもある( サブルーチン はcall
を先頭につけて呼び出す)
3. 関数が第一級オブジェク トではない
自分がこれまで使った言語 JavaScript(ES3,5,2015) Perl5.8 ~5.22 Fortran95 C C++(03 、11) D Java
Python3 Ruby(2.0 以降) C#(5.0 、6.0) Excel VBA TypeScript CoffeeScript 華和梨8.2.8(kis) Windows バッチファイル bash スクリプト
VBA 、バッチファイル、シェルスクリプトのみ 関数が第一級オブジェクトとして扱えない
each map lter VBA では本質的に 以外で実装が出来ない
For Next 回すしかない
つらい
関数が第一級オブジェクトではないの あるのに慣れてるので結構辛い
※許せる……? 点 eval すれば使える DSL ではそういうこともある
4. エディタで1 行ごとに構文 チェックが走る
( 厳密には言語の特徴ではないが) エディタで1 行ごとに構文 チェックが走るのがひどい
Visual Studio とかのIDE も改行したら行整形したりする が……
関数を書こう
if 文を書こう
FirstRowIndex という定数と比較したい 変数名補完が効かないし長いからコピーしてこよう
カーソルを別の行へ
!?
行ごとに文完結してないとエラーがダイアログで出る いちいちOK 押さないと別の編集ができない ついでにまともな修正候補は出ない
とりあえず意味のない値で文完結させて別の行へ
……
きっとこれを面倒がって短いA とかB とかの変数名が書かれ るんだろうと思うと……
エディタで1 行ごとに構文チェックが 走ってしかもいちいちダイアログが出 る つらい
※許せる? 点 不十分すぎるが文法エラー出してくれるのは良い
5. ソースがxlsx バイナリの中 に保存される
つまり自然にバージョン管理や差分比較することが出来な い
※許せる点 xlsx がメインでその付属スクリプトという性格からしょ うがない面がある 比較的許せる
ソースがxlsx バイナリの中に保存され るのつらいけど許せる
6. 継承ができない
「VBA は一応オブジェクト 指向言語」
クラスの継承が出来ない
運用で回避あるある クラスにアクセス制御がなかったりするLL 命名規則とかでなんとかする
回避できない VBA はアクセス制御があるのに継承がない 委譲しよう→関数が第一級ではないのでつらそう
インターフェースは継承をすることは 可能 ' Class1 Implements Class2 Dim Obj1 As Class1
Set Obj1 = new Class1 Call Obj1.class2method ' <- Dim Obj1 As Class1 Set Obj1 = new Class1 Dim Obj2 As Class2 Set Obj2 = Obj1 ' !? Call Obj2.class2method
つらい
他OOP 系のつらみ コンストラクタに引数が渡 せない
Set Obj = New MyClass(hoge) '
Set Obj = New MyClass Obj.Setup(hoge)
つらい
継承ができない コンストラクタに引数が渡 せない ごっつつらい
※許せる点 一応クラスは作れる
7. スタックトレースが存在 しない 呼び出し元しかわからない
エラーにスタックトレースがつかない エラーが起こった処理の呼び出し元しかわからない
最高にヤバい
大抵の言語ではエラー時「スタックト レース」が出る
None
スタックトレースのない言語はシェルスクリプト等他に も存在する しかしそれらは最低限実際にエラーになったソース行が わかる。
in VBA
エラー発生!
情報1: エラー内容とエラーコード ( この時点では行がわからない)
情報2: 呼び出し元の行情報
以上
エラー時に分かる情報 情報1: エラー内容とエラーコード ( 型が一致しません ( エラー 13)) くらいの超簡易な情報 情報2:
呼び出し元の行情報
エラー内容詳細を見たい ヘルプを押しても
None
検索しても
ググるしかない
エラーのたびに…… 1. エラー内容とエラーコード 2. 呼び出し元の行情報 しか提供されないので エラー内容詳細 ググる エラーの起きた場所 呼び出し元からブレークポイントをふりつつ関数を1
つずつ 自分でたどって行を絞り込んでいく
苦行
スタックトレースが存在し ない 呼び出し元しかわからない
※許せない
7 つの大罪 1. 不完全な型システム 2. プリミティブ型とオブジェクト型で代入の方法が異なる 3. 関数が第一級オブジェクトではない 4. エディタで1
行ごとに構文チェックが走る 5. ソースがxlsx バイナリの中に保存される 6. 継承ができない 7. スタックトレース不在 呼び出し元しかわからない
7 つの知見 1. 合理的な型システム 2. 代入や呼び出しの方法が一貫している 3. 第一級関数 4. 柔軟なIDE
5. テキストでソースが保存できる 6. 継承ができる 7. スタックトレースがある 素晴らしい
当たり前に感謝
教訓
次はVBA 以外で やる