Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA 上級者から初段へ③ 変数名などの簡単な命名規則

VBAのプログラミングで上級者から初段にステップアップする為のシリーズの3回目です。今回はメンテナンス性と開発効率を上げるのに役立つ、変数名やプロシジャ名の付け方について解説します。

この記事は上級です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

名前の付け方にルールを作る

今までは変数名やプロシジャ名の付け方に特にこだわってきませんでした。たった一つ気にすべき事は分かりやすい名前をつけると言うことだけでした。この中身が分かりやすいと言う事が最も大事です。命名方法にルールを作ることで、より分かりやすい名前がつけられるようになります。順に見て行きましょう。

ルールを作るメリット

ルールを作る事によるメリットは下記の2点です。

  1. 命名で悩まなくなるので開発効率がアップする
  2. メンテナンスしやすくなる

自分なりのルールが無いと何という名前をつけるか悩んでしまいます。ルールを作ることで悩む時間を減らしていきましょう。また、ルールを作っておくことによって変数名やプロシジャ名が分かりやすくなるため、メンテナンス性が向上します。

ルール自体は何でもいいがある程度の一貫性を持たせる

ルールとはたとえば変数はアルファベットの小文字から始める、と言った事です。変数名は日本語というルールでも構いません。大事なのは一貫性を持たせることです。最終行を代入する変数を「行数」という変数に入れたのに、別のプロシジャでは「rw」などとしていたらよく分からなくなります。ある程度の一貫性は必要です。ある程度、と言うのは縛られすぎる必要も無いからです。かえって窮屈になるようであれば、例外的にルールを破っても構いません。その時は宣言する近くにコメントを残しておくようにしましょう。

ルールの付け方の例

ここでは日本語バージョンの名前の付け方と英語バージョンの名前の付け方を紹介します。ちなみに変数名を日本語でつけられるのは私が知る限りVBAのみです。将来的に他言語を学ぶ予定のある人はアルファベットでの名前になれておいた方が良いかもしれません。

日本語の例

日本語で命名するメリットは、やはり母国語なので分かりやすいことです。まずは日本語による命名を見て行きます。

日本語の変数名の例

日本語の変数名の例は下記の通りです。

  • 行_long
  • 作業用シート_ws
  • 検索範囲_rng
  • 内部系算用配列_var
  • 入力データ_wb

単語をアンダースコアでつないで一単語にする命名の方法をスネークケースと言います。変数の中身が分かるように日本語で記述しアンダースコアの後ろに変数の型を記述しています。型が分かるように命名することはメンテナンス性の面でも開発効率の面でもメリットがあるので、身に付けておきましょう。

日本語のモジュール名の例

次にモジュール名を見てみましょう。前回の標準モジュールの役割を理解して処理の流れにこだわるで解説した売上管理と受注処理の機能を持ったツールの標準モジュールのイメージです。イメージがわきやすいように、上手な標準モジュールの使い方の図を再掲しておきます。

再掲:上手な標準モジュールの使い方の図
再掲:上手な標準モジュールの使い方の図

  • A_メインモジュール
  • B_売上管理モジュール
  • C_受注処理モジュール

標準モジュールは機能ごとに作成し、どのモジュールを使うかを統括するメインの標準モジュールを使うのが上手なモジュールの使い方でした。メインのモジュールはメインモジュール、売上管理のプロシジャが書かれているモジュールは売上管理モジュール、と言った具合です。

冒頭にA_やB_などの文字をつけているのは、プロジェクトエクスプローラで見たときにこの順番で表示させたいためです。アルファベット順にしているわけですね。

アルファベット順にして見やすくした標準モジュール
アルファベット順にして見やすくした標準モジュール

日本語のSubプロシジャ名の例

次にプロシジャ名の命名を見て行きます。同じく売上管理と受注処理の機能を持ったツールの例です。

  • メイン
  • 売上管理メイン
  • 受注処理メイン
  • 最新売上データ取り込み
  • 受注データ生成
  • 配信用メール作成

それぞれの標準モジュール内のSubプロシジャ名をイメージしました。内容がよく分かるようになっています。売上管理メインはPublic Subです。A_メインモジュールの中のプロシジャから呼び出されます。B_売上管理モジュール内のPublicのSubプロシジャはこの売上管理メインのみです。なぜなら、この機能に必要なプロシジャは全てこのB_売上管理モジュール内に記述する為です。

