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
1.9k
VBAナメてた
〜VBAを使ったら絶対に後悔する7つの理由〜
社内でLTしたスライドです
Narazaka
April 27, 2016
Tweet
Share
More Decks by Narazaka
See All by Narazaka
UEFIでうごくゲームを作ってみた〜2017年夏休みの自由研究〜
narazaka
0
7.3k
伺か on Browser
narazaka
0
1.2k
真のrequire()をブラウザで
narazaka
0
1.3k
Excelは殺す絶対にだ
narazaka
0
780
Other Decks in Programming
See All in Programming
責務を分離するための例外設計 - PHPカンファレンス 2024
kajitack
9
2.4k
watsonx.ai Dojo #6 継続的なAIアプリ開発と展開
oniak3ibm
PRO
0
180
『改訂新版 良いコード/悪いコードで学ぶ設計入門』活用方法−爆速でスキルアップする!効果的な学習アプローチ / effective-learning-of-good-code
minodriven
28
4.3k
令和7年版 あなたが使ってよいフロントエンド機能とは
mugi_uno
11
5.5k
自動で //nolint を挿入する取り組み / Gopher's Gathering
utgwkk
1
110
Fibonacci Function Gallery - Part 2
philipschwarz
PRO
0
220
“あなた” の開発を支援する AI エージェント Bedrock Engineer / introducing-bedrock-engineer
gawa
7
650
ESLintプラグインを使用してCDKのセオリーを適用する
yamanashi_ren01
2
250
chibiccをCILに移植した結果 (NGK2025S版)
kekyo
PRO
0
150
[JAWS-UG横浜 #80] うわっ…今年のServerless アップデート、少なすぎ…?
maroon1st
0
120
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
190
2025.01.17_Sansan × DMM.swift
riofujimon
2
580
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
98
18k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Bash Introduction
62gerente
610
210k
Designing for Performance
lara
604
68k
4 Signs Your Business is Dying
shpigford
182
22k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
39
1.9k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Building Adaptive Systems
keathley
38
2.4k
Music & Morning Musume
bryan
46
6.3k
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 以外で やる