Visual Basic のステートメント

Visual Basic のステートメントは完全な命令です。 キーワード、演算子、変数、定数、および式を含めることができます。 各ステートメントは、次のいずれかのカテゴリに属します。

  • 宣言ステートメント。変数、定数、またはプロシージャに名前を付け、データ型を指定することもできます。

  • 実行可能ステートメント。アクションを開始します。 これらのステートメントは、メソッドまたは関数を呼び出すことができます。また、コード ブロックをループまたは分岐することもできます。 実行可能ステートメントには、変数または定数に値または式を割り当てる Assignment ステートメントが含まれます。

このトピックでは、各カテゴリについて説明します。 また、このトピックでは、1 行に複数のステートメントを結合する方法と、複数行にわたってステートメントを続行する方法について説明します。

宣言ステートメント

宣言ステートメントを使用して、プロシージャ、変数、プロパティ、配列、および定数の名前と定義を行います。 プログラミング要素を宣言するときに、そのデータ型、アクセス レベル、およびスコープを定義することもできます。 詳細については、「 宣言された要素の特性」を参照してください。

次の例には、3 つの宣言が含まれています。

Public Sub ApplyFormat()
    Const limit As Integer = 33
    Dim thisWidget As New widget
    ' Insert code to implement the procedure.
End Sub

最初の宣言は、 Sub ステートメントです。 一致する End Sub ステートメントと共に、 applyFormatという名前のプロシージャを宣言します。 また、 applyFormat が Publicされていることも指定します。つまり、それを参照できる任意のコードでそれを呼び出すことができます。

2 つ目の宣言は、 Const ステートメントで、定数 limitを宣言し、 Integer データ型と値 33 を指定します。

3 番目の宣言は、変数Dimを宣言する thisWidget ステートメントです。 データ型は、特定のオブジェクト、つまり、 Widget クラスから作成されたオブジェクトです。 変数は、任意の基本データ型、または使用しているアプリケーションで公開されている任意のオブジェクト型の変数として宣言できます。

初期値

宣言ステートメントを含むコードを実行すると、Visual Basic は宣言された要素に必要なメモリを予約します。 要素が値を保持している場合、Visual Basic はデータ型の既定値に初期化します。 詳細については、 Dim ステートメントの「動作」を参照してください。

次の例に示すように、宣言の一部として変数に初期値を割り当てることができます。

Dim m As Integer = 45
' The preceding declaration creates m and assigns the value 45 to it.

変数がオブジェクト変数の場合は、次の例に示すように、 New Operator キーワードを使用して宣言するときに、そのクラスのインスタンスを明示的に作成できます。

Dim f As New FileInfo("filename")

宣言ステートメントで指定した初期値は、実行が宣言ステートメントに達するまで変数に割り当てられないことに注意してください。 それまでは、変数にはデータ型の既定値が含まれます。

実行可能ステートメント

実行可能ステートメントはアクションを実行します。 プロシージャの呼び出し、コード内の別の場所への分岐、複数のステートメントのループ、または式の評価を行うことができます。 代入ステートメントは、実行可能ステートメントの特殊なケースです。

次の例では、 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場合は、spinClockwiseのaWidget メソッドを呼び出します。 値がFalse場合は、spinCounterClockwiseのaWidget メソッドを呼び出します。 If...Then...Else制御構造は、End Ifで終わります。

各ブロック内の For...Next ループは、 revolutions パラメーターの値と等しい回数だけ適切なメソッドを呼び出します。

代入ステートメント

代入ステートメントは代入操作を実行します。これは、次の例のように、代入演算子 (=) の右側の値を取得し、それを左側の要素に格納することで構成されます。

v = 42

前の例では、代入ステートメントはリテラル値 42 を変数 vに格納します。

対象となるプログラミング要素

代入演算子の左側にあるプログラミング要素は、値を受け入れて格納できる必要があります。 これは、 ReadOnly ではない変数またはプロパティであるか、配列要素である必要があることを意味します。 代入ステートメントのコンテキストでは、このような要素は「左辺値(lvalue)」と呼ばれることがあります。

代入演算子の右側の値は、リテラル、定数、変数、プロパティ、配列要素、その他の式、または関数呼び出しの任意の組み合わせで構成できる式によって生成されます。 この例を次に示します。

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

この型の演算子を使用して、さまざまな複合代入操作を実行できます。 これらの演算子の一覧とその詳細については、「 代入演算子」を参照してください。

連結代入演算子 (&=) は、次の例に示すように、既存の文字列の末尾に文字列を追加する場合に便利です。

Dim q As String = "Sample "
q &= "String"
' q now contains "Sample String".

代入ステートメントでの型変換

変数、プロパティ、または配列要素に割り当てる値は、その変換先要素に適したデータ型である必要があります。 一般に、変換先要素と同じデータ型の値を生成する必要があります。 ただし、一部の型は割り当て時に他の型に変換できます。

