t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA コーディング上達のコツは、整理整頓 ~まずは変数名から

私の部屋には爪切りが3個ある。部屋が散らかってくるといつもどこかへ行ってしまうが、捨てたわけではないので片付けをしたタイミングでまた見つかったりするからだ。このように、部屋が整頓されていないと、同じものを二個・三個買ってしまったりする。

一方、整理整頓された部屋は機能的で見通しがよく、どこに何があるのかすぐわかる。
ものの置き場所はちゃんと決まっており、棚やケースにきちんと収まっている。
箱にはラベルが張られ、いちいち開けなくてもパッと見ただけで中身が分かる。

さて、整理整頓の考えが重要なのはプログラミングの世界でも同じである。
プログラミングスキル上級者はコードの整理整頓が上手い。
というのも、ある程度プログラムが大きくなってくると、ちゃんと整理整頓しておかないとたちまち手に負えなくなるからである。

たとえ自分で作ったコードでも月日がたてば細部は忘れてしまうものである。
特に忘れやすいのは変数の役割である。そこで今回は、良い変数名とはどういうものか、私の考えを書き記そうと思う。

コーディング中はプログラムのロジックに集中するため、変数名のつけ方が適当になりがちだ。それはそれで良い。変数名を何にするか頭を悩ませていると、ロジックに集中すべき思考が中断してしまう。コードが閃いたら、とりあえずその場で頭に浮かんだ適当な短い変数名をつけて、素早く書き上げてしまいたい。

しかし、忘れないうちにちゃんとした名前をつけておかないと、結局あとで訳が分からなくなる。書きあがって無事に動作したら、まだ記憶が新しいうちに変数名を直してしまうと良い。

変数名のつけ方

変数名の形式

マイクロソフトガイドラインによれば、英語の変数名はPascal(パスカル)形式かCamel(キャメル)形式のいずれかが良いらしい。Snake(スネーク)形式というものもあるが、これは推奨されていない。

Pascal形式とは、単語の最初の一文字を大文字にするスタイルである。
例えば、最終行を表す"last row"という単語をPascal形式の変数にすると、LastRowとなる。Pascalという言語で採用されている形式なのでPascal形式である。VBAの標準的な記法はPascal形式なので、こだわりが無ければ英語変数はPascal形式にしておくと良いと思う。

Camel形式とは、最初の単語はすべて小文字、二つ目以降の単語は先頭を大文字にするスタイルである。先ほどの例でいうと、lastRowとなる。Camelとはラクダのことで、見た目がラクダみたいに頭が低くてコブがあるから。

Snake形式とは、単語をアンダーバーでつなぐスタイルである。同じ例でいうと、last_rowとなる。Snakeというのはヘビのように地べたに張り付いて見えるから。なぜ非推奨なのかは知らないが、マイクロソフトがそう言うんだから、とりあえずVBAにおいては極力使わないでおこうと思う。

変数名の長さ

変数名は255文字までつけられるらしい。
実際にやってみた。

Sub 長ーい変数テスト()
    Dim aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa As Integer
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 50
    Dim bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb As Integer
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = 20
    Dim ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc As Integer
    ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc = _
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * _
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    Debug.Print ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
End Sub

ちゃんと動くみたいだ。ただし、255文字から1文字でも増やすと「識別子が長すぎます」というエラーになる。(初めてみた。)

もちろん、いたずらに長い変数名は可読性を落としてしまうが、変数名は意外に情報を詰め込むことができるということを示すためにあえて紹介した。

さて、MSDNの一般的な名前付け規則というページに、次の文章がある。

簡潔さよりもわかりやすさを優先します。 プロパティ名としては、ScrollableX よりも CanScrollHorizontally の方がより適切です。ScrollableX では、"X" が X 軸を意味しているのかどうかがあいまいだからです。

https://msdn.microsoft.com/ja-jp/library/ms229045(v=VS.100).aspx

ネットで探してきたサンプルなどは短い変数名で書かれていることが多いが、あれはあくまでサンプルだからである。
ある程度プログラムの規模が大きくなってくると、変数名にそれなりに情報を詰め込んでやらないと、すぐに何の変数かわからなくなってしまう。

変数には、その変数が指すものを一意に特定できる名前をつけるのが望ましい。
例えば、顧客シートで現在指している行を保持する変数を作るとする。

以下に挙げるような変数名はどれも宜しくない。

適当な変数     tmp
単一の文字     r
一般的でない略称  CR
一意に特定できない CurrentRow
シート1が何なのか分からない Sheet1CurrentRow
ハンガリアン記法  lngCurrentRow
半端な省略     CusShCurRow


良い変数名の候補はCustomerSheetCurrentRowである。変数名を見れば何の変数なのかが一目瞭然だ。
あるいはそのまま日本語で「顧客シート現在行」という変数名でも良い。
まさに読んで字のごとし。漢字のおかげで横幅が少しコンパクトに収まるのもメリットだ。

しかし、ここまで書いたことはあくまで原則である。
宣言から使い終わりまで一画面で見渡せるような短いスコープ(有効範囲)の変数には、むしろ短い名前をつけるのが良い。変数の登場する範囲が狭ければ、周囲のコードを見てその変数がどのように使われているかが読み取れるため、名前だけに頼る必要がない。そのような場面、長い変数名はむしろ可読性を下げてしまうかもしれない。
一方、広範囲にわたって登場する変数は、多少変数名が長くなってでも名前にしっかり情報を込めておかないと、何をしているのかわからなくなる。

短い変数名でも覚えられるから問題ないという意見もあるだろうが、変数の意味を記憶することにも貴重な脳のリソースを費やしているということを意識しておきたい。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。