上級者を目指すExcelVBA #6 『ネーミングルール』

変数名や定数名、関数名を付けるときは、一貫したルールで名前を付けましょう。

適当に名前を付けた場合、定数と変数の区別がつかなかったり、変数のスコープがどこまでなのか分からなかったりします。

### 良くない例
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/f4cbfd7c-54ba-4b08-e3d3-def53136333f.png" width = "677" />

### 良いネーミングルール

良いネーミングルールの例は以下の通りです。

:::note 
<strong>良いネーミングルールの例</strong>
・一目で定数、変数が区別できる
・一目で変数のスコープが判別できる
・名前から関数の処理内容、変数の内容が推測できる
・日本語、数字が使われていない
・一貫性がある
:::

VBAには公式のコーディング規約がないため、他言語のネーミングルールを参考にしつつ、自分の中で一貫したルールを作ると良いかと思います。

　
### 定数名

:::note 
<strong>定数名の付け方の例</strong>
・大文字とアンダーバーのみで記述
・定数の意味がハッキリわかる名前を付ける
:::

定数は他の言語のルールに倣い、大文字とアンダーバーを使って記述します。
スコープを気にする必要性が薄いため、Publicのありなしに関わらず、同じルールで良いと思います。

```vba
' API URL
Const TARGET_API_URL = "http://test.com/"

' URLをエンコードするか
Public Const HAS_TO_ENCODE_URL = True
```

　

### 変数のスコープ

VBAの変数には以下のスコープが存在します。
* <strong>ローカル変数</strong>　（関数の中で定義する変数。プロシージャレベル変数とも）
* <strong>モジュール変数</strong> （関数の外でDim、Privateで定義する変数。モジュールレベル変数とも）
* <strong>グローバル変数</strong>（Publicで定義する変数。パブリック変数とも）

コーディング時には変数のスコープを気にする必要があるため、ローカル変数、モジュール変数が一目で区別できる名前を付けます。

なお、Publicで記述するグローバル変数は基本的にクラス以外では使用してはいけません。
これについては別記事で記述します。

　
### ローカル変数

:::note 
<strong>ローカル変数名の付け方の例</strong>
・先頭は小文字
・シンプルで簡略化した名前を付ける
:::

関数の中で定義するローカル変数は使われる範囲が小さいため、短め、かつ意味が分かる名前を付けます。

<dl>
  <dt>【例】</dt>
  <dd>・dName（フォルダ名） </dd>
  <dd>・uName（ユーザ名） </dd>
  <dd>・ptn（正規表現パターン）</dd>
</dl>

短い名前にするのは一目でモジュール変数と区別するため、かつコードをスッキリさせるためです。
毎回変数に長い名前を付けてしまうとコードがゴチャゴチャしてしまいます。
　
### モジュール変数

:::note 
<strong>モジュール変数名の付け方の例</strong>
・先頭は大文字
・変数の用途が推測できる、やや長めの名前を付ける
:::

こちらはローカル変数と違い、やや長め、かつハッキリと意味が推測できる名前を付けます。

<dl>
  <dt>【例】</dt>
  <dd>・DirName（フォルダ名） </dd>
  <dd>・UserName（ユーザ名）</dd>
  <dd>・RegPtn（正規表現パターン）</dd>
</dl>
　


### 配列・連想配列

:::note 
<strong>配列、コレクション名の付け方の例</strong>
・末尾にsを付ける
:::

配列やコレクションの名前は上記のルールに「s」を付けて、複数形にすると良いかと思います。

<dl>
  <dt>【例】</dt>
  <dd>・DirNames（フォルダ名の配列、コレクション） </dd>
  <dd>・uNames　（ユーザ名の配列、コレクション)</dd>
</dl>


末尾に「Array」、「Col」、「List」などを付ける方もいますが、私は採用していません。
配列やコレクションは非常に使用頻度が高いため、長い名前の変数名が量産されてしまって読みづらくなるためです。

ただし、連想配列（辞書型）の場合は明確に配列と区別するため、末尾に「Dict」などを付けても良いかと思います。

<dl>
  <dt>【例】</dt>
  <dd>・DirNamesDict（フォルダ名の連想配列） </dd>
  <dd>・uDict（ユーザ名の連想配列）</dd>
</dl>

　
### 関数名

:::note 
<strong>関数名の付け方の例</strong>
・グローバル関数、ローカル関数共に、処理内容が推測できる長めの名前を付ける
・動詞、または動詞＋名詞にする
:::

関数名は処理内容の意味がハッキリと分かるものを付けます。

<dl>
  <dt>【例】</dt>
  <dd>・readTextFile（テキストファイル読込用関数） </dd>
  <dd>・convertCSVToJson（CSVからJSONに変換する関数）
</dl>


先頭の大文字、小文字でグローバル関数とローカル関数の区別を付けても良いと思いますが、変数と違って同じルールにしても良いかと思います。
私は両者で同じルールを採用しています。

その代わり、他モジュールからグローバル関数を呼び出す際は、モジュール名を先頭に付けるようにします。
以下のように、どのモジュールの関数を呼び出しているかハッキリ分かるようにします。

　

```vba:Sample.bas
' 他モジュールの関数呼び出し
val = WeatherDataFetcher.getData()

' 自モジュールの関数呼び出し
val = encodeByJson(val)
```
　

### モジュール名

:::note 
<strong>モジュール名の付け方の例</strong>
・処理内容が推測できる長めの名前を付ける
・動詞に"er"を付ける
・先頭は大文字
:::

モジュール名には動詞に"er"を付け、「～」する人といった意味の名詞になるようにします。

<dl>
  <dt>【例】</dt>
  <dd>・TextFileReader（テキストファイル読込用モジュール） </dd>
  <dd>・CSVConverter（CSVからJSONに変換用モジュール）
</dl>

関数名が動詞になっているので、他モジュールから呼び出した際に名詞.動詞となり、文法的にもわかりやすいですね。

```vba:Sample.bas
' 他モジュールの関数呼び出し
call TextFileReader.readTargetFile(fPath)
```

ただ、共通関数や定数を記述するモジュールは他と区別するために「Util」「Constants」といった名前にしても良いかと思います。

　

### 日本語、数字は使わない

以下の2つは命名時には出来るだけ使わないようにしましょう。

:::note alert
・日本語
・数字
:::
### 

変数名、関数名に日本語を使うとコメントとそれ以外の区別が付きにくくなってしまいます。

また、数字を付けるのも出来るだけやめましょう。
connect1、connect2、val1など、慣れないうちはついつい数字を末尾につけてしまいますが、これはNGです。
1と2で何が違うのか名前からは分からないためです。