和風スパゲティのレシピ

日本語でコーディングするExcelVBA

定数(変更しない変数)を宣言する - Constステートメント

定数(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, 売上データの列.個数)

↑このように、定数を使って書き替えることができます。

これで、コードを見れば処理の内容がわかるようになりますし、
変更時には、定数だけをいじれば良くなります。


このように、何度も登場し、頻繁に計算式に組み込まれる「セルアドレス」は、
定数の「読みやすい」「変更に強い」というメリットを、最大限に活用できます。


「列を挿入してくれ」という指令を受けて、地獄を見た経験がある方は、
是非↓の記事も読んでいただき、列番号の定数化に取り組んでみましょう。

www.limecode.jp