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
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.3k
伺か on Browser
narazaka
0
1.5k
真のrequire()をブラウザで
narazaka
0
1.4k
Excelは殺す絶対にだ
narazaka
0
890
Other Decks in Programming
See All in Programming
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
190
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
21
7.2k
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
180
Basic Architectures
denyspoltorak
0
670
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
690
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
210
Grafana:建立系統全知視角的捷徑
blueswen
0
330
Data-Centric Kaggle
isax1015
2
770
CSC307 Lecture 04
javiergs
PRO
0
660
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
430
Unsuck your backbone
ammeep
671
58k
How to build a perfect <img>
jonoalderson
1
4.9k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
85
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
180
Color Theory Basics | Prateek | Gurzu
gurzu
0
200
How to make the Groovebox
asonas
2
1.9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
110
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
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 以外で やる