Visual Basic 初級講座 [改訂版]
VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第2回 変数と定数

2020/1/17

この記事が対象とする製品・バージョン

VB2019 Visual Basic 2019 対象です。
VB2017 Visual Basic 2017 対象です。
VB2015 Visual Basic 2015 対象です。
VB2013 Visual Basic 2013 対象です。
VB2012 Visual Basic 2012 対象です。
VB2010 Visual Basic 2010 対象です。
VB2008 Visual Basic 2008 対象です。
VB2005 Visual Basic 2005 対象です。
VB.NET 2003 Visual Basic.NET 2003 対象外ですがほとんどの説明があてはまるので参考になります。
VB.NET 2002 Visual Basic.NET (2002) 対象外ですがほとんどの説明があてはまるので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

 

目次

1.変数

 

前回説明したように、Visual Basicを使ったプログラムでは、フレームワークの機能を呼び出していくことでアプリケーションを作成します。そのため、最初の目標はフレームワークの機能を呼び出せるようにすることです。

そのためには変数・型・クラス・メソッドなどについて学習する必要があります。

今回は変数について説明します。

 

 

Visual StudioでWindowsフォームアプリケーション(.NET Framework)を新規作成し、ボタンを配置したらクリックイベントに次のように記載してください。

※この操作方法がわからない方は先に入門講座をご覧ください。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MsgBox("Hello! World")

End
Sub

■リスト1

実行して、ボタンをクリックすると「Hello! World」と表示されます。

この例では、表示する値を直接文字列で指定している点に注目してください。

 

このプログラムは次のように書き換えても同じ動作をします。試してみてください。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim message As String
    message = "Hello! World"

    MsgBox(message)

End
Sub

■リスト2

この例では、messageという変数を作成し、その変数に "Hello! World" という値をセットしています。そして、MsgBoxで文字列を表示するところでは、その変数を使っています。

このように変数の主な機能は、値をセットして保存しておくことです。

変「数」という名前ですが、文字のように数ではないものも扱います。

 

変数は変数を使用するという宣言をしてから、値をセットして、そして必要な場所で使用します。

値をセットすることを「代入」(だいにゅう)と呼び、変数にセットされている値を使用することを「参照」(さんしょう)と呼びます。「宣言」・「代入」・「参照」が変数について可能な操作です。

宣言 変数を使用する準備をすること
代入 値をセットすること
参照 変数の値を使用すること

■表:変数に対して可能な操作

2.宣言

2-1.基本的な宣言の構文

変数の宣言は多くの場合キーワード Dim (読み方:Dim = ディム) を使って行います。

メモ メモ  - Dim以外に特別な構文の中で宣言する場合もあります。それはその構文を取り上げる際に個別に説明します。

 

宣言するときには必ず変数に名前をつけます。これを「変数名」と呼びます。

そして、すべての変数にはその変数が保存するデータの種類を表す「型」(かた)が決まっており、これも宣言時に明示するのが一般的です。

次の構文は最も一般的な変数の宣言です。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim 変数名 As 型

型はその変数が格納するデータが文字列なのか数値なのか、日付なのかなどを表します。これを組み合わせた複雑な型やプログラマーが自ら型を作成して指定することもあります。

指定できる型ははじめから用意されているだけでも数百を超えます。変数の型を後から変更することはできません。型については次回詳しく説明します。よく使用する型は次の通りです。

数値を表す型は「整数型」「長整数型」など細かく分かれていますが、これら全体を「数値型」と表現する場合があります。

読み方 日本語の型名
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:代表的な型

 

次の例はどれも有効な変数の宣言です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim userName As String
Dim count As Integer
Dim ticks As Long
Dim totalAmount As Decimal
Dim average As Single
Dim surface As Double
Dim duedate As Date
Dim isInRange As Boolean

 

2-2.変数名

