Visual Basic 6.0 初級講座 |
第3回 変数を使う
今回はボリュームがあります。そして重要なところです!
そして前回までのグラフィック関係の華やかな部分とくらべてぐっと地味になります。地味ではありますが、VBを始め他のプログラム言語でも通用する基本的かつ重要な部分ですのでがんばって理解してください。今回のようなところは説明ばっかりでつまらないと思いますが、具体的にプログラムをしながら説明するにはまだ基本的な知識がたりないのでお許し下さい。
コードの例がいくつか出てきますがすべて実際にVBで試しながら読んでください。
この回の要約 ・変数を使うと値を記録することができる。 ・変数は使う前に宣言するのがよい。 ・宣言するときは数値や文字列などの型まで指定するのがよい。 ・変数には有効な範囲(適用範囲・スコープ)がある。 ・数値型の変数を使う場合はLongで宣言する。 ・Option Explicitを使えば変数のエラーを減らせる。 |
1.長い計算
算数や数学の計算はパソコンが最も得意とする分野です。プログラムをするからにはパソコンの優秀な計算機能を使って見ましょう。
問題 太郎君は おかしを3つ買いました。値段は 100円 、 120円 、 86円 です。 この値段には消費税が含まれていません。 問1.消費税が3%だとすると、全部でいくらになるでしょうか? 問2.消費税が5%だとすると、全部でいくらになるでしょうか? 問3.消費税が5%の時は3%の時に比べていくら高くなるでしょうか? |
算数の問題ですね。小学4年生くらいのレベルでしょうか。ただし、小学4年生のクラスにこの問題を出したらできない人もたくさんいるでしょう。
問1の答えは (100 + 120 + 86 ) x 1.03
問2の答えは (100 + 120 + 86 ) x 1.05
問3の答えは 問2の答え − 問1の答え
というように計算できます。これをVBで計算してみましょう。
フォームにコマンドボタンを貼り付けて、次のようにコーディング(プログラム)します。
Private Sub
Command1_Click()
End Sub |
■コード1:計算
なにをやっているかはだいたい分かるでしょう。*はVBでのかけ算の記号です。
最後の Print A ; B ; C はA , B , Cを順番に表示しろと言う命令です。
実行すると、小数点以下も表示されてしまいますが今回はこの点には目をつぶりましょう。差は約6円のようですね。さすがパソコンはこのくらいの計算は一瞬でやってしまうようです。
さて、このプログラムでは3つの「変数」と言う物が使われています。AとBとCです。このように計算の結果などの値を一時的に蓄えておくのが変数の役割です。変数には自分で好きな名前を付けてもかまいません。この例ではわかりやすく A , B , Cとしました。名前についてはこの後の説明を見てください。
ところで、変数を使う利点(メリット)はなんだか分かりますか?利点はいろいろありますが、この場合は3行目の C = B - A がポイントです。1行目と2行目で計算をしているのだから、3行目を、
C = (100 + 120 + 86 ) * 1.05 - (100 + 120 + 86 ) * 1.03
としないで
C = B - A
とした方が、計算も速く、プログラムもわかりやすくなるわけです。
なお、変数に値を入れる(セットする)ことを「代入(だいにゅう)」といいます。たとえば、A = 5 と書いたらこれを「Aに5を代入する」と表現します。コード1の例で言うと C = B - A を「CにB−Aを代入する」といいます。
2.変数の名前
変数には好きな名前を付けてください。255文字までならほぼ自由につけられます。ただし、名前の一部に記号を使うことはできません。(アンダーバー _ は例外です)。
好きな名前だから、とりあえず、X とか Y とか安易な名前を付けてしまう人もいるようです。このようにつけても良い場合もあるでしょうが、名前の基本は「分かりやすく」です。その変数が、何を表しているのか分かるようにな名前を付けましょう。
たとえば、足の長さ51cm 、座高92cmの人をインプットして身長を求めるときに、
A = 51
B = 92
C = A + B
というのはダメです。確かにエラーにはならないし正常に実行されるのですがわかりにくいのです。英語がわからない方はたとえば次のようにするのがよいでしょう。
Asi = 51
Zako = 92
Sinchou = Asi + Zako
英語がわかる方は一例として次のようにするとよいでしょう。
FootLength = 51
SittingHeight = 92
Height = FootLength + SittingHeight
なお、この英語は結構適当ですので試験などのときに思い出さないようにしてください。変数名はどのみちアルファベットで記述するので英語の名前をつけたほうがよいです。なぜならローマ字で日本語の変数名をつけると表記にぶれができて紛らわしいからです。たとえば「社長の給料」をあらわす変数は日本語では「ShatyouKyuuryou」とか「Syacyokyuryo」とか実にさまざまな書き方がありますが英語ではそれほど多くはありません。
とはいってもわざわざ辞書を引いてまで英語の名前をつける必要はないです。私が言いたいのは「わかりやすい名前」とつけるべきだということです。誰も知らない難しい英単語を使うようでは本末転倒です。
3.文字列 その他
「変数」という名前から数字ばかりを想像してしましますが、文字も変数に代入できます。なおここからは文字のことを「文字列」と書きます。
文字列を変数に代入するにはダブルクォーテーション " でくくる必要があります。
たとえば、
Namae = "太郎"
のようにします。ダブルクォーテーションでくくらないとエラーになるか。変数と見なされます。
実は文字列の他にもほとんどの値は変数に入れることができます。たとえば、コマンドボタンを変数に入れることもできます。コマンドボタンのようなコントロールを変数に代入するときには今までの方法とちょっとちがくて Setステートメント(「セット」と読む) を使います。
Set Botan = Command1
Botan.Caption = "変数に代入したぞ"
このようにプログラムすると、Command1の見出し(表示されている部分)が "変数に代入したぞ"に変更されます。
4.宣言
ここまで変数の基本的な使い方を説明してきましたが、まだ重要な点を解説していません。それが「宣言」です。変数を使うときは使う前に「宣言」をすることがプログラマーの間では常識になっています。「宣言」しなくても使えることは使えるのですが、プログラムの実行速度が遅くなったり 変数名を間違ってしまったりといろいろなデメリットがあるのです。
では、宣言とは何でしょうか? それは、変数を使う前に「俺は変数を使うぞー!」とVBに予告することです。宣言は変数ごとにしなければなりません。たとえば、変数Zako の宣言は次のようになります。
Dim Zako
Dim(ディム)は変数を宣言するためのステートメントで、宣言子とも呼ばれます。重ねて言いますが、宣言は変数を使う前にしてください。
さらに、ただ「変数を使うぞー!」と宣言するよりも「どんな変数を使うか」まで宣言するのがよいです。
「どんな変数」というのは、先ほど説明したように、変数には 数字、文字、コントロールなど区別があるのでその区別のことです。たとえば 数字の変数Zako を使う宣言は次のようになります。
Dim Zako As Long
As(アズ)が「どんな」を表していて、その後ろのLong(ロング)は数字という意味です(実はもっと深い意味がありますがそれについてはこの後の説明を見てください)。
文字の変数は As String 、コントロールの変数は As Control とします。このLong , String , Controlなどを「変数の型」といいます。この他にもいろいろあります。
参考までに今回最初に作った計算プログラムに宣言を加えるとどうなるかを書いておきます。
Private Sub
Command1_Click()
End Sub |
■コード2:コード1に変数の宣言を加えたところ
5.適用範囲
せっかくここまでやったので、変数に関して必要なことは一通りやってしまいましょう。
フォームにコマンドボタンを3つつけて、名前をそれぞれ cmdInput cmd2 cmd3 としてください。それぞれのCaptionプロパティは 入力 2倍 3倍とします。Captionプロパティは表示されている文字列をあらわすプロパティで頻繁(ひんぱん)に使用するので覚えておいてください。
作ろうとしているプログラムは 「入力」ボタンを押すと数字を入力できて、「2倍」ボタンを押すと入力した数字の2倍が表示され、「3倍」ボタンでは3倍が表示されるという物です。
たとえば、次のようにプログラムするとどうでしょうか?
1 2 3 4 5 6 7 8 9 10 11 |
'このコードは悪い例です Private Sub cmdInput_Click()
End Sub Private Sub cmd2_Click()
End Sub Private Sub cmd3_Click()
End Sub |
■コード3:変数の適用範囲を誤っている例
4行目で新しい関数InputBox(インプットボックス)が登場したので少し補足説明しておきましょう。これは、ユーザー(使う人)に入力をうながす命令です。そして、入力された値を 変数Kazu に代入します。具体的に何が起こるかは実行して確かめてみてください。 今はとにかくユーザーが入力した数値が変数Kazuに代入(セット)されると考えてください。
ところが、入力ボタンをクリックしてでどんな数字を入力しても「2倍」ボタンや「3倍」ボタンを押すと 0 が表示されるでしょう。つまり VB は Kazu = 0 と認識していることになります。もちろん、4行目のKazu = InputBox("数字を入力してください。")に間違いはありません。
原因は プロシージャにあります。 プロシージャ内で宣言した変数はそのプロシージャ内でのみ有効なのです。
補足:プロシージャとは? Sub 〜 End Sub に囲まれた部分をプロシージャと呼びます。従ってコード3には3つのプロシージャがあることになります。VBの画面上ではプロシージャは線で区切られて見えます。下の画像1を見るとわかりやすいと思います。Sub 〜 End Sub以外にもFunction 〜 End Function、Property 〜 End Property で囲まれた部分もプロシージャとなります。 コード3では2行目から5行目までがcmdInput_Clickプロシージャ、6行目から8行目までがcmd2_Clickプロシージャ、9行目から11行目までがcmd3_Clickプロシージャとなります。 |
別のプロシージャに同じ名前の変数があってもそれはたまたま名前が同じなだけの別の変数とみなされます。この例で言うと「2倍」ボタンや「3倍」ボタンでは、同じKazuという名前の変数であっても、違う変数として扱われているということです。それでいくらcmdInput_Clickプロシージャ内で変数Kazuに値を代入(セット)してもcmd2_Clickプロシージャやcmd3_Clickプロシージャの中では Kazu = 0 と認識されてしまうのです。
■画像1:プロシージャと適用範囲 なお、VBのキーワードの青色は通常より強調しています。
では、一つの変数をすべてのプロシージャで使いたいときにはどうしたらよいでしょうか?
その答えも Dim にあります。フォームの宣言セクションで宣言した変数はすべてのプロシージャで使うことができます。
補足:宣言セクションとは? どのプロシージャにも属さないフォームの先頭にある部分を宣言セクションと呼びます。宣言セクションには主に宣言を書くことができます。他にOptionステートメント(オプション)を記述することもできます。画像1でいうと「'このコードは悪い例です」というコメントがある部分です。こちらの説明も参考にしてください。 |
修正した完成版のプログラムは次のようになります。
Dim Kazu
As Long 'これがポイント Private Sub cmdInput_Click()
End Sub Private Sub cmd2_Click()
End Sub Private Sub cmd3_Click()
End Sub |
■コード4:宣言セクションで宣言した変数はすべてのプロシージャで共有できる。
このように、変数が有効である範囲を変数の適用範囲またはスコープと言います。
まとめると次のようになります。
・プロシージャ内で宣言した変数はそのプロシージャ内でのみ有効 ・フォームの宣言セクションで宣言した変数はそのフォーム内のすべてのプロシージャで有効 ・スコープ(適用範囲)の異なる変数は名前が同じでも別のものとなる |
6.宣言の強制
ここまでの説明を読んで「変数ってめんどうそうだなぁ」とか「使いこなせるかなぁ」とか不安になった人もいるかもしれません。しかしそこは天下のVB、オプションを設定しておけばVBが変数の間違いを指摘してくれるのです。
どのように設定するかというと、フォームのプログラムの一番先頭にOption Explicit(オプション エクスプリシット)と記述するだけです。Option Explicitをつけた場合は、今回出てきたコード3はボタンcmd2またはボタンcmd3をクリックした時点で「変数が定義されていません」と表示されてエラーになります。
それでプログラムは適用範囲外で変数を使おうとしたのだなと気がつくわけです。
長く複雑なプログラムになればなるほごこのような変数の適用範囲の問題は重要で大変です。それでOption Explicitはいつも必ずフォームの先頭に書いておくように心がけましょう。[ツール]メニューの[オプション]をクリックして、「変数の宣言を強制する」というところにチェックをいれておくとVBが自動でOption Explicitをつけてくれるようになります。
なお、Option Explicitのもう1つの便利な点はスペルミスもわかることです。変数の名前を間違っても人間はなかなか気がつかない場合がありますがOption Explicitをつかておけばやはり「変数が定義されていません」と表示されてエラーになります。
7.変数の型
最後に変数の型についてもう少し詳しく説明します。さきほどもLong, Stringなどの型が登場しましたね。さきほどはLongで宣言すれば数字の変数という意味に と説明しましたが、実はLongで宣言した場合は小数は扱えません。
たとえば、
Dim X As Long
X = 1.2
MsgBox X
とすると、1.2と表示されることを期待するのですが、 1 と表示されます。これは、Longが整数しか扱えないからです。小数も使いたいときは Single と宣言します。このように、一口に数字と言ってもいろいろあるのでここで数字に関するデータ型(変数の型)をまとめてみます。
型の名前 | 読み方 | 範囲 | |
Byte | バイト型 | バイト | 0 〜 255の整数 |
Integer | 整数型 | インテジャー | -32,768 〜 32,767の整数 |
Long | 長整数型 | ロング | -2,147,483,648 〜 2,147,483,647の整数 |
Single | 単精度浮動小数点型 | シングル | 長整数型くらいのけた数を持つ整数・小数 |
Double | 倍精度浮動小数点型 | ダブル | 長整数型の倍くらいのけた数を持つ整数・小数 |
Currency | 通貨型 | カレンシー | -922,337,203,685,477.5808 〜 922,337,203,685,477.5807 |
■表1:代表的な数値型
この他にも十進型など特殊な物もあります。こうやって見ると、数字を使うと言ってもいろいろな種類がある物です。アドバイスとしては整数を使うときは Long型 を使うということです。あとは状況に応じて使ってください。
数値型以外には次のような型があります。
型の名前 | 読み方 | 説明 | |
String | 文字列型 | ストリング | 文字列 |
Date | 日付型 | デイト | 日付・時刻 |
Control | コントロール型 | コントロール | 各種コントロール |
Variant | バリアント型 | バリアント | なんでも代入できる |
■表2:数値以外の代表的な型
String型は先ほども説明したように文字列を代入するときに使います。Date型は日付や時刻のためにあるのですがこれについてはまたそのうち詳しく説明しましょう。
あと重要なのはVariant型です。Variant型はオールマイティなデータ型です。Variant型で宣言をした変数には数字(整数、小数)でも文字でも何でも入れることができます。
こんな便利な型があるなら最初からそれを使えばいいのにと思うかも知れませんが、やはりデメリットがあるのです。Variant型は必要以上にメモリーを使い、実行速度も遅くなります。また、場合によっては思わぬところでエラーが発生します。こういうわけで、ほぼすべてのプログラマーは「Variant型はできるだけ使うな。」と言っています。私もそう思います。
ちなみに、Dimで宣言しないで変数を使ったり、宣言はしていてもAsで型を指定しなかった場合その変数は Variant型 となります。
7.最後に
変数の使い方を間違えると、意図しない結果になったり、エラーが発生したりします。変数の使い方にはまだまだしぶい応用がいろいろあるのですが、初級編としてはこんな物でしょう。それにこれだけ知っていればよほどのことがない限り困ることはありません。
今回は新出語が多いですが復習の意味もかねてざっと目を通しておいてください。
それでは、次回会いましょう。
今回の新出語
新出語 | 読み方 | 説明 |
プリント | 文字を表示するメソッド(命令) | |
Set | セット | Control型の変数に代入するときに使うステートメント |
Caption | キャプション | 表示されている文字をあらわすプロパティ |
Dim | ディム | 変数を宣言するステートメント |
As | アズ | 変数の型を指定するステートメント |
InputBox | インプットボックス | ユーザーが入力した値を返す関数 |
MsgBox | メッセージボックス | 文字を表示する関数。その他の便利機能もある。 |
Option Explicit | オプション エクスプリシット | 変数の宣言を強制するステートメント |
Byte | バイト | 数値型の一種 |
Integer | インテジャー | 数値型の一種 |
Long | ロング | 数値型の一種 |
Single | シングル | 数値型の一種 |
Double | ダブル | 数値型の一種 |
Currency | カレンシー | 数値型の一種 |
String | ストリング | 文字列型 |
Date | デイト | 日付型 |
Control | コントロール | コントロール型 |
Variant | バリアント | オールマイティな型 |
変数 | へんすう | (→今回の解説を読んでください。) |
代入 | だいにゅう | 変数に値をセットすること |
文字列 | もじれつ | 1文字以上の連なった文字 |
宣言 | せんげん | (→今回の解説を読んでください。) |
型 | かた | (→今回の解説を読んでください。) |
プロシージャ | (→今回の解説を読んでください。) | |
宣言セクション | せんげんせくしょん | (→今回の解説を読んでください。) |
適用範囲 | てきようはんい | 宣言した変数が有効である範囲 |
スコープ | 適用範囲のこと |
■表3:今回新しく登場した言葉。赤字は必修単語です。