| Visual Basic 初級講座 |
|---|
|
|
Visual Basic 中学校 > 初級講座 >
この記事が対象とする製品・バージョン (バージョンの確認方法)
概要
|
前回まではVBに慣れてもらう目的で色を変更したり、簡単にお絵かきする方法を説明しました。今回からは1つずつ基本的なことを説明していきます。
前回までの説明でVBでのプログラミングの雰囲気はわかってもらえたと思います。
覚えなければいけないことはたくさんありますが、今まで説明したプログラムをよく見ると、ほとんどはオブジェクトのプロパティを設定して、メソッドを呼び出しているだけだということがわかります。
そのため、最初に覚えるべきことは次の2つです。
すぐにでもこれらの説明をしたいのですが、その前に変数や型について理解していなければいけないので、今回は変数と型の基本を説明し、その次にオブジェクトの取得方法を、さらにその次にメソッドの呼び出し方法を説明することにします。
変数とは値をとっておく便利な入れ物です。
次のプログラムでは「こんにちは」というメッセージを2回表示します。
MsgBox("こんにちは")
MsgBox("こんにちは")■リスト1
MsgBox(読み方:MsgBox = メッセージボックス)は、オブジェクト名が省略されていますがメソッドの1種です。
このプログラムを変数を使うように書き換えてみましょう。
地味なプログラムですが、できればひとつひとつ実際に動かしながら記事を読んでください。ただ読むだけなのと実際に試してみるのとではだいぶ違います。
|
|
メモ - 今後はButtonを配置すると書きません。 |
上記のようなプログラムがでてきたとき今までは、「フォームにボタンを1つ配置してください。」という説明とともに、次にようにイベントプロシージャとして掲載していました。
Private Sub Button1_Click(sender As
System.Object, e As System.EventArgs) Handles Button1.Click
MsgBox("こんにちは")
MsgBox("こんにちは")
End Sub■リスト2
初心者が簡単に実行できるようにこのようにしていましたが、いちいちここまで書くのは煩雑で、本当に私が説明したいことだけをシンプルに伝えられません。この段階に来れば、みなさんで好きなようにFormのLoadイベントに書いたり、ButtonのClickイベントに書いたりできると思いますので今後はこのような書き方はしません。
変数を使うと同じプログラムを次のように書くことができます。
Dim message As String
message = "こんにちは"
MsgBox(message)
MsgBox(message)■リスト3
見ると何となくわかると思うのですが、このプログラムではmessageという変数を作って、それに「こんにちは」という値をセットしています。ですからMsgBox("こんにちは")ではなく、MsgBox(message)と書くことができます。
変数に値をセットすることを「代入」(読み方:代入 = だいにゅう)と呼びます。この例は「変数messageに"こんにちは"を代入している」と表現できます。今後もセット・代入という言葉を使っていきますので覚えておいてください。「設定する」と表現される場合もあります。
1行目のDim(読み方:Dim = ディム)の行は変数の宣言と呼ばれます。変数は使う前に必ず宣言する必要があります。変数の名前をこの例ではmessageにしています。
変数の宣言と代入は1行にまとめて書くこともできます。
Dim message As String = "こんにちは"
MsgBox(message)
MsgBox(message)■リスト4
変数の宣言ではキーワード Dim を使って変数名と型を指定します。
変数の宣言は詳細を見ると複雑で、プログラムのいろいろな知識がないと理解できませんので、今回は基本的な宣言の説明にとどめ、初級講座の進行にあわせて徐々に追加の説明をすることにします。
変数の宣言の基本的な 構文は次の通りです。
Dim 変数名 As 型 = 初期値
さきほどのプログラムを例に順番に説明していきます。
Dim message As String = "こんにちは"Dim は変数を宣言する機能があるキーワードです。
初級講座ではまだ説明していませんが、PrivateやPublicなどのアクセス修飾子と呼ばれるキーワードとDimを同時に使う場合Dimは省略できます。 たとえば、 Private Dim message As String は、次のようにも書けます。 Private message As String Visual Studioはこのケースでは自動的に Dim を取り除いてしまいます。 こういったわけで、世界中のすべてのVBのサンプルでは Private や Public などのキーワードで変数を宣言しているように見えるプログラムがたくさんあり、勘違いしてPrivateやPublicなどのアクセス修飾子に宣言の効果があると思ってしまう人もいるようです。 なおFor文、Using文、LINQと組み合わせて使う場合、Dimなしで変数を宣言できる特例があります。こちらはDimを書いても書かなくても良いという省略可能ではなく、Dimを書くとエラーになります。 |
変数名はこの例では message です。この名前は以下の推奨ルールに従ってプログラマが自分でわかりやすい名前を付けるようにしましょう。
推奨ルール1.半角アルファベット、半角数字のみ使用する。
推奨ルール2.先頭の文字は半角アルファベットにする。
推奨ルール3.2つ以上の英単語から成り立つ変数名は、先頭の英単語は小文字で開始し、2つ目移行の英単語は大文字で開始する。
良い例:message, userName, accessCount, copyFileName
悪い例:Message, UserName, accesscount, copyFILEName
推奨ルール4.英語が苦手な場合は、日本語をローマ字にしたものでも良い。ローマ字はヘボン式にする。
良い例:userMei, kimmuJikian
悪い例:ユーザー名, kinmuJikan
推奨ルール5.意味のある変数名をつける。短い変数名よりも意味がわかる変数名をつける。
良い例:itemName, quoteReceiveDate
悪い例:m, qRcvDt
ここに書いたのは私が一般的だと思う推奨ルールなのでこれ以外の変数名をつけることも可能です。たとえば、漢字の変数名も可能です。ただプログラムは読みやすく書いたほうがよく、読みやすいプログラムの条件の1つは「みんなが従っているルールに自分も従う」ということになりますから、よく知らないうちはこの推奨ルールに従っておいてください。
|
|
発展学習 - 変数名のルール |
推奨ルールはともかく知識として正確なルールを知っておきたいという人のために公式ヘルプであるMSDNライブラリに記載されている変数の名前のルールを紹介します。一部、わかりやすくなるように私が表現を変更しています。
このルールでは日本語が使用できないことになりますが、実際には使用できます。
変数には必ず型(読み方:型 = かた)が付きます。 型は宣言時に As を使って指定するのが基本的ですが他の書き方もあります。
型については説明したいことがたくさんあるので少し後で章を改めて説明します。
3-5.= 初期値
変数を
4.型
4-1.型とは
変「数」という名前から、変数には数値しか代入できないようなイメージを持ってしまうかもしれませんが、変数には数値以外にもさまざまな値を代入することができます。上述の例での「こんにちは」という文字列を代入しています。
変数に代入できるもの例
TextBoxやButtonなどを変数に代入することも可能です。また、前回まで説明してきたお絵かきプログラムでは線をあらわすPenオブジェクトや、色を表すColorオブジェクトが登場しましたが、それらを変数に代入することも可能です。
このような種類のことを「型」といいます。
変数には必ず型があり、宣言した時点で変数の型は決定します。後で型を変更することはできません。
既に構文で紹介したように、変数に型を指定するには As 型 と記述します。
それでは、型の種類と宣言で「型」の部分に使えるキーワードを見てみましょう。
すべてのオブジェクトが型でもあるので、型の種類は1000を超えていると思います。代表的なものを紹介します。
| 型 | 読み方 | 日本語の型名 | 値 |
|---|---|---|---|
| String | ストリング | 文字列型 | 文字列。0文字から最大20億文字程度。 |
| Integer | インテジャー | 整数型 | 整数。-2147483648 ~ 2147483647。 |
| Long | ロング | 長整数型 | 整数。-9223372036854775808 ~ 9223372036854775807。 |
| Decimal | デシマル | 十進型(固定小数点型) | 整数と小数。Longより巨大な数もセットできる。 |
| Single | シングル | 単精度浮動小数点型 | 整数と小数。計算に細かい誤差が発生する。巨大な数もセットできる。 |
| Double | ダブル | 倍精度浮動小数点型 | 整数と小数。計算に細かい誤差が発生する。Singleより巨大な数がセットできる。 |
| Date | デイト | 日付型 | 日付と時刻。0001年1月1日 0:00:00 ~ 9999年12月31 日 23:59:59 |
| Boolean | ブーリアン | 論理型 | TrueまたはFalseをセットできる。 |
■表1:代表的な型
この表を見ると、数値用の型(=数値型)が細かくいくつかに分かれていることがわかります。これはコンピューター側の事情でこのように分けたほうが都合がよく、人間の感覚とはずれているので慣れないうちは注意してください。特に正確な小数の計算が必要な場合は誤差が発生するSingleとDoubleは使用できないことに注意が必要です。
また、Decimalは他の数値型よりも少しだけ計算が遅いですが、小数を最も正確に表現できます。
数値型に関しては 初心者はどの型を使ってよいか迷うと思うので、簡単な使い分けを紹介します。
より細かい情報は図解基礎解説のデータ型で表にまとめてあります。そちらの表にはDecimalやDoubleの正確な範囲も記載しています。
例では変数messageに "こんにちは" という文字列を代入していますが、変数には文字列ではなく数値などさまざまな値を代入することもできます。
たし算をするプログラムを例に数値の場合の変数を紹介します。
まずは変数を使わないでたし算をする例です。
MsgBox(7 + 5)■リスト4
これを変数を使って書くと次のようになります。
Dim x As Integer = 7
Dim y As Integer = 5
MsgBox(x + y)■リスト5
この変数の宣言では Integer というキーワードが登場しています。先ほどの例はこの部分にStringを使用していました。これは変数の「型」というもので変数に代入する値が数値か文字かという区別を表しています。
複数の宣言はカンマで区切ってまとめて書くこともできます。
Dim x, y, z As Integer■リスト10
この場合、x, y ,zはすべてInteger型になります。
また、次のように書くとxはString型、yとzはInteger型になります。
Dim x As String, y, z As Integer■リスト11
しかし、このように1行で複数の変数を宣言するプログラムはあまり見かけません。多くのプログラマーは3つの変数が必要な場合宣言も次のように3つに分けるようです。
Dim x As Integer
Dim y As Integer
Dim z As Integer■リスト12
数値、文字列、日付などの基本的な値を表現する型をプリミティブ型と呼びます。「プリミティブ」とは英語のPrimitiveのことで、「根本的な、根源的な」という意味です。表1に載っている型はすべてプリミティブ型です。
これらプリミティブ型と違ってもっと複雑なTextBoxやButtonなどもさきほど紹介したように「型」ですが、つきつめていくとプリミティブ型の組み合わせで表現されます。
たとえば、Point(読み方:ポイント)というオブジェクトは1つのBoolean型のプロパティと2つのInteger型のプロパティで構成されています。
プロパティのほかにメソッドとして操作も提供していますが、値の持ち方の話をしているので今はメソッドについては無視できます。(メソッドは変数やプロパティと違って値を持ちません。)
プリミティブ型と非プリミティブ型の区別は実際にプログラムをする上ではあまり意識しないのですが、なにかの説明資料を読んでいると「プリミティブ型」という言葉がしばしば出てくるので、意味は知っていたほうが良いです。
As String、As Integerなどの部分をたった1文字で簡単に書ける方法も用意されています。この1文字を型文字と呼びます。型文字はほとんど見かけることはありませんが、このようなものがあることは知っておいた方が良いので紹介します。
型文字は以下の表に挙げるものがすべてです。
| 型 | 識別子の型文字 |
|---|---|
| String | $ |
| Integer | % |
| Long | & |
| Decimal | @ |
| Single | ! |
| Double | # |
■表2:識別子の型文字
型文字を使って文字列型(String型)の変数を宣言するには次のようにします。
Dim foodName$
foodName = "バナナ"
MsgBox(foodName)■リスト13
この例では変数名はあくまでもfoodNameです。$は変数名の一部ではありません。
変数は宣言するときに型が決まるので、たとえば、Integerで宣言した変数に文字を代入することはできません。
次の例は実行時エラーが発生します。
Dim number As Integer
number = "Hello!"■リスト14
numberはInteger型の変数なのでVBは-2147483648 ~ 2147483647の整数が代入されることを予想しているわけですが、"Hello!"というおよそ場違いなものを代入しようとしているのでエラーになるのです。