変数の名前には日本語を含む文字および数字、および記号 _ (アンダースコア)が使用できます。ただし、先頭を数字にすることはできません。変数名は1023文字以内にする必要がありますがこんなに長い名前は付けないと思うので、実用上制限がないと思ってよいでしょう。

次の変数宣言はどれも有効です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim ユーザー名 As String
Dim COUNT As Integer
Dim ticks10000 As Long
Dim total_amount As Decimal
Dim _average As Single

大文字・小文字だけが違う変数名は同じ変数とみなされるため、2つ宣言することはできません。たとえば、count という変数名は有効ですし、COUNT という変数名も有効です。しかし、この2つを別々の変数として宣言することはできません。

VBはこのように基本的に大文字と小文字を区別しません。この性質を「ケースインセンシティブ」(Case Insensitive)と呼びます。C#などVB以外の多くの言語は大文字・小文字を区別するのでこの点はVBの特徴です。大文字・小文字を区別する性質を「ケースセンシティブ」(Case Sensitive)と呼びます。

 

また、VBであらかじめ用意されているキーワードと同じ名前の変数を使用することはできません。たとえば、Dim や As という名前の変数は原則として作成できません。このようにVBにあらかじめ定義されているキーワードを「予約語」と呼びます。普段プログラム中に青色で表示されているキーワードは予約語です。

'これはエラーになる例です。
Dim dim As Integer
Dim As As Long
Dim Function As Decimal

 

発展 発展学習  -  予約語の変数名を使用する方法

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

記号 [ ] で囲むと予約語と同じ名前の変数名を宣言できるという特例があります。以下の宣言は有効です。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Dim
[Dim] As String

これをやってしまうと、VBのプログラムがぱっとみわかりにくくなってしまうので特別な理由がなければ使用しないことをお勧めします。これで宣言した変数は使用するすべての箇所で [ ] をつける必要があるのも面倒です。 

 

2-3.命名規約

以上のルールを守っていれば変数名は自由ですが、世の中でプログラムというものが一般化してから40年あまり経ち、2020年現在では変数名に暗黙の合意が発生しています。

次のようなルールです。

このような名前についてのルールは「命名規約」(めいめいきやく)と呼びます。

このルールをcamel記法(読み方:camel = キャメル)と呼びます。

このcamel記法はVBのルールではないのでこの決まりを守りたくない人は守らなくてもかまいません。プロがチームでプログラムを開発する場合などはチームごとに変数名のルールなどを設けたりするのでそれに従いましょう。そして、そのルールはだいたいここで紹介したものと同じはずです。

このルールに従った変数名をいくつか紹介します。

英語が苦手な方、ご心配なく。ローマ字で結構です。ローマ字で記述する場合、ヘボン式をルールとして採用するチームが多いようです。

このルールに従っていない、ルール違反の変数名の例も紹介しましょう。camel記法には違反していますが、VBは問題なく認識します。

なお、以前は先頭を大文字にするPascal記法(読み方:Pascal = パスカル)の方が一般的だったように私は感じますが、ここ数年camel記法の天下となっているように感じます。当サイト Visual Basic 中学校でも数年前の記事は Pascal記法で書いています。

 

2-4.練習問題

VBの機能上有効な変数名をすべて選択して「回答する」をクリックしてください。

userName
UserName
USERNAME
ユーザー名
USER_NAME
UserName2
1stUserName
_Kingaku
$value
String

 

3.代入

 

3-1.代入の構文

変数に値をセットするには記号 = (イコール) を使用して次のように記述します。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

変数名 = 値

「変数」という名前の通り、値は何度でも代入することができますが、型は宣言時に決まっているため、必ず変数の型に合致する値を指定する必要があります。文字列型の値に数値の値をセットしたりすることはできません。

メモ メモ  -  復習
基本的にはダブルクォーテーションで囲まれている値が文字列で、何も囲まれていない数字が数値、# で囲まれているのが日付です。

参照
入門講座第6回 文字・数値・日付のあつかい

 

