Visual Basic におけるステートメント
Visual Basic のステートメントは、完結した命令です。 ステートメントには、キーワード、演算子、変数、定数、および式を含めることができます。 各ステートメントは、次のカテゴリのいずれかに属します。
宣言ステートメント。宣言ステートメントは、変数、定数、またはプロシージャの名前を指定します。一緒にデータ型を指定することもできます。
実行可能なステートメント。実行可能なステートメントは、アクションを実行します。 メソッドまたは関数の呼び出しや、コード ブロックのループや分岐を行うことができます。 値や式を変数や定数に代入する代入ステートメントも実行可能なステートメントに含まれます。
このトピックでは、各カテゴリについて説明します。 また、複数のステートメントを 1 行に結合する方法、1 つのステートメントを複数行にわたって継続する方法について説明します。
宣言ステートメント
プロシージャ、変数、プロパティ、配列、および定数に名前を付けて定義するには、宣言ステートメントを使います。 プログラミング要素を宣言するときには、データ型、アクセス レベル、スコープも宣言します。 詳細については、「宣言された要素の特性 (Visual Basic)」を参照してください。
次の例には、3 つの宣言が含まれています。
Public Sub applyFormat()
Const limit As Integer = 33
Dim thisWidget As New widget
' Insert code to implement the procedure.
End Sub
最初の宣言は Sub ステートメントです。 applyFormat という名前のプロシージャが、対応する End Sub ステートメントと一緒に宣言されています。 また、applyFormat に Public が指定されています。これは、参照可能なすべてのコードに呼び出しが許可されることを意味します。
次に、Const ステートメントによって、定数 limit が宣言されています。この宣言では、データ型として整数 (Integer) が指定され、値として 33 が指定されています。
3 つ目の宣言である Dim ステートメントは、変数 thisWidget を宣言しています。 データ型にはオブジェクト (具体的には Widget クラスから作成されるオブジェクト) が指定されています。 変数はすべての基本データ型、または使用するアプリケーションに公開されているどのオブジェクト型でも宣言できます。
初期値
宣言ステートメントを含むコードが実行されると、Visual Basic は宣言された要素に必要なメモリを確保します。 宣言された要素が値を保持する場合、Visual Basic はそのデータ型の既定値で要素を初期化します。 詳細については、「Dim ステートメント (Visual Basic)」の「動作」を参照してください。
宣言時に変数に初期値を代入することもできます。次に例を示します。
Dim m As Integer = 45
' The preceding declaration creates m and assigns the value 45 to it.
オブジェクト変数の場合は、次のように New 演算子 (Visual Basic) キーワードを使うと、変数を宣言するときにそのクラスのインスタンスを明示的に作成できます。
Dim f As New System.Windows.Forms.Form()
宣言ステートメントに指定した初期値は、実行がその宣言ステートメントに到達するまで変数に代入されません。 それまでは、変数にそのデータ型の既定値が格納されます。
実行可能なステートメント
実行可能なステートメントは、処理を実行します。 プロシージャを呼び出したり、コード内の別の場所に分岐したり、いくつかのステートメントをループ実行したり、式を評価したりします。 代入ステートメントは特殊な形の実行可能ステートメントです。
次の例では、If...Then...Else 制御構造を使用して、変数の値に基づいて異なるコード ブロックを実行します。 各コード ブロックの中では、For...Next ループを指定の回数だけ実行します。
Public Sub startWidget(ByVal aWidget As widget,
ByVal clockwise As Boolean, ByVal revolutions As Integer)
Dim counter As Integer
If clockwise = True Then
For counter = 1 To revolutions
aWidget.spinClockwise()
Next counter
Else
For counter = 1 To revolutions
aWidget.spinCounterClockwise()
Next counter
End If
End Sub
この例の If ステートメントは、clockwise パラメーターの値をチェックします。 値が True の場合は、aWidget の spinClockwise メソッドを呼び出します。 値が False の場合は、aWidget の spinCounterClockwise メソッドを呼び出します。 If...Then...Else 制御構造は End If で終わります。
各ブロック内の For...Next ループは、適切なメソッドを revolutions パラメーターの値の回数だけ呼び出します。
代入ステートメント
代入ステートメントは代入演算を行います。つまり、次の例のように、代入演算子 (=) の右側の値を左側の要素に格納します。
v = 42
この例の代入ステートメントでは、42 というリテラル値を v 変数に格納しています。
使用できるプログラミング要素
代入演算子の左側に指定するプログラミング要素は、値を受け取って格納できるものにする必要があります。 したがって、ReadOnly (Visual Basic) ではない変数またはプロパティを指定するか、配列要素を指定します。 代入ステートメントのコンテキストでは、このような要素を左辺値、つまり "左側の値" と呼ぶことがあります。
代入演算子の右側の値は、式によって生成されます。この式は、リテラル、定数、変数、プロパティ、配列要素、他の式、関数呼び出しの任意の組み合わせによって構成されます。 次に例を示します。
x = y + z + findResult(3)
この例では、y 変数の値を z 変数の値に加算し、さらに findResult 関数の戻り値を加算しています。 その後、この式の合計値を x 変数に格納しています。
代入ステートメントのデータ型
次の例に示すように、代入演算子では、数値だけでなく String 値も代入できます。
Dim a, b As String
a = "String variable assignment"
b = "Con" & "cat" & "enation"
' The preceding statement assigns the value "Concatenation" to b.
また、次の例のように Boolean リテラルまたは Boolean 式を使用して、Boolean 値を代入することもできます。
Dim r, s, t As Boolean
r = True
s = 45 > 1003
t = 45 > 1003 Or 45 > 17
' The preceding statements assign False to s and True to t.
同様に、Char、Date、または Object データ型のプログラミング要素に適切な値を代入することができます。 また、オブジェクト インスタンスを、そのインスタンスの作成元になったクラスとして宣言された要素に代入することもできます。
複合代入ステートメント
複合代入ステートメントは、まず式の演算を実行してから、その結果をプログラミング要素に代入します。 次の例では、このような演算子の 1 つである += を使用しています。この演算子は、左側の変数の値に右側の式の値を加算します。
n += 1
この例では、n 変数の値に 1 を加算し、その新しい値を n 変数に格納します。 これは、次のステートメントを短縮したものと考えることができます。
n = n + 1
この種類の演算子を使うと、さまざまな複合代入演算を行うことができます。 このような演算子の一覧と、それぞれの詳細については、「代入演算子 (Visual Basic)」を参照してください。
既存の文字列の末尾に文字列を追加するには、次の例のように連結代入演算子 (&=) を使うと便利です。
Dim q As String = "Sample "
q &= "String"
' q now contains "Sample String".
代入ステートメントでの型変換
変数、プロパティ、または配列要素に代入する値は、代入先の要素に適したデータ型にする必要があります。 一般的には、代入先の要素と同じデータ型の値を生成するよう努力します。 しかし、型によっては代入時に別の型に変換できるものもあります。
データ型の変換の詳細については、「Visual Basic における型変換」を参照してください。 簡単に説明すると、Visual Basic は特定の型の値を、拡大変換した他の任意の型へと自動的に変換します。 拡大変換は実行時に必ず成功する変換であり、データを一切失いません。 たとえば、Visual Basic は必要に応じて Integer 値を Double に変換します。Integer は Double へと拡大変換されるためです。 詳細については、「拡大変換と縮小変換 (Visual Basic)」を参照してください。
縮小変換 (拡大変換を行わない変換) は、実行時に失敗したりデータを失ったりする可能性があります。 縮小変換は型変換関数を使用して明示的に実行できます。また、Option Strict Off を設定するとすべての変換をコンパイラに暗黙的に実行させることができます。 詳細については、「暗黙の型変換と明示的な型変換 (Visual Basic)」を参照してください。
複数のステートメントを 1 行に記述する方法
各ステートメントをコロン (:) で区切ると、1 行に複数のステートメントを記述できます。 次に例を示します。
Dim sampleString As String = "Hello World" : MsgBox(sampleString)
複数のステートメントを 1 行に記述すると便利な場合もありますが、コードが読みにくくなって管理がたいへんになります。 1 行に記述するステートメントは 1 つにすることをお勧めします。
複数行にまたがるステートメント
ステートメントは、1 行に収まるのが普通ですが、長すぎて収まらない場合には、行連結シーケンスを使って次の行に続けることができます。行連結シーケンスは、空白とそれに続くアンダースコア (_)、さらにそれに続く復帰で構成されています。 次の例では、実行可能なステートメント MsgBox を 2 行にまたがって記述しています。
Public Sub demoBox()
Dim nameVar As String
nameVar = "John"
MsgBox("Hello " & nameVar _
& ". How are you?")
End Sub
暗黙の行連結
多くの場合、アンダースコア (_) 文字を使用しなくても、次の連続する行のステートメントを継続できます。 次のコード行のステートメントが暗黙的に継続される構文要素を次の表に示します。
コメントの追加
ソース コードの意味は、記述した本人にとってさえ必ずしも自明であるとは限りません。 このため、ほとんどのプログラマは、たくさんのコメントを挿入してコードに注釈を付けています。 コード内のコメントには、後でそのコードを読んだり作業したりする人のために、プロシージャや特定の命令についての説明を記述できます。 Visual Basic はコンパイル時にコメントを無視するので、コンパイルされたコードがコメントの影響を受けることはありません。
コメント行の先頭には、アポストロフィ (') または REM とそれに続く空白を指定します。 コメントはコード内のどこにでも追加できますが、文字列の中には指定できません。 ステートメントにコメントを付け加えるには、ステートメントの後にアポストロフィまたは REM を挿入し、続けてコメントを記述します。 この他、独立した行としてコメントを挿入することもできます。 具体的な例を次に示します。
' This is a comment on a separate code line.
REM This is another comment on a separate code line.
x += a(i) * b(i) ' Add this amount to total.
MsgBox(statusMessage) REM Inform operator of status.
コンパイル エラーの確認
入力したステートメントに構文エラーがあると、コード行の下に青い波線が表示されます。場合によっては、エラー メッセージも一緒に表示されます。 このような場合は、ステートメントの問題を見つけて修正する必要があります。エラーの内容は、タスク一覧や、エラー箇所の上にマウス ポインターを置くと表示されるエラー メッセージで確認できます。 コード内の構文エラーをすべて修正しないと、プログラムは正しくコンパイルされません。
関連項目
語句 |
定義 |
=、*=、&= などの代入演算子について説明する言語リファレンス関連のトピックへのリンクが用意されています。 |
|
要素と演算子を組み合わせて新しい値を作成する方法について説明します。 |
|
単一のステートメントを複数行に分割する方法、および複数のステートメントを同じ行に配置する方法について説明します。 |
|
コード行にラベル付けする方法について説明します。 |