定数(Const)の基本構文の書き方と、主な使い方について解説します。
定数の宣言方法
' 基本構文 Const [定数の名前] As [データの型] = [設定する値] ' 宣言のサンプル Const 消費税率 As Double = 0.1 Const 消費税率 = 0.1 ' こっちでもOK
定数は、ほとんど変数と同じように扱うことができます。
宣言方法もかなり似ており、
変数の「Dim」を「Const」に変えて、「=値」を加えるだけでOKです。
データの型は省略可能で、省略すると自動で適切な型を設定してくれます。
(省略するとVariantになる変数と違い、↑はDoubleになります)
データの型は見ればわかるため、
省略したほうが見やすくていい場面が多いでしょう。
定数の使い方
MsgBox (100 * 消費税率) ' ← 10 が表示されるよ
変数と同じように使えます。
宣言、使い方共に、変数とほとんど同じものですが、
一番大きな違いは「値を変更できない」ことです。
Const 消費税率 = 0.1 If is商品を店内で食べる Then 消費税率 = 0.08 End If
↑これはエラーになります。
定数を使える範囲(スコープ)
変数と同じく
宣言場所 | 使用できる範囲 |
---|---|
SubやFunctionの中で宣言 | 宣言からEnd Sub まで |
Subの外(モジュールの一番上)で宣言 | そのモジュール内すべて |
Constの前にPublicをつけて宣言 | ブック内すべて |
という範囲で使用できます。
上から順に「プロシージャレベル定数」「モジュールレベル定数」「パブリック定数」と呼びます。
注意点として、定数はPublicをどんどん使ってOKです。
変数の場合は「Publicはダメ」と言われることが多く、「変数のスコープはなるべく短くする」というのが基本なのですが、定数の場合は違います。
「ブック内で常に同じ値」であることを明示すべきものは、ちゃんとPublicにしなければいけません。関数ごとに同じ定数を宣言するのは、変え忘れなどのバグの温床になります。
変数につられてPublicを嫌い、同じ定数が大量に存在するマクロを作らないようにしましょう。
何で定数を使うの?
変更に強い
消費税が変更になったとき、プログラム中のすべての「0.08」を、「0.1」にするのはとても大変です。
これを定数にすることで、一番上の宣言部だけ変更すれば済むようになります。
意味が伝わる
「0.08」とだけ書かれていると、何のことなのかわかりません。
「消費税かと思って0.1にしたら、深夜割増の8%だった!」
なんてことにもなりかねません。
定数を使うと値に意味を持たせることができるため、コードが読みやすくなります。
なにを定数にすればいいの?
「プログラム中で変更されない値」は定数にしておくべきというのが、一般的なプログラミングの話です。
上の「消費税」などが良く使われる例です。
しかし、VBAにおいてはもっと重要な定数の使いどころがあります。
それはセルの位置を決める、「行・列番号」です。
ワークシートで表形式のデータを扱うVBAにおいて、
Cells(R, 4) = Cells(R, 2) * Cells(R, 3) や Range("D" & i) = Range("B" & i) * Range("C" & i)
このようなセルの指定でマクロを書いていないでしょうか?
そして、マクロを読む際に、
わざわざシートを見に行って、「B列は単価で、C列が個数か~」と調べたり、
列の挿入などで、「4,2,3」を「5,3,4」に書き換えたりしていないでしょうか?
このマクロは、
Cells(R, 売上データの列.金額) = Cells(R, 売上データの列.単価) * Cells(R, 売上データの列.個数)
↑このように、定数を使って書き替えることができます。
これで、コードを見れば処理の内容がわかるようになりますし、
変更時には、定数だけをいじれば良くなります。
このように、何度も登場し、頻繁に計算式に組み込まれる「セルアドレス」は、
定数の「読みやすい」「変更に強い」というメリットを、最大限に活用できます。
「列を挿入してくれ」という指令を受けて、地獄を見た経験がある方は、
是非↓の記事も読んでいただき、列番号の定数化に取り組んでみましょう。