以下に変数の宣言と代入の例を示します。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'文字列型
Dim userName As String
userName = "冨田勲"

'数値型(整数型)
Dim accessCount As Integer
accessCount = 12

'日付型
Dim birthDay As Date
birthDay = #4/22/1932#

 

変数の宣言と代入を1行で記述することもできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'文字列型
Dim userName As String = "冨田勲"

'数値型(整数型)
Dim accessCount As Integer = 12

'日付型
Dim birthDay As Date = #4/22/1932#

1行で宣言と代入をやっても、2行に分けても機能も性能もまったく同じです。

 

右辺には式を指定してもよく、式を指定すると計算結果の値が変数に代入されます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'整数型
Dim x As Integer
x = 1 + 2
x = 12 * 3

'倍精度浮動小数点型(小数を扱える数値型)
Dim y As Double
y = 9 / 2 '4.5
y = Math.Sqrt(81) '81の平方根の9

'文字列型
Dim st As String
st = "A" & "B" 'ABになります。

'日付型
Dim day As Date
day = #6/27/2020#.AddDays(1) '2020/6/28になります。

+ - *  / などの基本的な計算の他にVBやフレームワークの機能を使った式もあります。この例では 平方根を求める Math.Sqrt や翌日を求める AddDaysが登場しています。初級講座ではまだ説明していませんが、現段階ではさまざまな式があるということを覚えておいてください。

+ - * / などの演算で使う特別な記号を演算子(えんざんし)と呼びます。「記号」と入っても文字だけで構成されている演算子もあります。通常の計算で使用するVBで定義されている演算子は以下の通りです。

演算子 意味
^ べき乗(累乗)を計算します。
* かけ算を計算します。
/ わり算を計算します。
\ わり算の答えを計算します。(あまりを除いた整数部分)
Mod わり算のあまりを計算します。
+ たし算を計算します。
- ひき算を計算します。
= 代入を行います。
& 文字列を結合します。
<< 左方向にビットシフトします。
>> 右方向にビットシフトします。

ビットシフトは2進数で計算する場合に使用することがある計算方法です。あまり出番はないので、将来もし「ビットシフト」というプログラムが必要になったときに、簡単に実行できる演算子がVBにはあるということだけ覚えておいてください。

 

3-2.変数の初期化

変数が宣言されてから、はじめて値を代入することを変数の「初期化」(しょきか)と呼びます。

基本的には特に理由がない限り、変数を宣言したらすぐに初期化(値の代入)を行うようにしてください。

 

初期化されていない変数を使用しようとすると、VBは緑の波線で警告します。

初期化していない変数の使用

このときの警告メッセージは次の通りです。

BC42104 変数 'userName' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。

この警告をみたら、初期化が抜けています。初期化してください。

 

初期化前の変数にはVBにより既定値が割り当てられています。数値型の場合は 0 です。文字列型など多くの型では初期化前には Nothing (読み方:Nothing = ナッシング)という特別な値が割り当てられています。Nothingは値がないことを意味しています。

その他 雑談 - VBのNothingはC#などの言語で null (ヌル) と呼ばれるものに相当します。

 

Nothingの状態で変数の値は参照するだけなら問題ありませんが、その値を利用して何かの機能を呼び出そうとすると必ずNullReferenceException(読み方:NullReferenceException = ヌルリファレンスエクセプション)という例外になります。

※機能を呼び出す方法は別の機会に説明します。

そのためVBは上記のような変数の使い方を警告します。

 

As Integerで宣言した数値型の場合、既定値がNothingではないため、この警告は発生しません。

Integerでは警告が発生しない

 

Stringの場合で意図的に空のメッセージボックスを表示させたい場合、次のように "" を使って空の値で変数を初期化するのが正解です。(もっとも、意図的に空のメッセージボックスを表示させたいのであればそもそも変数を使用する必要がないので、勉強以外の目的ではこのようなプログラムをすることはないでしょう。)

 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim userName As String = ""
