<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > 変数について
   



変数について

今回は「変数」というものについてお話します。

変数というのは、プロシージャ実行中に値を代入しておく「入れ物」のことです。
ほんとに、「入れ物」なんですよ。ここであほらしいと思ってはいけません。
プログラミングなんて、「想像力」を働かせないとできないもんなんです。「変数=入れ物」をいう発想を持つことができないと、VBAと言えど習得は非常にキツイですよ。ここはひとつ、頭を柔軟に保ちつつ、コンピュータの中にバケツのようなもんがあると想像してみてください。

  バケツAに400cc入れました。
  バケツAからバケツBに移しました。
  バケツAに300cc入れました。
  バケツBとバケツAの中身をバケツCに入れました。
  さて、バケツCには何cc入ってるでしょう?

↑この文章の中の、バケツA、B、Cが「変数」に当たります。

もうちょっとVBAっぽく表現するならば、

  バケツAに400cc入れました。
  バケツBにバケツAの中身を移しました。
  バケツAに300cc入れました。
  バケツCにバケツBとバケツAの中身を入れました。
  さてバケツCには何cc入ってるでしょう?

どの変が違っているか、見比べてみてください。微妙に書き方が違うと思います。
「入れ物」を先に言って、その後で「入れるもの」を言うようにそろえて書くほうが、VBAっぽいかもしれないですね。

こんなまどろっこしいことしなくても、最初から700ccの水をバケツに用意すればいいんですけど、やんごとなき事情であちこちから水をかき集めないとならない場合なんか、みなさんどうなさいます?バケツ1個で、あっち行ったりこっち行ったりする人もいるかもしれませんが、バケツを予めいくつか用意しておいた方がよさげな場合もありますよね。

うちの会社ねえ、ちょっと変わった名前の人がいるんですよ。

田中 「総務のじゅげむじゅげむごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだい ぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけさんはいらっしゃいますか?」
田中 「じゅげむじゅげむ ごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだい ぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけさんは今外出しています。」
田中 「そうですか・・・受付にじゅげむじゅげむ ごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだい ぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけさん宛の荷物が届いていまして、わたしがことづかってるんですが、じゅげむじゅげむ ごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだい ぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけさんは今日は何時ごろお戻りですか?
田中 「はっきりとした予定はわからないんですが、今日はじゅげむじゅげむ ごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだい ぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけさんのお得意様主催のイベントがあるので、戻ってこないかもしれません。よければわたしがじゅげむじゅげむ ごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだい ぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけさんへの伝言を承りますが」
田中 「そうですか。ありがとうございます。あの、お名前は?」
田中 「田中です」
田中 「えっ?田中はわたしですが?」
田中 「いいえ、田中はわたしです」
田中 「しかし、わたしが田中ですので」

・・・・。
落語なら面白いんですけど、日常会話としては非常に厳しいもんがあります。
なんとかもうちょっと、すっきりした会話にできないもんでしょうかねえ。
そこで、

■登場人物 

  A:経理部の田中
  B:人事部の田中
  C:総務部のじゅげむじゅげむ ごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのぶらこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだい ぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけさん

と、最初にA、B、Cに置き換えておき、

A 「Cさんはいらっしゃいますか?」
B 「Cさんは今外出しています。」
A 「そうですか・・・受付にCさん宛の荷物が届いていまして、わたしがことづかってるんですが、Cさんは今日は何時ごろお戻りですか?
B 「はっきりとした予定はわからないんですが、今日はCさんのお得意様主催のイベントがあるので、戻ってこないかもしれません。よければわたしがCさんへの伝言を承りますが」
A 「そうですか。ありがとうございます。あの、お名前は?」
B 「Bです」
A 「Bさんですね。ではよろしくお願いします」

字面的にはすごくすっきりしますよね。
この場合の登場人物A、B、Cが、変数に当たります。
会話が始まる前に、A、B、Cそれぞれに名前を割り当てておけば、会話の中で何回も長い名前を連呼しなくても済むし、同姓同名の人がいても、どっちがどっちだか常にはっきりさせておくことができるんじゃないでしょうか。
こんなふうに、処理の内容ややりとりをすっきりと見せて分かりやすくするために、変数を用いることもあります

