1. はじめに
ARアドバンストテクノロジ株式会社(ARI)の鈴木タクヤです。
今回はExcelフィルタリングツールのソースコード解説第4回です。
(ツールの詳細については以下の記事を、「Excelフィルタリングツール解説シリーズ」タグの記事一覧については以下の記事下部「5. 解説記事のリンク」をご参照ください。)
前回 はFunctionプロシージャについての記事でしたが、今回のテーマは「変数」です。
某大学の数学科出身の私には馴染み深い単語ですが、もし数学アレルギーを発症された方もご安心ください。この記事ではVBAにおける変数に特化して説明するため、危険度は低いと思われます。それでも気分が優れない場合は一旦窓を開け、遠くを眺めて深呼吸してみてください。
2. プログラミングにおける変数とは
ひとことで言うと、「データを記憶しておくためのもの」が変数です。変数にデータを入れておけば、プログラムの中でデータを使いたい時に取得することができます。変数に記憶したデータのことを「値」、変数に値を入れることを「代入」と呼びます。
変数はVBAに限らず、昨今のプログラムではほぼ必ず登場しますが、書き方はプログラミング言語によってまちまちです。
3. 変数の使用方法
3-1 基本的な書き方
VBAで変数を使用する場合は以下のように記述します。
Dim 変数名 [As データ型] '変数の宣言 ※[]内は省略可
変数名 = 代入する値 '変数に値を代入する
Dim は「Dimension」の略だそうな。なぜそうなのか気になる方はググってみてください。
但し、オブジェクト変数(後述)を使用する場合には、記述方法が少し異なります。(「3-2 オブジェクト変数の場合」をご参照ください。)
Excelフィルタリングツールでは、変数の宣言が冒頭に早速登場します。
'このツールの設定値を代入する変数の定義
Dim modeNo As Integer 'マクロの起動モード設定用(0:表見出しのコピー, 1:フィルタリング, 2:フィルタのクリア)
Dim settingSheetName As String 'フィルタ条件等を記載する本ツールの設定用シート名
(後略)
変数名には 英数字や全角かな・漢字と、先頭以外でアンダースコア「_」 が使用できます。
Asの後ろでは、その変数に入れられるデータの型を指定します。データ型は 前回 も少し触れましたが、 整数は「Long」、小数は「Double」、文字は「String」、真偽値(○:Trueか、×:Falseか)は「Boolean」 を使用すればとりあえずOKです。
変数宣言時のAs以降は省略可能で、省略した場合は Variant型 という、どんな型の値も入れられる変数になります。
また、文字列(String型)を表すときにはダブルクォーテーション「"」で挟みます。
Dim 挨拶 As String
挨拶 = "おはよう"
MsgBox 挨拶 'メッセージボックスに「おはよう」と表示される!
挨拶 = "こんにちは"
MsgBox 挨拶 'メッセージボックスに「こんにちは」と表示される!
「MsgBox」はメッセージボックスを表示するための関数で、スペースの後で指定した文字列や、変数(上の例では「挨拶」)の値(上の例では"おはよう" や "こんにちは")を表示します。
プログラミングにおける「=」には、下の x = x + 1
のように「左の変数に右の値を代入する」という意味があります。
Dim x As Long '変数xをLong型で宣言
x = 2 'xに「2」を代入
x = x + 1 'xに「2 + 1」を代入
MsgBox x 'メッセージボックスに「3」と表示される!
3-2 オブジェクト変数の場合
VBAの オブジェクト とは、ざっくりいうと処理の対象となる "もの" のことで、Excelというアプリケーション自体や、ブック、シート、セル範囲等を指します。
オブジェクト変数 とは、オブジェクトを表す変数であり、使用する場合は以下のように記述します。
Dim 変数名 [As Object型] '変数の宣言 ※[]内は省略可
Set 変数名 = オブジェクト '変数にオブジェクトを代入する
要は、Set が必要ということです。
Excelフィルタリングツールでは、例えば以下の記載が登場します。
(前略)
Dim settingBook As Workbook 'フィルタリングツール(このブック)
(中略)
Set settingBook = Workbooks(Application.ThisWorkbook.Name)
(後略)
ここでは Dim で変数 settingBook
を Workbook
型のオブジェクト変数として宣言し、Set で Workbooks(Application.ThisWorkbook.Name)
を指定しています。
Workbooks("ブック名")
でブックを指定します。また
Application.ThisWorkbook.Name
の「.」は「~の」といた意味で、「エクセルというアプリケーション」の「このブック」の「名前」を表します。
4. おわりに
以上、変数の解説でした。
今回も「おまけ」を除いてギリギリ5分で読み終わるか?という長さの記事になってしまいました。ダラダラ読むより急いで読むほうが内容を理解しやすいとも聞いたことがあるので、5分以内を目指して読みましょう、ということで・・・。(言い訳)
次回は、変数の有効範囲(スコープ)について解説します。
👇次回
5. おまけ
5-1 定数について
変数があるなら定数もあるのか?と考えた方。あります。
Const 定数名 [As データ型] = 代入する値 '定数の宣言と代入 ※[]内は省略可
変数との違いは字の通りで、定数は処理の途中で値を変えられません。定数を使用することで、意味のない数値に意味を持たせたり、値が誤って変更されないようにすることができます。また、
Const 元号 As String = "令和"
と初めに宣言・代入し、以降は変数 元号
から値を取得することで、いずれ元号が変わった際に 令和
の部分を一か所だけ書き換えれば済む、といった使い方も考えられます。
とは言え定数は変数で代用可能です。個人的なツールを作成する程度なら使わなくてもOKです。
恥ずかしながらこの記事を書き始めるまで、Const については私自身知りませんでした。記事の投稿って大事ですね!
5-2 変数に関する記述の流派
・「As データ型」は省略すべきか
・変数名に日本語を使うべきか
こういうところで流派が分かれます。私は(いまのところ)両方NO!です。
【理由】
・データ型を明示することで、意図しない型のデータが代入されて意図しない挙動をするバグを防ぐため。
・過去にExcelのアップデートで、変数名に日本語を使用しているマクロが動かなくなったことがある(らしい)ため。また、多少英語の勉強にもなるかなという淡い期待から。
とはいえ、ちょっとしたツールを使うたびに型を指定すると時間がかかりますし、変数名を日本語にした方が処理が分かりやすい(可読性が高いなどと言います)ので、完全に好みの話です。また、複数人で作業するようなときにはチームの方針に従いましょう。
↓ 変数名の日本語使用賛成派
↓ 変数名の日本語使用反対派
6. 参考文献
こちらはMicrosoftの公式ドキュメントです。
こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。