念のために売上管理メインのコードの例を挙げます。

Public Sub 売上管理メイン()

    Call 最新売上データ取り込み
    Call 前回データ取り込み
    Call データ更新
    Call グラフ更新
    Call 更新済みデータのみ保存
    Call 配信用メール作成

End Sub

Callで呼び出されるそれぞれの「最新売上データ取り込み」などのプロシジャは同じモジュール内に記述するため、Private Subを使います。

日本語のFunctionプロシジャ名

Functionプロシジャはその名の通り、関数を自分で作る事ですので、関数っぽい名前が良いと思います。

  • 売上目標達成人数カウンター
  • 高額受注件数カウンター

いろいろな関数を作る必要があるのであれば、それはクラスにする事も検討しますが、今はFunctionプロシジャを使いこなせて、命名ができればOKです。

日本語のクラス名

クラスは初段向けの解説記事に書きます。私はクラス名に日本語をつけたことはありません。その理由は「何となく違和感があるから」です。とはいえ、日本語で命名することももちろん可能ですので、考えられる例を挙げたいと思います。

  • ブック開く
  • メール作成
  • グラフ更新

このようにある程度まとまった作業群で、かつ複数のモジュールで使い回せる様な部分は機能を明示したクラス名をつけると良いでしょう。

英語の例

次にアルファベットで命名する場合の例です。アルファベットの命名規則には大きく分けて2つの考え方があります。

  • 大文字からはじまるのか小文字から始まるのかアンダースコアから始まるのか
  • キャメルケースを使うのかスネークケースを使うのか

まず、大文字小文字について考え方を統一しておく必要があります。一般的には変数やプロシジャ名は小文字で始まり、クラス名は大文字で始める場合が多いです。ルール自体は何でもいいのですが、特にこだわりが無ければ一般的な方法に従っておけば良いと思います。

アンダースコアから始まるのは機械学習で学習結果を格納する変数の場合です。VBAで機械学習をしようとする人はあまりいないと思いますが、何らかの計算の結果得られた数値や配列をアンダースコアから始まる変数に入れておくのは分かりやすくてよいと思います。

もう一つのキャメルケースとスネークケースは好きな方を選べば良いと思います。簡単に説明しておくと下記の通りです。

  • キャメルケース

単語の最初の文字を大文字にする。あるいは2単語目以降の単語の文字を大文字にする
例)LastRow, HeaderRow, LastColumn

「変数は小文字で始まる」という命名規則を適用するなら、上の例は下記のようになります。
例)lastRow, headerRow, lastColumn

  • スネークケース

単語間をアンダースコアでつなぐ。
例)last_row, header_row, last_column

英語の変数名の例

私はスネークケースの方が好きなので、変数名にはスネークケースを使います。さらに、変数は小文字から始まるルールと、型名が分かる方が好きなのでそれを組み合わせると、英語の変数名はこのようになります。

  • rw_long
  • calcsheet_ws
  • lookup_range_rng
  • calcarr_var
  • input_book_wb

ルールを組み合わせて命名する感覚が伝わるでしょうか。

英語のプロシジャ名の例
  • main_main
  • sales_management_main
  • order_process_main
  • get_sales_data
  • create_sales_data
  • create_email

このようにしておけばmainがついているのがPublicのSubプロシジャ、mainがついていないのがprivateのSubプロシジャだと分かりますね!工夫次第で便利になるなら命名規則も工夫した方が良いです。

ちなみに・・・エクセルの流儀はキャメルケース

ちなみにエクセルさんはキャメルケースを採用しています。

オブジェクトブラウザでWorkbookクラスを調べたところ
オブジェクトブラウザでWorkbookクラスを調べたところ

私はPythonという他の言語の影響も在り、また、見やすいことからスネークケースを使っています。しかし、エクセルさんはキャメルケースでクラスのメンバーが定義されています。個人的には残念ですが、自分の使いやすいルールを決めましょう。

命名規則(ルール)の作り方まとめ

これまでいろいろな命名の例を見てきました。最後にルールの作り方をまとめます。

  • 日本語/英語か決める
  • 大文字/小文字の考え方を決める
  • 変数なら型の情報を入れるかどうか決める
  • キャメルケース/スネークケースを決める

使うときは上の4点を組み合わせた命名を行います。分かりやすいコードを目指して命名していきましょう。メインの標準モジュールの冒頭に命名規則をコメントアウトして書いておくといいかもしれませんね。