変数を用意しておかないとならない場合もありますし、見た目がすっきりするから変数を使っとこうかな・・・なんていう場合もありますね。
別に特別なもんでもなくて、単なる「入れ物」です。あまり難しく考えないようにしてください。
バケツは、ふつうは空っぽですが、中を覗くまでは空っぽかどうかわかりません。
よく確認しないで水を入れてしまってから、中に1万円札が入ってたとか、砂が入ってたとか気づいても、どうしようもないし。
バケツを床に置いたままで何もしなかったら、いつまでたっても水は入りません。
変数だってそんなもんです。
VBAでたいそうなプログラムを書いたって、何も代入しなければ空のままだし、何が入っているかきちんとチェックしないと、予期せぬ問題に発展しかねない。
あんまり難しく考えすぎて本質が見えなくなってはいけませんしね。



んでは、ちょっとやってみましょう。
練習用に、ちょっとしたフォームを用意してください。
前の章で作ったフォームがまだあれば、そいつでOKです。新しく何か別のフォームを作ってもよいです。
コマンドボタンを新しく作って、このボタンをクリックしたときのプロシージャを作りましょう。

まずは・・・200と500を足して、足した結果をメッセージボックスに出してみましょう。
え?700?え、ええ。それくらいわたしだって・・・。そうじゃなくて、その、「変数」の使い方の一例として、ってことで・・・。

プロシージャの先頭(Private Subの下)で、このプロシージャの中で使う予定の変数の名前を決めておきます。

「わたしは以下の処理の中で、AAAというバケツを使います」と宣言するのです。
そう、文字通り「宣言」です。
バケツに名前をつけて、「これを使うぞオラー」と宣言するのです。
「名前を付ける」というのもポイントのひとつです。
バケツは、名無しではダメです。
また、他のものと名前がダブってはいけません。
他のもの、ってのが、これまた難しいんですけど・・・なんか、コンピュータの中で「ありがち」な単語って、あるじゃないですか。
Date とか Format とか Function とか、今までお話してきた中でも、関数名とかプロパティ名とかその他・・・そういう感じの。ああいうのはよくありません。
なので、関数名とかに使われてなさそうなのを考えないとならないんですね。

今日は練習なんで、 AAA という名前のバケツにしましょう。
Dim という命令文を使って、変数の宣言を行います。

Dimというのは、変数の宣言をするときの決り文句です。
Dimとは英単語の「dimension」(ディメンジョン)の略らしいです。
わたしは「でぃむ」と読んでますが、まあ読み方はなんでもいいんじゃないでしょうか。これはこのまま覚えちゃいましょう。
dimensionとは「次元」という訳語の他に「寸法、容積」などの意味があります。

つまり、Dim AAA as .....という一文は、変数の宣言をしているのと同時に、「一定の量のメモリを確保する」意味合いが含まれます。確保されるメモリの大きさは、データ型によって決まります。なので、きちんとデータ型を指定しておかないと、無駄なメモリを使う太ったプロシージャになってしまう可能性大ってことです。

メモリの話をすると、過敏に反応を示す人もいるかもわからないですが、「どれくらいなら大丈夫なんでしょうか」「データ型を指定しないと、どういうことが起こるんでしょうか」なんて発想は持たないことです。無駄な処理をなくし、必要なことだけを盛り込む努力をするのがプログラミングであって、「大丈夫だから」という理由で無駄な処理を放置しておくのは好ましくありません。
これはVBAに限ったことではなく「プログラミング」と名のつくものすべてに言えることです。
プログラミングというものが始めての方とってみたら、こうした発想(ソフトウェアの仕様として上限が決まっているのではなく、自分で細心の注意を払わないとならない)に抵抗があるかもしれません。でも、この発想にも、少しずつ慣れていって下さい。
メモリを節約したいからといって必要な設定を削ったりしたら、それこそ本末転倒ですしね。
できる限りきちんとしたデータ型を指定した変数を使うよう心がける・・・←わたしたちが心がけることはこれだけ。。。大掛かりなプログラミングをしなくちゃならなくなったら、それこをパフォーマンスチューニングとかやってかなくてはならないですが、基礎を学ぶ上では心がけだけで十分じゃないかな、とわたしは思います。

では、データ型お話に戻りまして・・・。
200+500の答えは、おそらく「数値」ですよね。
VBAをやってく上で、「数値」と「数字」の区別はきっちりつけていかないといかんですよ。
数値の場合は、 200+500=700 になります。
数字の場合は  200&500=200500 という解釈がなされる可能性があります。
「可能性がある」というとこが少々あいまいなんですけどもね・・・。
でも、自分でプロシージャ作成するんであれば、「数値」なのか「数字」なのかきっちりしておかないとならないです。
そう、いわゆる「データ型」ってやつですね。

