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.4k
伺か on Browser
narazaka
0
1.5k
真のrequire()をブラウザで
narazaka
0
1.4k
Excelは殺す絶対にだ
narazaka
0
890
Other Decks in Programming
See All in Programming
AI Assistants for YourAngular Solutions @Angular Graz, March 2026
manfredsteyer
PRO
0
100
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
250
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
4.2k
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
400
RailsのValidatesをSwift Macrosで再現してみた
hokuron
0
130
生成 AI 時代のスナップショットテストってやつを見せてあげますよ(α版)
ojun9
0
310
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
560
ロボットのための工場に灯りは要らない
watany
12
3.2k
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
1.1k
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
570
ファインチューニングせずメインコンペを解く方法
pokutuna
0
190
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.4k
Featured
See All Featured
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
160
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
340
A designer walks into a library…
pauljervisheath
210
24k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Making the Leap to Tech Lead
cromwellryan
135
9.8k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
52k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
240
[SF Ruby Conf 2025] Rails X
palkan
2
860
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Limits of Empathy - UXLibs8
cassininazir
1
270
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 以外で やる