MsgBox(userName)

"" は空の文字列であり、「空文字」(からもじ)と呼びます。空ではありますが立派な文字列です。Nothingは値が指定されていないことを示しているので、空文字とは異なります。

空文字が文字列であることが理解しにくいようならば、 0 が立派な数字であることと同じだと思ってください。

 

 

発展 発展学習  -  でも、MsgBoxはエラーにならない

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

MsgBoxは変数の値が Nothing の場合、その値を利用して機能を呼び出さないプログラムになっているため、Nothingを渡してもエラーにならず空のメッセージボックスが表示されます。

しかし、無数にある機能の中で、どの機能はNothingでも大丈夫か、どの機能はNothingでエラーになるかは、機能を作ったプログラマー(MsgBoxの場合は、マイクロソフトのプログラマー)次第で、見ただけではわからないため、VBはこのような使い方を発見すると、エラーではなく、警告にするのです。

私たちプログラマーとしてもこのような面倒なことを気にしながらプログラムしたくないので、変数は常に初期化するようにしておくのが良いでしょう。

 

 

4.参照

参照は変数が必要とされている場所でその変数名を記述するだけです。すでにMsgBoxで何度も変数を指定しているのは変数の参照です。

 

以下の例では変数を宣言し、代入し、参照しています。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'宣言
Dim userName As String
'代入
userName = "徳川家康"
'参照
MsgBox(userName)

 

代入するときに他の変数を参照することもできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim x As Integer = 123

'変数 x を参照して、+5した値を y に代入
Dim y As Integer = x + 5

このプログラムでは変数 y の値は 128 になります。

 

自分自身を参照して代入することもできます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

'整数型
Dim x As Integer = 100

'右辺は 100 + 1 なので結果として xの値は101になります。
x = x + 1

中学生の読者は x = x + 1 という表現が学校で習う方程式に見えるかもしれませんが、VBでは違います。

先ほど説明したように = は 「変数 = 値」という構文で変数に値を代入する機能です。x = x + 1 は x + 1の計算結果を x に代入するという意味で、結果、 x は 101になります。

 

自分自身を参照して代入する場合、単純なたし算や引き算、文字列の結合なのであれば+= など特別な記法を使って参照と代入を同時に行うことができます。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Dim x As Integer = 100
x += 2 'x = x + 2 と同じ意味です。
x -= 3 'x = x - 3 と同じ意味です。

Dim st As String = "AB"
st &= "C" 'st = st & "C" と同じ意味です。

 

 

発展 発展学習  -  ++ と -- はVBにはありません。

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

C#など他の言語では x += 1 のことをさらに短く x++ と書くことができるものがあります。これのひき算バージョンの x-- という書き方もあります。VBではこのような書き方はできません。これの代わりになる書き方もありません。

++ と -- はうまく使いこなせればプログラムを短く書けて便利なのですが、1行 x+=1 とどこかに書けば済むだけの話です。多分 ++x と x++ の意味の違いを理解するのがVBのコンセプトである「親しみやすさ」に合致しないと判断されたのではないかと私は思っています。VB6時代には += という書き方もなかったところ、VB.NETになったときに、+= は採用され、++は採用されませんでした。このときのマイクロソフト社内の打ち合わせの議事録など見てみたいものです。

5.定数

5-1.リテラル

プログラム中の直接記述されている値をリテラルと呼びます。

下記はリテラルの使用例です。右辺の"徳川家康"や"日"cなどがリテラルです。さまざまな型に対応したリテラルがあります。