今回は、数値として足し算をするので、200+500の答えを入れておく変数も「数値」が入るようにしておかないとなりません。
MS-Accessの場合、数値を表す「データ型」には、以下のようなものがあります。

データ型 記憶領域の
サイズ
範囲
バイト型 (Byte) 1 バイト 0 〜 255
ブール型 (Boolean) 2 バイト 真 (True) または偽 (False)
整数型 (Integer) 2 バイト -32,768 〜 32,767
長整数型 (Long) 4 バイト -2,147,483,648 〜 2,147,483,647
単精度浮動小数点数型 (Single) 4 バイト -3.402823E38 〜 -1.401298E-45 (負の値)。

1.401298E-45 〜 3.402823E38 (正の値)。

倍精度浮動小数点数型 (Double) 8 バイト -1.79769313486231E308 〜 -4.94065645841247E-324 (負の値)。4.94065645841247E-324 〜 1.79769313486232E308 (正の値)。
通貨型 (Currency) 8 バイト -922,337,203,685,477.5808 〜 922,337,203,685,477.5807
10 進型 (Decimal) 14 バイト 小数部分を持たない数値の場合、
-79,228,162,514,264,337,593,543,950,335 〜 79,228,162,514,264,337,593,543,950,335 の範囲の値をとります。
小数点以下 28 桁の数値の場合、
-7.9228162514264337593543950335 〜 7.9228162514264337593543950335 の範囲の値をとります。
絶対値の最小値は 0 を除いた場合、
0.0000000000000000000000000001 です。
日付型 (Date) 8 バイト 西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日
オブジェクト型 (Object) 4 バイト オブジェクトを参照するデータ型
文字列型 (String) (可変長) 10 バイト + 文字列の長さ 0 〜 2GB
文字列型 (固定長) 文字列の長さ 1 〜 2GB
バリアント型 (Variant) (数値) 16 バイト 倍精度浮動小数点数型の範囲と同じ。
バリアント型 (Variant) (文字列) 22 バイト + 文字列の長さ 可変長の文字列型の範囲と同じ。

(ヘルプより抜粋)

いろいろありますでしょう。。。
そうだなぁ。変数に入る値が1000とか2000とかそれくらいなら、Integerと言っとくのが一番一般的なような気がします。
でも、40000になったり、あるいはマイナスの値(負の数)を入れる必要がある場合は、他のデータ型にしないと「オーバーフロー」とか仰々しいエラーメッセージ出してきやがるので、要注意です。
今回は、あんまり大きな数字が入らないという前提で、Integerバケツを用意しまして、こんな感じでしょうか。

じゃあ次に、この変数に足し算の答えを入れます。
こんな感じ。

改行すると、AAAという変数を大文字で宣言しているなら、aaaは自動的にAAAになるはずです。
この時点で(この次の行くらいで)、AAAという変数には200+500の答えが入っているわけですね。
んではこの次に、AAAをメッセージボックスのメッセージとして出してみます。
こんな感じ。

じゃ、コンパイルして、フォームを表示して、コマンドボタンをクリックしてみましょう。
出ます?

じゃあ、今日の日付を出してみましょうか。
今日の日付を代入するためには「日付時刻型」の変数が必要なので、AAAをDateという型に変更します。

ああ、もう、Integerのところを消してDateって書き換えればOKですよ。

で、今日の日付を出す関数Date関数を使います。こんな感じかしら。
ちょっとややこしいですが、
  AAA = Date
のDateは、Date関数という関数ですよね。
Dim AAA as Date
のDateは、AAAという変数が日付時刻型の値の入る変数であることを宣言するためのキーワードです。



変数だけ覚える、というのもちょっとわかりにくいと思うので・・・。
これから後のコーナーで作っていくプロシージャの中で、また細かくお話をしていきます。
とりあえず、

    ・処理を簡単にしたり、わかりやすくしたりするために、「変数」というものを使うことが多々ある
    ・変数は、計算式の答えを一時的に入れておいたりするために使うことが多い。
    ・変数は、処理の始めの方で、Dim という命令文を使って、「これからこういう変数を使います」と宣言する
    ・どういう値を代入するかによって、データの型というものをきちんと設定しておく必要がある。

こんなふうにおさえておいてください。