■画像3
しかし、次の例はエラーにはなりません。
Dim number As Integer
number = 123.456789
MsgBox(number)■リスト15
この例ではnumberはInteger型なので整数だけしか代入できないはずです。しかし、次の行で小数を代入しています。一見エラーになりそうですが、VBはできるだけ値を型に合うように変換して自動的にエラーにならないようにする性質があり、なんとか実行できます。
実行した結果は123と表示されます。VBが自動的に四捨五入して整数にしてしまっているのです。
このようにVBが可能な限り値を型に合うように変換する機能を「暗黙の型変換」(読み方:暗黙 = あんもく、型変換 = かたへんかん)と呼びます。
number = "Hello!"の場合は、暗黙の型変換を使っても数値にできないので実行時エラーになってしまうわけです。
|
|
発展学習 - Option Strict |
暗黙の型変換はVBが自動的に型変換をしてくれるので便利な一方で、プログラマーが意図したのと違う結果になっても気が付かずに処理が実行されてしまい危険であるという見方もあります。
たとえば、上述の例ではプログラマーはnumberに小数を代入しようとしているのに暗黙の型変換により整数が代入されてしまいます。これを良いことと考える考え方と悪いことと考える考え方があるのです。
暗黙の型変換をしたくないプログラマーのためにオプションが用意されています。プログラムの一番先頭にOption Strict Onと書くと暗黙の型変換はほとんど行われなくなり上述のプログラムもビルドエラーになります。Option Strictはプロジェクトのプロパティでコンパイルページで設定することもできます。
宣言していない変数は下記のように青い波線が表示されてエラーであることがわかるようになっています。

