【5分でVBA学習】変数の使い方（おまけに定数も添えて） ～Excelフィルタリングツール コード解説 #4～

# 1. はじめに
ＡＲアドバンストテクノロジ株式会社（ＡＲＩ）の鈴木タクヤです。

今回はExcelフィルタリングツールのソースコード解説第4回です。

（ツールの詳細については以下の記事を、「Excelフィルタリングツール解説シリーズ」タグの記事一覧については以下の記事下部「5. 解説記事のリンク」をご参照ください。）

https://qiita.com/TakuyaSuzuki/items/75789a1cf0b3a7c31c0b

__[前回](https://qiita.com/TakuyaSuzuki/items/1fc0a6c9411e585c8f64 "【5分でVBA学習】使えると便利なFunctionプロシージャ ～Excelフィルタリングツール コード解説 #3～")__ はFunctionプロシージャについての記事でしたが、今回のテーマは「__変数__」です。

某大学の数学科出身の私には馴染み深い単語ですが、もし数学アレルギーを発症された方もご安心ください。この記事ではVBAにおける変数に特化して説明するため、危険度は低いと思われます。それでも気分が優れない場合は一旦窓を開け、遠くを眺めて深呼吸してみてください。

# 2. プログラミングにおける変数とは
ひとことで言うと、「__データを記憶しておくためのもの__」が変数です。変数にデータを入れておけば、プログラムの中でデータを使いたい時に取得することができます。変数に記憶したデータのことを「__値__」、変数に値を入れることを「__代入__」と呼びます。

::: note
変数はVBAに限らず、昨今のプログラムではほぼ必ず登場しますが、書き方はプログラミング言語によってまちまちです。
:::
 
# 3. 変数の使用方法
## 3-1 基本的な書き方
VBAで変数を使用する場合は以下のように記述します。
```vb:
Dim 変数名 [As データ型]  　　　　　'変数の宣言　※[]内は省略可
変数名 = 代入する値　　　　       　'変数に値を代入する
```
::: note
___Dim___ は「Dimension」の略だそうな。なぜそうなのか気になる方はググってみてください。
:::
但し、オブジェクト変数（後述）を使用する場合には、記述方法が少し異なります。（[「3-2 オブジェクト変数の場合」](#3-2-オブジェクト変数の場合)をご参照ください。）

[Excelフィルタリングツール](https://qiita.com/TakuyaSuzuki/items/75789a1cf0b3a7c31c0b "【ツール提供】Excelユーザなら全員使える?! Excelフィルタリングツール")では、変数の宣言が冒頭に早速登場します。
```vb:Excelフィルタリングツール冒頭
'このツールの設定値を代入する変数の定義
Dim modeNo As Integer                   'マクロの起動モード設定用（0:表見出しのコピー, 1:フィルタリング, 2:フィルタのクリア）
Dim settingSheetName As String          'フィルタ条件等を記載する本ツールの設定用シート名
（後略）
```
変数名には __英数字や全角かな・漢字と、先頭以外でアンダースコア「_」__ が使用できます。

Asの後ろでは、その変数に入れられるデータの型を指定します。データ型は __[前回](https://qiita.com/TakuyaSuzuki/items/1fc0a6c9411e585c8f64 "【5分でVBA学習】使えると便利なFunctionプロシージャ ～Excelフィルタリングツール コード解説 #3～")__ も少し触れましたが、 __整数は「Long」、小数は「Double」、文字は「String」、真偽値（○：Trueか、×：Falseか）は「Boolean」__ を使用すればとりあえずOKです。

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/data-type-summary

変数宣言時のAs以降は省略可能で、省略した場合は __Variant型__ という、どんな型の値も入れられる変数になります。

また、文字列（String型）を表すときにはダブルクォーテーション「"」で挟みます。
```vb:
Dim 挨拶 As String
挨拶 = "おはよう"
MsgBox 挨拶　　　　　'メッセージボックスに「おはよう」と表示される！
挨拶 = "こんにちは"
MsgBox 挨拶　　　　　'メッセージボックスに「こんにちは」と表示される！
```
::: note
「MsgBox」はメッセージボックスを表示するための関数で、スペースの後で指定した文字列や、変数（上の例では「挨拶」）の値（上の例では"おはよう" や "こんにちは"）を表示します。
:::

プログラミングにおける「=」には、下の `x = x + 1` のように「左の変数に右の値を代入する」という意味があります。
```vb:
Dim x As Long    '変数xをLong型で宣言
x = 2            'xに「2」を代入
x = x + 1        'xに「2 + 1」を代入
MsgBox x         'メッセージボックスに「3」と表示される！
```

## 3-2 オブジェクト変数の場合
VBAの __オブジェクト__ とは、ざっくりいうと処理の対象となる "もの" のことで、Excelというアプリケーション自体や、ブック、シート、セル範囲等を指します。
__オブジェクト変数__ とは、オブジェクトを表す変数であり、使用する場合は以下のように記述します。
```vb:
Dim 変数名 [As Object型]          '変数の宣言　※[]内は省略可
Set 変数名 = オブジェクト　　　　　'変数にオブジェクトを代入する
```
要は、___Set___ が必要ということです。
[Excelフィルタリングツール](https://qiita.com/TakuyaSuzuki/items/75789a1cf0b3a7c31c0b "【ツール提供】Excelユーザなら全員使える?! Excelフィルタリングツール")では、例えば以下の記載が登場します。
```vb:Excelフィルタリングツール抜粋
（前略）
Dim settingBook As Workbook             'フィルタリングツール（このブック）
（中略）
Set settingBook = Workbooks(Application.ThisWorkbook.Name)
（後略）
```
ここでは ___Dim___ で変数 `settingBook` を `Workbook` 型のオブジェクト変数として宣言し、___Set___ で `Workbooks(Application.ThisWorkbook.Name)` を指定しています。
`Workbooks("ブック名")` でブックを指定します。また 
`Application.ThisWorkbook.Name` の「.」は「～の」といた意味で、「エクセルというアプリケーション」の「このブック」の「名前」を表します。

::: note warn
厳密には ___Set___ を使用しない場合は変数に __値__ を代入しますが、___Set___ を使用する場合は変数にオブジェクトへの __参照__ （メモリアドレス）を代入しています。
初心者は一旦スルーで構いませんが、「[6. 参考文献](#6-参考文献)」にも挙げている[こちらのページ](https://excel-ubara.com/excelvba4/EXCEL_VBA_423.html "オブジェクト変数とは何か")に詳しく載っています。
:::
# 4. おわりに
以上、変数の解説でした。
今回も「おまけ」を除いてギリギリ5分で読み終わるか？という長さの記事になってしまいました。ダラダラ読むより急いで読むほうが内容を理解しやすいとも聞いたことがあるので、5分以内を目指して読みましょう、ということで・・・。（言い訳）

次回は、変数の有効範囲（スコープ）について解説します。

👇次回

https://qiita.com/TakuyaSuzuki/items/2486e705198b5a70e235

# 5. おまけ
## 5-1 定数について
変数があるなら定数もあるのか？と考えた方。__あります。__
```vb:
Const 定数名 [As データ型] = 代入する値　'定数の宣言と代入　※[]内は省略可
```
変数との違いは字の通りで、定数は処理の途中で値を変えられません。定数を使用することで、意味のない数値に意味を持たせたり、値が誤って変更されないようにすることができます。また、
```vb:
Const 元号 As String = "令和"
```
と初めに宣言・代入し、以降は変数 `元号` から値を取得することで、いずれ元号が変わった際に `令和` の部分を一か所だけ書き換えれば済む、といった使い方も考えられます。

とは言え定数は変数で代用可能です。個人的なツールを作成する程度なら使わなくてもOKです。

:::note
恥ずかしながらこの記事を書き始めるまで、___Const___ については私自身知りませんでした。記事の投稿って大事ですね！
:::

## 5-2 変数に関する記述の流派
__・「As データ型」は省略すべきか__
__・変数名に日本語を使うべきか__

こういうところで流派が分かれます。私は（いまのところ）両方NO!です。

【理由】
__・データ型を明示することで、意図しない型のデータが代入されて意図しない挙動をするバグを防ぐため。
・過去にExcelのアップデートで、変数名に日本語を使用しているマクロが動かなくなったことがある（らしい）ため。また、多少英語の勉強にもなるかなという淡い期待から。__

とはいえ、ちょっとしたツールを使うたびに型を指定すると時間がかかりますし、変数名を日本語にした方が処理が分かりやすい（可読性が高いなどと言います）ので、完全に好みの話です。また、複数人で作業するようなときにはチームの方針に従いましょう。

__↓　変数名の日本語使用賛成派__

https://www.limecode.jp/entry/guideline/nihongo-variable

__↓　変数名の日本語使用反対派__

https://note.com/spike1523/n/nac34b9694bd9

# 6. 参考文献
こちらはMicrosoftの公式ドキュメントです。

https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/declaring-variables

https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/creating-object-variables

https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/declaring-constants


こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。

https://excel-ubara.com/excelvba1/EXCELVBA352.html

https://excel-ubara.com/excelvba4/EXCEL_VBA_423.html

https://excel-ubara.com/excelvba1/EXCELVBA313.html