アンダースコア ( _ ) を使ったリテラルの表記法はVB2017以上でのみ使用可能です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Dim s1 As String = "徳川家康"
Dim c1 As Char = "日"c
Dim d1 As Date = #6/27/2020#
Dim f1 As Double = 3.14
Dim i1 As Integer = 123
Dim i2 As Integer = 12_3
Dim i3 As Long = 98_000_000_000_000 'VB2017以上。
Dim i4 As Integer = &H273 '627になります。
Dim i5 As Integer = &O1163 '627になります。
Dim i6 As Integer = &B0010_0111_0011 'VB2017以上。627になります。

Char型のリテラルである "日"c という表記については次回説明します。

 

数値のリテラルは直接数字を記述するのが一般的で、入門講座・初級講座で何度も使用しています。

VB2017以上では、長い桁数の数字を記述するときに桁区切りの目印にするという意味で、数字の途中の任意の場所に _ を挿入することもできます。 _ は値としては無視されます。

 VB2017 VB2019


'i は 123 になります。

Dim i As Integer = 12_3

 

数値は先頭に &H をつけることで 16進数として記述することもできます。

 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


'i は 123 になります。
Dim i As Integer = &H7B

&O をつけると 8進数としての記述も可能です。&のうしろはゼロではなく、英語のオーです。

 

VB2017以上では、&B を使って2進数のリテラルを記述することもできます。この場合でも、数字の途中の任意の場所に _ を挿入できます。

VB2017 VB2019


'i は 123 になります。

Dim i As Integer = &B0111_1011

 

5-2.定数

定数は、変数と同じように値を保存するものですが、後から値を変更できない点が特徴です。

かならず宣言と同時に値を代入する必要があり、その後は代入ができません。

Const(読み方:Const = コンスト)を使って宣言します。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Const 定数名 As 型 = 値

後から値が代入できない以外の使い方は変数と同じです。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Const userName As String = "豊臣秀吉"
MsgBox(userName)

プログラムが巨大で複雑になってくると、同じ値をあっちこっちで使用する場合があります。たとえば、会社名や、消費税率、円周率や、重力定数などですが、このほかにもプログラム特有の数多くの値がありえます。これをリテラルとしてあっちこっちに同じ値を記述すると、一見してそれが何を意味するのかわかりにくいのと、後でその値を変更する必要が発生した場合に、それを使っているすべての箇所を調べだして変更する必要が発生してしまします。定数を使用すると定数名を見ればその値が消費税率なのか所得税率なのか示すことができますし、税率を変更する必要がある場合でも定数で定義している値を1つ変更するだけで済むというメリットがあります。

 

5-3.列挙体

列挙体は定数を関係のある定数をグループ化したものです。列挙体では数値型のみ使用できます。

既に存在する列挙体を利用する場合、次のようにします。

VB6 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

列挙体名.値の名前

 

たとえば、WindowsフォームアプリケーションのTextBoxはTextAlignプロパティで文字を左寄せにするか、右寄せにするか、中央寄せにするかを指定できます。

左寄せにする場合0、右寄せにする場合1、中央寄せの場合2なのですが、数字で覚えるのは面倒なので、HorizontalAlignmentという名前(読み方:HorizontalAlignment = ホリゾンタル アライメント)の列挙体として定義されています。

HorizontalAlignment列挙体で定義されている値と名前は次の通りです。

値の名前 読み方
Left レフト 0
Right ライト 1
Center センター 2

 

TextAlignプロパティで右寄せを設定する場合は次のように記述します。

 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


TextBox1.TextAlign = HorizontalAlignment.Right

このようにすることでプログラム時に自分で0, 1, 2などの数字を入力するのではなく、Left, Right, Center という選択肢から入力できるようになります。

=入力時に列挙体の候補が優先的に表示される

列挙体はデータ型のように振舞います。

TextAlignプロパティは HorizontalAlignment として宣言されているので、入力候補が表示されるときにHorizontalAlignment列挙体の候補が優先的に表示されます。

 

Option Strict Offの場合、次のように数字を直接指定して右寄せにすることもできますが、列挙体で選択したほうがわかりやすいことは一目瞭然です。

 VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


TextBox1.TextAlign = 1