■画像1
ためしに、Dim message As Stringの行をコメントにしてみてください。同じようなエラーが表示されます。
'この例はエラーになる例です。
'Dim message As String
message = "こんにちは"
MsgBox(message)
MsgBox(message)■リスト4
2-3.型
2-4.初期化
もう1つは、Dimの行で値のセットの両方を1行で書いている点です。変数の宣言の行はこのように宣言と代入の両方を行うこともできますし、前のmessageの例のように宣言だけを行うこともできます。
messageの例と同じように宣言と代入を2行で分けて書く場合は次のようになります。
Dim x As Integer
x = 7■リスト6
messageの例も1行・2行どちらのパターンでも書けます。
たし算の例は答えまで変数にして次のように書くこともできます。
Dim x As Integer = 7
Dim y As Integer = 5
Dim answer As Integer = x + y
MsgBox(answer)■リスト7
変「数」という名前なので数だけが代入できるように思ってしまうかもしれませんが、上述のように 変数には文字列も数値もセットできますし、それ以外にもすべてのオブジェクトをセットすることもできます。たとえば、TextBoxを変数にセットすることができます。
次の例は、実行中のユーザー名を取得してあいさつします。TextBoxとButtonを1つフォームにずつ貼り付けて試してみてください。
まずは変数を使わない例です。
Private Sub Button1_Click(sender As System.Object, e As
System.EventArgs) Handles Button1.Click
TextBox1.Text = "こんにちは、"
TextBox1.AppendText(My.User.Name)
End Sub■リスト8
これを変数を使うと次のように書けます。
Private Sub Button1_Click(sender As System.Object, e As
System.EventArgs) Handles Button1.Click
Dim myText As TextBox
myText = TextBox1
myText.Text = "こんにちは、"
myText.AppendText(My.User.Name)
End Sub■リスト9
今紹介したいくつかの例は変数の使用例としては最も単純なものです。これだけであれば変数を使うメリットは感じないでしょう。変数のメリットを感じるのはプログラムがもっと大きくなったときや複雑になってきたときです。
|
|
メモ - 変数の強調表示 |
変数名にテキストの入力カーソルがある場合、その変数を使っている部分が少し強調して表示されます。

