ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA 定数Constの使い所と定数を使う理由

エクセル作業の自動化に便利なVBAで定数を宣言するConstを解説します。

目次

定数とは何か

そもそも定数とは何でしょうか。それは、固定した値で後から変更する予定のないものです。上書きで内容が変えられないところが変数と異なります。この記事では、値をそのまま使わずあえて定数を使う理由と変数でも問題ないのにわざわざ定数を用意する理由について深掘りしていきます。

定数の文法

定数の宣言Const

定数を宣言するにはConstキーワードを使います。文法はConstに続けて定数の型を記述し、値を代入します。

Sub 定数サンプル()

    Const あいさつ = "こんにちは"
    MsgBox あいさつ  'メッセージボックスに「こんにちは」と表示される
    
End Sub

上のサンプルで型を明記するAs Stringの部分は省略できます。一方、値を代入する部分は省略できません。この点が変数の宣言と異なる部分です。VBAでは変数は逆に宣言時に初期値として値を代入することができません。

定数は値の書き換えができない

Constで宣言された定数は後から値を代入して変更することはできません。だからこその定数です。

Sub 定数エラーサンプル()

    Const あいさつ = "こんにちは"
    あいさつ = "おはよう"  'ここでエラーになる
    
    MsgBox あいさつ
    
End Sub

上のサンプルプログラムを実行するとコンパイルエラーというエラーが発生してプログラムの実行が止まります。

定数に後から値を代入できないことの証明
定数に後から値を代入しようとして出るエラー

定数の使い所は自己防衛が必要な場面!?

前項で定数の値は書き換えられないことが確認できました。この書き換えられないことが定数の特徴です。それでは定数はどういった場合に使うのでしょうか?そのまま考えると、変わって欲しくない値を入れる、と言うところでしょうか。このブログでは一歩踏み込んで以下のように定数の使い所を定義したいと思います。

定数の使い所:この値は変わらないと主張する場面

定数を使う理由はプログラムの堅牢性を高めるとか、メモリの消費領域を節約して実行速度を高める、とかそういうことではありません。プログラムを書くあなたをユーザーや依頼者から守るのが定数です*1。あなたをユーザーや依頼者から守るというのは以下のような状況です。

<想定事例>

あなたは無人島を専門とした不動産ビジネスを営むタヌキに雇われた事務職員です。VBAのプログラムができる点を買われて採用になりました。

下図のような売上実績管理表というシートがあるとします。これは実務担当者(まめきち)が販売実績に応じてポチポチと入力をしていくもので*2、請求書の発行や売上集計、お客様への請求書の発行など、様々な業務の元データになっています*3

列の場所は固定されており、様々な業務の元データとなっている
売上実績管理表のフォーマット

今回、あなたが開発を命じられたプログラムはF列の売上高の値を自動で記入するプログラムです。社長(たぬきち)はエクセルシートの中に式を残すとエクセルブックが重くなったり再計算が都度発生して時間の無駄だと思っています。そこでエクセルシートには値しか入力しない、させない方針で、計算が必要なときにはVBAに夜プログラムで一気にF列にD列の価格とE列の販売数量をかけ算した結果をF列に記入するプログラムを書くように言っています。

そこで問題が発生しました。ある社員が、「結局いくら売り上げたのかが経営には大事なので、F列の売上高をB列に移しましょう。そうすれば左の方だけ見ればOKではないですか」と提案しました。

その提案は売上集計フォーマットを以下のように変更することでした。

一見、一列の場所を入れ替えるだけのように見えるが大きな落とし穴がある
フォーマット変更の具体案

要するに、売上高の列を左の方に移動させ、B列に持ってくるだけです。

そしてこの変更は、【右クリックを押して列の削除、もう一度右クリックして列の挿入を押す】という簡単な作業だったため、この提案は即採用されました。しかし、この売上実績集計のシートはその後の様々な業務の元データになるものです。

このようなことがあり得るのです。それほど大事なシートなら、フォーマット自体が変更できないようにしておくべき*4ですが、ここで定数の出番です。【この値は変わらないと主張する場面】と言う意味が伝わってきたでしょうか。

Sub 売上実績集計()

    Const ヘッダ行 As Long = 2
    Const 日付列 As Long = 1
    Const 商品名列 As Long = 2
    Const 顧客名列 As Long = 3
    Const 価格列 As Long = 4
    Const 販売数量列 As Long = 5
    Const 売上高列 As Long = 6
    
    'ここから価格x販売数量を計算するFor文を書いていく
    
End Sub

このようにすれば、この内容はこの列番号に書いています、と主張することになります。

プログラム本編は省略して、宣言の部分だけを掲示しました。使いどころは理解できましたか。ここまでくれば、定数はツールやシステムを依頼する人、使う人ではなく、あなた自身を守るのに役立つことが分かった事と思います。しかし、これは実は守っているのはあなただけではないのです。

定数Constを使う理由

前項で、プログラム内で変数ではなく定数を使うことによって「これは変わらない値だと聞いています」と言うことを
プログラムの中で伝えることができるということを解説しました。これは間違いなくあなたを助けます。しかし、本当はそこがポイントではありません。

本当のポイントは、むしろちゃんとした仕様変更を受け入れられるようになる事です。定数はプログラムの冒頭で宣言しましたね。と言うことは、プログラムの中に立ち入らなくても、フォーマットを変えようよ、と言う話になれば、もしちゃんと定数で列を定義していれば、冒頭の定数の定義部分の数字のみを入れ替えればいいということになります。

なるほど!となりましたか?一見、「変数でいいじゃん」と思ってしまう定数にはこんな力があるのです。Microsoft社さんはすべて分かった上で、あえて、「値にわかりやすい名前を割り当てることができます」という説明にとどめているのですね。シンプルすぎて難解なんですが、この記事を読んでMicrosoft社のシンプルな説明が意味深長に味わい深く捉えられるようになればこれほどの事はありません。

VBA 定数Constの使い所と定数を使う理由まとめ

今回の解説の内容をまとめます。

  • 定数は変わらない予定の値ではなく、変わらないと主張する値(一番言いたいこと)
  • Constの使い方1:型は省略できる
  • Constの使い方2:値の代入は省略できない(VBAの変数との違い)
  • 蛇足ながらVBAの変数は宣言と同時に初期値が設定できない
  • この説明をすべて分かった上で、シンプルな公式ドキュメントを読むといいかもしれない

<参考>
定数の宣言 (VBA) | Microsoft Docs

*1:この主張はこのブログ筆者、ゆんの意見であり、Microsoft社のものではありません。本家Microsoft社の公式ドキュメントによると定数の意味は「値にわかりやすい名前を割り当てることができます」(冒頭部分抜粋)だそうです。引用先は本文に記載していますのでご覧下さい

*2:その作業こそ自動化や業務改善でなんとかしてあげたい

*3:今回の例では更新型のデータベースなので、本当はできればエクセルよりアクセスの方が望ましいです

*4:イベントプロシジャを使う事によって可能です