Upgrade to Pro — share decks privately, control downloads, hide ads and more …

VBAナメてた

Narazaka
April 27, 2016

 VBAナメてた

〜VBAを使ったら絶対に後悔する7つの理由〜
社内でLTしたスライドです

Narazaka

April 27, 2016
Tweet

More Decks by Narazaka

Other Decks in Programming

Transcript

  1. VBA
    ナメてた
    @narazaka

    View full-size slide

  2. 奈良阪
    自己紹介
    Twitter:
    Github:
    npm:
    CPAN:
    RubyGems:
    ドリコム2015
    新卒入社 サーバーサイドRuby
    好きな言語: Perl / CoffeeScript / Ruby / C# / Ceylon?
    その他:
    伺か/
    漫画読み描き/OP
    アニメ愛好家/

    @narazaka
    @Narazaka
    @narazaka
    NARAZAKA
    Narazaka

    View full-size slide

  3. VBA
    (Visual Basic for Applications)
    1994
    年のExcel5.0
    から付属したマクロ用言語
    Excel
    が有名だがWord
    やPowerPoint
    等でも使える

    View full-size slide

  4. 顧客が説明した要件
    プランナーさん:
    クエスト作成を便利にしてや
    奈良阪: xlsx
    使っとるしVBA
    やと移行コスト低そうか?

    View full-size slide

  5. プログラマの見積もり
    プランナーさん:
    ウィッスオナシャス
    奈良阪:
    メンテコスト高いらしい
    奈良阪:
    綺麗にかいたらそんなでもないやろ(
    慢心)

    View full-size slide

  6. VBA
    ナメてました

    View full-size slide

  7. 「Excel
    マクロつらい」

    View full-size slide

  8. 謎のセル指定

    View full-size slide

  9. なるほど……

    View full-size slide

  10. VBA
    、オブジェクト指向言語らしい?
    クラス書いたらよくね?

    View full-size slide

  11. 適切な変数名でマシになるっしょ?
    table_area = Range(area_begin, area_end)

    View full-size slide

  12. クラスにもした
    変数名関数名とかにも気を配った

    View full-size slide

  13. でもそういう問題ではなかった

    View full-size slide

  14. VBA
    ||
    20
    世紀のMS
    製品

    View full-size slide

  15. 最近のMicrosoft
    に毒気を抜かれて忘れていた

    View full-size slide

  16. 生産性が惨殺される体感

    View full-size slide

  17. 古き良きM$
    を思い出させてくれる糞仕様の数々

    View full-size slide

  18. VBA
    を使ったら絶対に後悔
    する7
    つの理由
    (
    煽りタイトル)

    View full-size slide

  19. 1.
    不完全な型システム

    View full-size slide

  20. VBA
    は一応オプショナルな変数型指定
    を持ちます

    View full-size slide

  21. TypeScript
    のように、変数宣言時や関数宣言時にオプショ
    ンで型をつけられる
    これは良い

    View full-size slide

  22. 型付で宣言された変数はエディタ上でインスペクタが出て
    使えるメソッドとかが出てくる
    これも良い

    View full-size slide

  23. 型情報最高!!

    View full-size slide

  24. にもかかわらず

    View full-size slide

  25. エディタでもコンパイラでも型チェッ
    クされない

    View full-size slide

  26. 「型が一致しません (
    エラー 13)
    」はランタイムエラー

    View full-size slide

  27. 引数の順番とか間違えてても全部ランタイムエラー

    View full-size slide

  28. せっかく入力したのに……
    型情報の持ち腐れ

    View full-size slide

  29. 不完全な型システムややつ
    らい

    View full-size slide

  30. dis
    ばかりでは一面的なので他言語などと比較して
    ※許せる点
    エディタ上だけとはいえインスペクタ働くのは良い
    実行時型判定でエラるので早期エラー発見にはなる
    どちらかといえば「口惜しい」
    その他付随したしんどい点
    変数名の補完はしてくれないのでめんどい

    View full-size slide

  31. 2.
    プリミティブ型とオブジ
    ェクト型で代入の方法が異
    なる

    View full-size slide

  32. VBA
    は一応オブジェクト指向言語

    View full-size slide

  33. プリミティブ型とオブジェクト型
    C++
    やJava
    と同じ感じ
    プリミティブ型: Integer, Boolean

    オブジェクト型: Range,
    ユーザ定義等

    View full-size slide

  34. プリミティブ型とオブジェクト型で代
    入の方法が異なる

    View full-size slide

  35. プリミティブ型は
    Value = 1

    View full-size slide

  36. オブジェクト型は
    Set Value = New MyClass

    View full-size slide

  37. オブジェクト型の場合先頭に
    をつけなければならない

    View full-size slide

  38. ミス→
    ランタイムエラー
    エディタは検出してくれない
    しかもエラーメッセージが謎

    View full-size slide

  39. 検出困難
    なれるとそこまで間違わなくなるが、書き始めた初期はヤ
    バかった。

    View full-size slide

  40. 似たようなつらみ
    関数とサブルーチン
    返値あり ->
    関数 (Function)
    返値なし ->
    サブルーチン (Sub)
    の別もある(Fortran
    にもある)

    View full-size slide

  41. 呼び出し書式が違う

    View full-size slide

  42. 関数は引数に括弧をつける
    Set Data = Table.GetData(Row, True)

    View full-size slide

  43. サブルーチンではつけない
    Table.AddData RowData, True

    View full-size slide

  44. 関数呼び出しの不整合→

    ンタイムエラー
    エディタはスルー

    View full-size slide

  45. プリミティブ型とオブジェクト型で代
    入の方法が異なる
    関数とサブルーチンの呼び出し方法が
    異なる
    つらい

    View full-size slide

  46. ※許せる点
    C++
    でも値とポインタとの別があるし、(*
    をつける場合が
    有るので)
    代入方法が異なると言えなくもない
    関数とサブルーチンの別はFortran
    にもある(
    サブルーチン
    はcall
    を先頭につけて呼び出す)

    View full-size slide

  47. 3.
    関数が第一級オブジェク
    トではない

    View full-size slide

  48. 自分がこれまで使った言語
    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
    スクリプト

    View full-size slide

  49. VBA
    、バッチファイル、シェルスクリプトのみ
    関数が第一級オブジェクトとして扱えない

    View full-size slide

  50. each
    map
    lter
    VBA
    では本質的に 以外で実装が出来ない

    View full-size slide

  51. For Next
    回すしかない

    View full-size slide

  52. 関数が第一級オブジェクトではないの
    あるのに慣れてるので結構辛い

    View full-size slide

  53. ※許せる……?

    eval
    すれば使える
    DSL
    ではそういうこともある

    View full-size slide

  54. 4.
    エディタで1
    行ごとに構文
    チェックが走る

    View full-size slide

  55. (
    厳密には言語の特徴ではないが)
    エディタで1
    行ごとに構文
    チェックが走るのがひどい

    View full-size slide

  56. Visual Studio
    とかのIDE
    も改行したら行整形したりする
    が……

    View full-size slide

  57. 関数を書こう

    View full-size slide

  58. if
    文を書こう

    View full-size slide

  59. FirstRowIndex
    という定数と比較したい
    変数名補完が効かないし長いからコピーしてこよう

    View full-size slide

  60. カーソルを別の行へ

    View full-size slide

  61. 行ごとに文完結してないとエラーがダイアログで出る
    いちいちOK
    押さないと別の編集ができない
    ついでにまともな修正候補は出ない

    View full-size slide

  62. とりあえず意味のない値で文完結させて別の行へ

    View full-size slide

  63. きっとこれを面倒がって短いA
    とかB
    とかの変数名が書かれ
    るんだろうと思うと……

    View full-size slide

  64. エディタで1
    行ごとに構文チェックが
    走ってしかもいちいちダイアログが出

    つらい

    View full-size slide

  65. ※許せる?

    不十分すぎるが文法エラー出してくれるのは良い

    View full-size slide

  66. 5.
    ソースがxlsx
    バイナリの中
    に保存される

    View full-size slide

  67. つまり自然にバージョン管理や差分比較することが出来な

    View full-size slide

  68. ※許せる点
    xlsx
    がメインでその付属スクリプトという性格からしょ
    うがない面がある
    比較的許せる

    View full-size slide

  69. ソースがxlsx
    バイナリの中に保存され
    るのつらいけど許せる

    View full-size slide

  70. 6.
    継承ができない

    View full-size slide

  71. 「VBA
    は一応オブジェクト
    指向言語」

    View full-size slide

  72. クラスの継承が出来ない

    View full-size slide

  73. 運用で回避あるある
    クラスにアクセス制御がなかったりするLL
    命名規則とかでなんとかする

    View full-size slide

  74. 回避できない
    VBA
    はアクセス制御があるのに継承がない
    委譲しよう→関数が第一級ではないのでつらそう

    View full-size slide

  75. インターフェースは継承をすることは
    可能
    ' 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

    View full-size slide

  76. 他OOP
    系のつらみ
    コンストラクタに引数が渡
    せない

    View full-size slide

  77. Set Obj = New MyClass(hoge) '

    View full-size slide

  78. Set Obj = New MyClass
    Obj.Setup(hoge)

    View full-size slide

  79. 継承ができない
    コンストラクタに引数が渡
    せない
    ごっつつらい

    View full-size slide

  80. ※許せる点
    一応クラスは作れる

    View full-size slide

  81. 7.
    スタックトレースが存在
    しない
    呼び出し元しかわからない

    View full-size slide

  82. エラーにスタックトレースがつかない
    エラーが起こった処理の呼び出し元しかわからない

    View full-size slide

  83. 最高にヤバい

    View full-size slide

  84. 大抵の言語ではエラー時「スタックト
    レース」が出る

    View full-size slide

  85. スタックトレースのない言語はシェルスクリプト等他に
    も存在する
    しかしそれらは最低限実際にエラーになったソース行が
    わかる。

    View full-size slide

  86. エラー発生!

    View full-size slide

  87. 情報1:
    エラー内容とエラーコード
    (
    この時点では行がわからない)

    View full-size slide

  88. 情報2:
    呼び出し元の行情報

    View full-size slide

  89. エラー時に分かる情報
    情報1:
    エラー内容とエラーコード
    (
    型が一致しません (
    エラー 13))
    くらいの超簡易な情報
    情報2:
    呼び出し元の行情報

    View full-size slide

  90. エラー内容詳細を見たい
    ヘルプを押しても

    View full-size slide

  91. 検索しても

    View full-size slide

  92. ググるしかない

    View full-size slide

  93. エラーのたびに……
    1.
    エラー内容とエラーコード
    2.
    呼び出し元の行情報
    しか提供されないので
    エラー内容詳細
    ググる
    エラーの起きた場所
    呼び出し元からブレークポイントをふりつつ関数を1
    つずつ
    自分でたどって行を絞り込んでいく

    View full-size slide

  94. スタックトレースが存在し
    ない
    呼び出し元しかわからない

    View full-size slide

  95. ※許せない

    View full-size slide

  96. 7
    つの大罪
    1.
    不完全な型システム
    2.
    プリミティブ型とオブジェクト型で代入の方法が異なる
    3.
    関数が第一級オブジェクトではない
    4.
    エディタで1
    行ごとに構文チェックが走る
    5.
    ソースがxlsx
    バイナリの中に保存される
    6.
    継承ができない
    7.
    スタックトレース不在 呼び出し元しかわからない

    View full-size slide

  97. 7
    つの知見
    1.
    合理的な型システム
    2.
    代入や呼び出しの方法が一貫している
    3.
    第一級関数
    4.
    柔軟なIDE
    5.
    テキストでソースが保存できる
    6.
    継承ができる
    7.
    スタックトレースがある
    素晴らしい

    View full-size slide

  98. 当たり前に感謝

    View full-size slide

  99. 次はVBA
    以外で
    やる

    View full-size slide