Microsoft Access Club >VBA物語 >このページ >次頁 < 前項  サイト内検索


変数の定義_定数との関係:VBA物語12



Dimは、「変数」を定義するステートメントでしたね。「また、変数かよ!」の声が聞こえてきそうですが、もう暫くご辛抱ください。

変数の対として「定数」という概念があります。反対語ですね。下記プロシージャをご覧ください。

この中で Const を用いて定義している a 、b は変数ではありません。定数です。aは10であり、何があっても変化しません。また、bも然りです。定数を用いる理由は、大きく分けて3種類あります。

 定数を用いる理由

  1. プログラムの中で同じ値を何度も使う場合
  2. 記憶しておくことが困難な数値や文字列がある場合
  3. 使用目的が分かりにくい値が、コード上で必要になる場合

これらのケースに、定数を用いると「コードが読みやすくなり、保守も容易」になります。

例えば、消費税を考えて下さい。現在は0.05ですが、将来的に増減する可能性があります。変更があったときに、直接0.05を記述していると、全ての該当箇所を変更しなければいけません。
これでは、ミスを誘発する元です。よって、プロシージャ内で商品単価の消費税を求める場合などでは、直接、数値に0.05を乗じることはしないでくださいね。絶対ですよ…。

下記に例を示します。

Function SamplePro()

    Dim 支払い額 As Long
    Const zei = 0.05    '…………@
    支払い額 = [商品価格] * zei * 100

End Function

この場合だと、@の0.05を変更するだけで事足り、プロシージャ全体の変更が不要になります。

変数の用い方で世間常識と異なるのは、全て「コンピュータは同時に一つの処理しかできない」ところから来ています。一例を挙げると…、

Function SamplePro()

    Dim a As Integer
    a = 10 + 5

End Function

という構文は、何の変哲も無いものですが、コンピューターには重荷になります。プログラミングでは、下記のようなプロセスを明示的に示す必要があるからです。

Function SamplePro()

    Dim a As Integer
    
    Const b = 10
    C0nst c = 5
    a = b + c

End Function

これをプロセスを日本語に訳すと下記のようになります。

  1. aは整数型の数値の変数である。
  2. bは定数で、値は10である。
  3. cは定数で、値は5である。
  4. aにb と cを代入すると、15なる。

a=10+5 の構文は、Accessが内部的に変換を行っているので、エラーにもならず正しい動きをしますが、好ましい形態ではありません。

次に、Msgboxステートメントをみてみましょう。

MsgBox"今日はホントにご苦労さんです。" , , "Akiraより"

これを下記のように変更してみます。

Function SamplePro()

    Dim strmsg As String
    Dim strtitle As String
    strmsg = "今日はホントにご苦労さんです。"
    strtitle = "Akiraより"
    
    MsgBox strmsg, , strtitle

End Function
  1. strmsgとstrtitleを変数と定義します。
  2. strmsgに文字列「今日はホントにご苦労さんです。いつも手助けいただいて感謝しています。」を代入します。
  3. strtitleに文字列「Akiraより」を代入します。
  4. MsgBoxステートメントに変数を配置します。

コンピュータの処理プロセスを考えるとこちらの方がベターな処理です。プログラミングは、上位の行から順番に実行されます。よって、コンピュータに対し、テーブルを指差して「あそこの、本を持ってきてくれ。」という命令文をコンピュータに対し、どのように解釈させる必要があるでしょうか?

  1. 左45度の方向に、3メートル進んで止まりなさい。
  2. 次に、高さ60cmの「物体1」がある。
  3. この物体を"テーブル"と命名する。
  4. テーブルは、縦60cm、横90cmだ。
  5. 中心より左下5cmのところに、高さ3cm横10cm縦20cmの「物体2」がある。
  6. この物体を"本"と命名する。
  7. 手に握りなさい。
  8. 持ち上げて、180度体を反転し、3メートル進んで握っている本を離しなさい。

ややっこしいでしょう?物体1、物体2が変数です。これを「あそこの、本を持ってきてくれ。」と乱暴にプロシージャを記述してもある程度は、VBAが判断し、細かくAccessに指示しているのがプログラミングの裏側です。よって、コンピュータの思考回路に合わせた記述を心がけましょう。そのために、"変数"、"定数"があるんです。

ここで、「strmsgを変数としないで、定数としたらどうなの?」とのお声が上がりそうですね。

Function SamplePro()

    Const conmsg = "今日はホントにご苦労さんです。"
    Const contitle = "Akiraより"

    MsgBox conmsg, , contitle

End Function

この場合、変数でも定数でも結果は同じになります。Constステートメントも"文字列"を扱うことができます。じゃぁ、どちらでもいいのか、と云えばそうではありません。目的をもって使い分けが必要です。

Dimを用いた変数は、プロシージャの内で自在に値(文字列)を変えることができます。Constを用いた定数は、一度設定した内容をプロシージャ内で変えることはできません。例えば、男女の別でメッセージを変える場合などは変数で対応します。例えば、下記のようなものです。

Function SamplePro()

    Dim strmsg As String
    
    If [性別] = "男" Then
        strmsg = "男性の履歴です。"
    ElseIf [性別] = "女" Then
        strmsg = "男性の履歴です。"
    Else
        strmsg = "性別不明の履歴です。"
    End If
    
    MsgBox strmsg

End Function

これを Constで対応する場合は、下記のようになります。

Function SamplePro()

    If [性別] = "男" Then
        Const strmsg_1 = "男性の履歴です。"
        MsgBox strmsg_1
    ElseIf [性別] = "女" Then
        Const strmsg_2 = "女性の履歴です。"
        MsgBox strmsg_2
    Else
        Const strmsg_3 = "性別不明の履歴です。"
        MsgBox strmsg_3
    End If

End Function

繰り返してConstを定義し、MsgBoxステートメントを実行するしか手がありません。一般的には、Dim(変数) を用いるようにしてください。

このようにプロシージャは、いろんな書き方があります。まずは、最も定番な書き方を勉強するようにして下さい。

2001/10/20

ページの先頭へ 前ページへ戻る


変数の定義_定数との関係:VBA物語12


 

-Microsoft Access Club-