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.2k
伺か on Browser
narazaka
0
1.2k
真のrequire()をブラウザで
narazaka
0
1.3k
Excelは殺す絶対にだ
narazaka
0
770
Other Decks in Programming
See All in Programming
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
310
命名をリントする
chiroruxx
1
390
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
900
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
160
今年一番支援させていただいたのは認証系サービスでした
satoshi256kbyte
1
250
たのしいparse.y
ydah
3
120
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
710
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
330
責務を分離するための例外設計 - PHPカンファレンス 2024
kajitack
1
390
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
700
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
300
SymfonyCon Vienna 2025: Twig, still relevant in 2025?
fabpot
3
1.2k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Writing Fast Ruby
sferik
628
61k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
95
17k
Become a Pro
speakerdeck
PRO
26
5k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Unsuck your backbone
ammeep
669
57k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Typedesign – Prime Four
hannesfritz
40
2.4k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
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 以外で やる