データ型間の変換の詳細については、「 Visual Basic での型変換」を参照してください。 簡単に言うと、Visual Basic は、指定した型の値を、拡大するその他の型に自動的に変換します。 拡大変換は、実行時に常に成功し、データが失われることはありません。 たとえば、Visual Basic では、必要に応じて Integer 値が Double に変換されます。これは、 Integer が Doubleに拡大されるためです。 詳細については、「 拡大/縮小変換」を参照してください。

縮小変換 (拡大されていない変換) は、実行時にエラーが発生したり、データが失われたりするリスクがあります。 型変換関数を使用して明示的に縮小変換を実行することも、 Option Strict Offを設定してすべての変換を暗黙的に実行するようにコンパイラに指示することもできます。 詳細については、「 暗黙的な変換と明示的な変換」を参照してください。

複数のステートメントを 1 行に配置する

1 行に複数のステートメントをコロン (:) 文字で区切って指定できます。 この例を次に示します。

Dim sampleString As String = "Hello World" : MsgBox(sampleString)

場合によっては便利ですが、この形式の構文を使用すると、コードの読み取りと保守が困難になります。 したがって、1 行に 1 つのステートメントを保持することをお勧めします。

複数行にわたるステートメントの継続

ステートメントは通常、1 行に収まりますが、長すぎる場合は、行連結シーケンスを使用して、次の行に続けることができます。これは、スペース、その後に続くアンダースコア文字 (_)、さらにその後に続く復帰で構成されます。 次の例では、 MsgBox 実行可能ステートメントは 2 行にわたって継続されます。

Public Sub DemoBox()
    Dim nameVar As String
    nameVar = "John"
    MsgBox("Hello " & nameVar _
        & ". How are you?")
End Sub

暗黙的な行連結

