■ 変数やオブジェクトの命名法について
識別子とは開発者がソースコード上で命名した、変数、関数、クラスや構造体などの名前です。
この識別子は基本的に開発者が自由に命名できるため、個人で開発する分にはわかりやすければそれでよい、と思われがちですが、やはり最低限のルールと開発効率を向上させる命名法というものが存在します。
適切なコーディング規則を適用することで、理解しやすく、かつ他言語の規則に矛盾しない、正確で読みやすいソースコードを作成することができるようになります。
そうです。識別子の命名こそが、自分にも他人にもわかりやすく、正しくて保守性の良い、美しいプログラムを作成するカギを握っているのです。
識別子として有効になるには、次の制約があります
Excel VBAでは、識別子は255バイトまで指定でき、英数字および日本語と一部の記号が使用できます。ただし、先頭には記号と数字は使えません。
・先頭は文字(英字または日本語)でなければなりません
・スペースや"." "!"などの記号、型宣言文字は使用できません
・変数や定数、プロシージャの名前は255バイト以内である必要があります
・コントロール、モジュールの名前は 40バイト以内である必要があります
・予約語(ステートメント、関数、プロパティ、メソッド)と同じ名前は使用できません
識別子の大文字・小文字のスタイル
・Pascal 形式
識別子の最初の文字と、後に続いて連結されている各単語の最初の文字を大文字にします。
・Camel 形式
識別子の最初の文字は小文字にし、後に続いて連結されている各単語の最初の文字を大文字にします。
・大文字
識別子のすべての文字を大文字にします。
・ハンガリアン記法(ハンガリー記法)
変数名にプリフィックスを組み入れた命名法で最近はあまり推奨されなくなりました。ハンガリー記法はMicrosoftのハンガリー出身のプログラマCharles Simonyiにちなんだものです。
(ここで述べるハンガリアン記法はシステムハンガリアンのことで、アプリケーションハンガリアンに関しては本文では触れません)
識別子は宣言部で宣言した際の大文字・小文字が適用されます。
例:
Dim StrFileName As String
と宣言部で定義された変数、StrFileNameは、strFileNameやSTRFILENAMEと記述しても、自動的にStrFileNameに記述しなおされます。
また、同じスコープ内で大文字小文字による識別子の区別を行いません。例えばmystrという文字列型変数とMYSTRという文字列型変数を、同一のスコープ内で異なる変数として定義することはできません。
一般的な名前付け規則
命名規則は一般的にわかりやすいものを採用します。短縮形や省略形の使用は推奨されていません。
また、アンダースコアやハイフンの使用も推奨されていません。
その他、広く使用されているプログラミング言語のキーワードと競合する識別子は使用しないのが一般的です。
関数名やメソッド名は動詞で始まること、またクラス名やプロパティ名は名詞で始まることが推奨されています。
VBA、VB6.0にはネームスペースという概念がありません。クラスに関してはクラス名が、ある意味ネームスペースの代わりを果たしますが、標準モジュールではPrivate指定をしない限りグローバルスコープになります。
ただし、別々の標準モジュールに記述された同一名称のPublicプロシージャの場合、モジュール名で修飾することによって、名前の衝突を回避できます。
例:
Public Sub main()
Call Module1.test
Call Module2.test
End Sub
' Module1に記述されたtestプロシージャ
Public Sub test()
Debug.Print "Module1.test"
End Sub
' Module2に記述されたtestプロシージャ
Public Sub test()
Debug.Print "Module2.test"
End Sub
このサンプルでは、mainプロシージャから最初にModule1のtestプロシージャがCallされたあと、Module2のtestプロシージャがCallされます。
通常はプロシージャ名だけで関数を呼び出しますが、それは
「プロジェクト名.モジュール名.プロシージャ名」で呼び出すのを省略しているだけです。
例:
Call VBAProject.Module1.test
Call test
testプロシージャが重複しない場合、上記はどちらも同一プロジェクト内のModule1から、testプロシージャをCallしています。(重複している場合、上のステートメントは実行されますが、下のステートメントはコンパイルエラーになります)
同様にグローバル変数が重複している場合も、変数をモジュール名で修飾することで名前の衝突を回避できます。
例:
Module1.MyStr = Module2.MyStr & MyStr
上記のコードをModule3から実行した場合、Module2に定義されたパブリック変数MyStrに、Module3で定義されたパブリック変数MyStrの値を連結し、Module1に定義されたMyStrに代入します。
(注)Module3内にパブリックまたはモジュールレベル、またはプロシージャレベルでMyStrが定義されていない場合、コンパイルエラーになります。(名前の衝突が発生します)
同一のスコープ(適用範囲)で同じ名前の変数が存在する場合は、修飾子を省略すると最も近い適用範囲で宣言されている変数が使用されます。
異なるスコープ(適用範囲)で同じ名前の変数が存在する場合は、該当する適用範囲のうち最も狭い範囲で宣言されている変数が使用されます。
ちなみに特殊なケースを除いて重複する、変数名、プロシージャ名、コントロール名などを使用することは推奨しません。識別子は"できる限り"重複しないことが基本です。
プリフィックス(接頭語)とサフィックス(接尾語)について
オブジェクト、変数、およびプロシージャの名前付け規則において、プリフィックス・サフィックスを用いることで可読性を増すことがあります。ただしこれらの命名規則は絶対的なものではなく、開発プロジェクトに応じて柔軟に適用することを推奨します。
データ型による一般的なプリフィックス |
オブジェクト名につける一般的なプリフィックス |
ブール型 |
bln |
テキストボックス |
txt |
整数型 |
int |
ラベル |
lbl |
長整数型 |
lng |
リストボックス |
lst |
単精度浮動小数点数型 |
sng |
コンボボックス |
cbo |
倍精度浮動小数点数型 |
dbl |
チェックボックス |
chk |
文字列型 |
str |
コマンドボタン |
cmd |
エラー型 |
err |
コモンダイアログ |
dlg |
オブジェクト型 |
obj |
フレーム |
fra |
適用範囲を示す一般的なプリフィックス |
イメージ |
img |
グローバルスコープ |
g |
|
|
モジュールスコープ |
m |
|
|
プロシージャスコープ |
なし |
|
|
ちなみに、型宣言のためのサフィックスや、数値リテラルのプリフィックスは、上記とは異なるものです。混同しないように注意してください。
例:
Dim Count&
Dim Password$
サフィックスの"&"、"$"で型宣言をしています。上記のCountは長整数型を、Passwordは文字列型を定義しています。
例:
&H8000
&O100000
整数リテラルにプリフィックス"&H"(16進数)、"&O"(8進数)で基数を強制させています。上記の整数はどちらも10進数の32768を表します。
以上、変数名やオブジェクト名の一般的な命名規則について解説しました。
識別子をいかに命名するかが、そのあとの開発効率に大きく影響します。くれぐれも安易なネーミングをして、開発効率を低下させないように気をつけてください。
これは大規模な開発になればなるほど、注意すべき部分です。
最後に、一般的なコーディング規則について紹介します
VBAの言語仕様にはコーディング規則は定義されませんが、コーディング規則に則って記述することで次のメリットが得られます。
・コードの可読性が上がります
・コードの修正、メンテナンスが容易になります
・プロジェクトなど複数員の開発を行うとき、識別子の衝突や誤解によるコーディングミスを回避することができます。
■レイアウト規則
必ずインデントを挿入します。
インデントは可読性を上げるだけでなく、ロジックの構造を理解するのに役立ちます。なおインデントのタブ文字数は統一してください。(スペースをタブの代わりに使用しないでください) |
可読性を高めるために長いステートメントは行継続文字" _"(スペースとアンダースコア)を使用して、複数行に分割します。
(継続行には、可読性を上げるためインデントを挿入してください) |
If文を1行に記述することも避けます。
If文を1行に記述することは、If〜End Ifのブロック構造を崩し、構造化プログラミングの原則をないがしろにするものです。 |
同じ理由で、1つの行に":"を用いて、複数のステートメントを記述することは避けます。 |
変数の宣言部では、1つの行に1つの宣言を記述するようにします。 |
■コメント規則
コメントは、コード行の末尾に記述するのではなく、できるだけ別個の行に記述するようにします。
(ブロックコメントを推奨、インラインコメントは変数の宣言部などを除き、推奨しません) |
■プロシージャの記述順序
Excel VBAではプロシージャは好きな順序で記述できます。ですので、どのような順初で記述してもコンパイルエラーにはなりません。
しかし、可読性を考えるなら、一定のルールに基づいて記述したほうが、より可読性を高めるといえるでしょう。
標準モジュール
|
呼び出す側のコードを先に記述します。
呼び出される側はその階層に応じて下に記述していきます。 |
フォームモジュール |
コントロールの配置順序に合わせて記述していきます。 |
Excel VBAには厳格なコーディング規則というものがありません。他の言語と比較しても、開発者が書きたいように、自由に記述できる開発言語です。
それゆえ、標準のコーディングルールは無視されやすい傾向があります。
しかし、標準のコーディング規則に近づけることで、より可読性の高いコードを記述することが可能になります。
標準化することで、多くのメリットが得られるでしょう。
ぜひ今後の開発の、参考にしてください。
|