■画像2
かなり控えめな強調ですが、4か所あるmessageの背景がうっすらとグレーになっているのがわかるでしょうか?
変数の宣言と同時に値を代入することができます。これを変数の初期化(読み方:初期化 = しょきか)と呼ぶことがあります。
Dim 変数名 As 型 = 値
初期化をしないで変数を宣言した場合、変数の値は型ごとに決められた既定値になります。たとえば、数値型であれば0です。
※なお、本来の「初期化」の意味は宣言だけして値を代入していない変数にはじめて値を代入することを指します。だから宣言と同時に値を代入しない場合でも「初期化」と表現する場合があります。
変数の宣言時に代入を行う場合、VB2008以上であるならば代入する値から変数の型を推論することができます。そのため型を自分で指定する必要がなくなり、次のように書くことができます。
Dim 変数名 = 値
この場合変数の型が何になるかは値によって決まります。
次の例では変数stは文字列型(String)になります。
Dim st = "こんにちは"■リスト16
次の例ではIntegerになります。
Dim number = 123■リスト17
型を確認するには変数名の上にマウスカーソルを合わせます。クリックは不要です。
少し待つと次のように表示され型がわかります。

■画像4:型の推論機能によってstがStringとみなされたことがわかる。
型の推論機能は数値に使うとIntegerかLongかDoubleかたなどわかりにくくお勧めできません。慣れないうちは地道にAs …と自分で型名を必ず書くようにしましょう。
型の推論はローカル変数でしか使用できません。ローカル変数とはSub ~ End Subなど特定の構造の内側にはさまれているところで宣言する変数です。以下に挙げるのはそのすべての構造です。
たとえば、よく例に出しているボタンのクリックイベントのプログラムはSub~End Subにはさまれているので、この内側で宣言する変数はローカル変数です。
Private Sub
Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
End Sub■リスト18
一方、この外側で宣言する変数はローカル変数ではありません。
Public Class Form1
Dim field = 100
Private Sub
Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim local = 200
End Sub
End Class■リスト19
この例では、変数localはローカル変数なので型の推論が働いてInteger型になります。しかし、変数fieldはローカル変数ではないので型の推論が働きません。次に説明しますがこのような場合変数はObject型(読み方:Object = オブジェクト)になります。
このように型の推論機能は少し注意が必要で初心者にはうまく使いこなせないかもしれません。必ず As 型名 を記述するようにしていれば推論機能を使いこなす必要はありません。
明示的に型を指定せず、推論機能も使えない場合変数の型はObject型(読み方:Object = オブジェクト)とみなされます。
たとえば、次の例ではstはObject型です。この例の場合は、宣言と代入を1行で書いていれば型の推論機能が働いてstはString型になるところなのですが、2行で書いているので推論機能が働かずObject型になります。