多くの場合、アンダースコア文字 (_) を使用せずに、次の連続する行でステートメントを続行できます。 次の構文要素は、次のコード行でステートメントを暗黙的に続行します。

  • コンマ (,) の後。 例えば次が挙げられます。

    Public Function GetUsername(ByVal username As String,
                                ByVal delimiter As Char,
                                ByVal position As Integer) As String
    
        Return username.Split(delimiter)(position)
    End Function
    
  • 開きかっこ (() の後、または閉じかっこ ()) の前。 例えば次が挙げられます。

    Dim username = GetUsername(
        Security.Principal.WindowsIdentity.GetCurrent().Name,
        CChar("\"),
        1
      )
    
  • 左中かっこ ({) の後、または右中かっこ (}) の前。 例えば次が挙げられます。

    Dim customer = New Customer With {
      .Name = "Terry Adams",
      .Company = "Adventure Works",
      .Email = "terry@www.adventure-works.com"
    }
    

    詳細については、「 オブジェクト初期化子: 名前付きおよび匿名型 または コレクション初期化子」を参照してください。

  • 開いている埋め込み式 (<%=) の後、または XML リテラル内の埋め込み式 (%>) の終了前。 例えば次が挙げられます。

    Dim customerXml = <Customer>
                          <Name>
                              <%=
                                  customer.Name
                              %>
                          </Name>
                          <Email>
                              <%=
                                  customer.Email
                              %>
                          </Email>
                      </Customer>
    

    詳細については、「XML の 埋め込み式」を参照してください。

  • 連結演算子 (&) の後。 例えば次が挙げられます。

    cmd.CommandText = 
        "SELECT * FROM Titles JOIN Publishers " &
        "ON Publishers.PubId = Titles.PubID " &
        "WHERE Publishers.State = 'CA'"
    

    詳細については、「 機能別に一覧表示される演算子」を参照してください。

  • 代入後演算子 (=、 &=、 :=、 +=、 -=、 *=、 /=、 \=、 ^=、 <<=、 >>=)。 例えば次が挙げられます。

    Dim fileStream =
      My.Computer.FileSystem.
        OpenTextFileReader(filePath)
    

    詳細については、「 機能別に一覧表示される演算子」を参照してください。

  • 式内の二項演算子 (+、 -、 /、 *、 Mod<>、 <、 >、 <=、 >=^、 >>、 <<、 And、 AndAlsoOr、、 OrElse、 Like、 Xor) の後。 例えば次が挙げられます。

    Dim memoryInUse =
      My.Computer.Info.TotalPhysicalMemory +
      My.Computer.Info.TotalVirtualMemory -
      My.Computer.Info.AvailablePhysicalMemory -
      My.Computer.Info.AvailableVirtualMemory
    

    詳細については、「 機能別に一覧表示される演算子」を参照してください。

  • Is演算子とIsNot演算子の後。 例えば次が挙げられます。

    If TypeOf inStream Is 
      IO.FileStream AndAlso
      inStream IsNot
      Nothing Then
    
        ReadFile(inStream)
    
    End If
    

    詳細については、「 機能別に一覧表示される演算子」を参照してください。

  • メンバー修飾子文字 (.) の後、およびメンバー名の前。 例えば次が挙げられます。

    Dim fileStream =
      My.Computer.FileSystem.
        OpenTextFileReader(filePath)
    

    ただし、_ ステートメントを使用する場合、または型の初期化リストに値を指定する場合は、メンバー修飾子文字の後に行連結文字 (With) を含める必要があります。 =ステートメントまたはオブジェクト初期化リストを使用する場合は、代入演算子 (たとえば、With) の後に改行することを検討してください。 例えば次が挙げられます。

    ' Not allowed:
    ' Dim aType = New With { .
    '    PropertyName = "Value"
    
    ' Allowed:
    Dim aType = New With {.PropertyName =
        "Value"}
    
    
    
    Dim log As New EventLog()
    
    ' Not allowed:
    ' With log
    '    .
    '      Source = "Application"
    ' End With
    
    ' Allowed:
    With log
        .Source =
          "Application"
    End With
    

    詳細については、「With...End With ステートメント」 または 「オブジェクト初期化子: 名前付き型と匿名型」を参照してください。

  • XML 軸プロパティ修飾子の後 (. または .@ または ...)。 ただし、_ キーワードを使用する場合は、メンバー修飾子を指定するときに行連結文字 (With) を含める必要があります。 例えば次が挙げられます。

    Dim customerName = customerXml.
      <Name>.Value
    
    Dim customerEmail = customerXml...
      <Email>.Value
    

    詳細については、「 XML 軸のプロパティ」を参照してください。

  • 属性を指定する場合、より小さい記号 (<) の後、またはより大きい記号 (>) の前。 また、属性を指定する場合は、より大きい記号 (>) の後に指定します。 ただし、アセンブリ レベルまたはモジュール レベルの属性を指定する場合は、行連結文字 (_) を含める必要があります。 例えば次が挙げられます。

    <
    Serializable()
    >
    Public Class Customer
        Public Property Name As String
        Public Property Company As String
        Public Property Email As String
    End Class
    

    詳細については、「 属性の概要」を参照してください。

  • クエリ演算子の前後 (Aggregate、 Distinct、 From、 Group By、 Group Join、 Join、 Let、 Order By、 Select、 Skip、 Skip While、 Take、 Take While、 Where、 In、 Into、 On、 Ascending、および Descending)。 複数のキーワード (Order By、 Group Join、 Take While、および Skip While) で構成されるクエリ演算子のキーワード間で改行することはできません。 例えば次が挙げられます。

    Dim vsProcesses = From proc In
                        Process.GetProcesses
                      Where proc.MainWindowTitle.Contains("Visual Studio")
                      Select proc.ProcessName, proc.Id,
                             proc.MainWindowTitle
    

    詳細については、「 クエリ」を参照してください。

  • In ステートメント内の For Each キーワードの後。 例えば次が挙げられます。

    For Each p In
      vsProcesses
    
        Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}",
          p.ProcessName,
          p.Id,
          p.MainWindowTitle)
    Next
    

    詳細については、For Each...Next ステートメントを参照してください。

  • コレクション初期化子の From キーワードの後。 例えば次が挙げられます。

    Dim days = New List(Of String) From
      {
       "Mo", "Tu", "We", "Th", "F", "Sa", "Su"
      }
    

    詳細については、「 コレクション初期化子」を参照してください。

コメントの追加

ソース コードは、それを記述したプログラマに対しても、必ずしも自明であるとは限りません。 そのため、ほとんどのプログラマは、コードを文書化するために、埋め込みコメントを自由に使用します。 コード内のコメントは、プロシージャまたは特定の命令を後で読んだり操作したりするユーザーに説明できます。 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.

コンパイル エラーの確認

コード行を入力した後、行に波線の青い下線が表示される場合 (エラー メッセージが表示される場合もあります)、ステートメントに構文エラーが発生します。 ステートメントの問題を確認し (タスク リストを見るか、マウス ポインターを使用してエラーをポイントしてエラー メッセージを読み上げ)、修正する必要があります。 コード内のすべての構文エラーを修正するまで、プログラムは正しくコンパイルできません。

任期 定義
代入演算子 =、*=、&=などの代入演算子をカバーする言語リファレンス ページへのリンクを提供します。
演算子と式 要素と演算子を組み合わせて新しい値を生成する方法を示します。
方法: コード内のステートメントを中断して結合する 1 つのステートメントを複数行に分割する方法と、複数のステートメントを同じ行に配置する方法を示します。
方法: ステートメントにラベルを付ける コード行にラベルを付ける方法を示します。