アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

ExcelVBA入門 #10:定数を定義することとそのメリット

はじめに

久しぶりの記事追加です。
今回は、地味ながらもプログラミング言語問わずの人気者、「定数」について。

定数って何?

もしかしたら、中学か高校かの数学の時間に聞いたことがあるかもしれません。
それとだいたい同じで、「値が変化しないもの」です。

ちょっとVBAで書いてみましょう。
商品価格に消費税を加えた合計金額を計算するプログラムです。

Public Sub calcSum()
    Dim lSum As Long
    Dim lItemPrice1 As Long
    Dim lItemPrice2 As Long
    
    lItemPrice1 = Range("A1").Value
    lItemPrice2 = Range("A2").Value
    
    lSum = 0
    lSum = lSum + lItemPrice1 * 1.08
    lSum = lSum + lItemPrice2 * 1.08
    
    MsgBox "合計は" & lSum & "円です。"
End Sub

ここで、「1.08」は定数です。
セルのアドレス「A1」と「A2」も定数といえます。

これで何か問題あるの?

さて、ここで消費税が10%になったら…?
「1.08」を「1.1」に書き換える必要がありますね。
商品価格を保存するのが「A1」「A2」以外のセルになったら…?
これも「A1」「A2」を別のセルに変える必要がありますね。
数行しかないプログラムなのでまだともかく、ちょっと大きなものになると、全部書き換えるのは大変なことです。

じゃあどうすればいいの?

プログラムを最初から以下のようにしておきます。

Const TAX As Double = 1.08
Const ITEM_1_RANGE As String = "A1"
Const ITEM_2_RANGE As String = "A2"

Public Sub calcSum()
    Dim lSum As Long
    Dim lItemPrice1 As Long
    Dim lItemPrice2 As Long
    
    lItemPrice1 = Range(ITEM_1_RANGE).Value
    lItemPrice2 = Range(ITEM_2_RANGE).Value
    
    lSum = 0
    lSum = lSum + lItemPrice1 * TAX
    lSum = lSum + lItemPrice2 * TAX
    
    MsgBox "合計は" & lSum & "円です。"
End Sub

関数の前の「Const [定数名] As [型] = 値」で、定数を定義しています。
それから、消費税やセルのアドレスが入っていたところで、定義したものを用いるよう変更しています。
最初に定義しておけば、プログラム中に何度出てきても、変更するときは定義部分だけで済むのです。

尚、定数は最初に書いたとおり「値が変化しないもの」なので、
ここで定義した定数は、プログラム中で変更することはできません。

Const TAX As Double = 1.08

Public Sub calcSum()
    ' だめ(エラーになります)
    TAX = 1.1
End Sub

今回の例のように、
「(いつか変更する可能性はあるけれど)プログラムの動作中には変わらない数字や文字」を定義すると良いです。

おしまい

コード中に直接埋め込まれている数字を「マジックナンバー」と呼びます。
(一般的にはどうか知りませんが、新入社員の頃にそういう話を聞きました)
「なんの数字かわかんないけどちゃんと動く!不思議!」という皮肉を込めての呼び名だそう。

たしかに定義なんてしなくてもプログラムは動くわけですが、そのうち痛い目を見ます。
簡単なプログラムを書いているうちから、定義して使う癖をつけておくとよいかもしれません。