■画像5:型の推論機能が働かない。
このObject型はあらゆる値を格納できる万能の型です。文字でも数値でも日付でも、その他のどのようなオブジェクトでもObject型の変数に代入することができます。
しかし、なんでも代入できるということは裏を返せば何が入っているかまったくわからないということでもあります。普通の変数であれば数値に数値、文字列には文字列しか代入できないので変数を使ってプログラムするときもわかりやすいのですが、Object型の変数を扱うとそうはいきません。
また、なんでも格納できるようにするためにVBはObject型が使われると裏の見えないところで一生懸命作業をします。たとえば、Integer型の値をとっておくためにはメモリがたった4バイトだけ必要です。だから、Integer型の変数であればVBはメモリを4バイトだけ管理していれば済みます。しかし、何が入ってくるかわからないオブジェクト型の場合は、値に応じて一生懸命メモリを確保しにいく必要があります。
このような事情なのでObject型を使うと自分で明示的に型を指定した場合に比べて実行速度が遅くなります。
以上のことからObject型は通常は使用しないものと思ってください。
これまでの例で「message」や「number」、「st」のような変数名が登場しました。このようにプログラムの中で自分でつける名前のことを「識別子」(読み方:識別子 = しきべつし)と呼びます。
変数の名前(=識別子)はプログラマーが自分でその時のプログラムにあったわかりやすい名前になるように決めます。名前には細かいルールがありますが、先頭をアルファベットにして2文字目以降はアルファベットと数字だけ使うようにすれば特に問題はありません。長さもかなり長くできるので遠慮して短い名前にしてプログラムがわかりにくくなるよりも、何のための変数かわかりやすくなることを優先します。変数の名前の長さはプログラムの処理速度・パフォーマンスには影響しません。
有効な変数名の例
エラーになる変数名の例
有効だがVB中学校が推奨しない変数名の例
なお、VBは変数名で大文字と小文字を区別しません。ですから、次の例は同じ変数が2つ宣言されているみなされてエラーになります。
Dim fileName As String
Dim FileName As String■リスト20
C#やJava、JavaScriptなどの言語は大文字と小文字を区別するのでfileNameとFileNameは別の変数と解釈されます。
|
|
発展学習 - 変数名のルール |
公式ヘルプであるMSDNライブラリでは変数の名前のルールについて次のように記載しています。(一部私が表現を変更しています。)
このルールでは日本語が使用できないことになりますが、実際には使用できます。ただし推奨はしませんし、プロのプログラマーは日本語を使用しません。
後から変数名を変える場合VBの便利な機能を使うことができます。
最初の方に出てきたこのプログラムを題材にします。
Dim message As String
message = "こんにちは"
MsgBox(message)
MsgBox(message)■リスト21
ここでは宣言の含めて4か所でmessageという名前の変数を使っています。
変数名をmessageからaisatsuに変更したい場合、4か所すべてをaisatsuに書き換えることももちろんできますが、VBの機能を使うとDimの行だけ変更すればその変数を使っている箇所を連動して置き換えることができます。その方法を説明します。
まず、Dimの行の名前を変更します。そうすると、名前の右下に赤いマークが表示されます。このマークはいったんDimの行から離れたりすると消えてなくなります。

■画像6
ここでこのマークをクリックすると、さらにアイコンがでてくるのでクリックします。

■画像7
クリックすると、ちゃんとVBが変数の名前を変更しようとしていることを理解してくれて名前を変更するという指示を出すことができます。

■画像8
これを選択すると、プログラムの他の箇所ではこの変数を使っている個所の名前がすべて自動的にかわります。

■画像9
この他にテキストとして置換する機能もありますが、置換を使った場合は単純に文字を置換してしまうので、同じ名前を部分的に使っている他の箇所や変数ではない部分も置換されてしまうかもしれません。
今回は変数の基本中の基本である宣言と型について説明しました。
変数には他にも重要な規則がいくつかあります。たとえば、適用範囲という考え方がありButton1のClickイベントで宣言した変数をButton2のClickイベントで使うことはできません。
また、変数には寿命もあります。寿命が尽きた変数の中身は初期状態に戻ります。
このようなことを把握しないとちゃんと変数を使いこなすことはできないのですが、説明の順番としてその前にクラスやインスタンス、条件判断、繰り返し処理の基本を説明します。