Visual Basic におけるステートメント

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

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

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

このトピックでは、各カテゴリについて説明します。 また、このトピックでは、複数のステートメントを 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 という名前のプロシージャを宣言します。 また、applyFormatPublic であることを示します。これは、それを参照できるすべてのコードでそれを呼び出せることを意味します。

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

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

初期値

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

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

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

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

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 である場合は、aWidgetspinClockwise メソッドを呼び出します。 値が False である場合は、aWidgetspinCounterClockwise メソッドを呼び出します。 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.

同様に、CharDate、または Object データ型のプログラミング要素に適切な値を代入することができます。 また、インスタンスの作成元のクラスとして宣言された要素に、オブジェクト インスタンスを代入することができます。

複合代入ステートメント

"複合代入ステートメント" では、最初に式で演算を行ってから、プログラミング要素に代入します。 次の例では、演算子の左辺の変数値を、右側の式の値でインクリメントする、これらの += の演算子を示します。

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 に変換します。これは、IntegerDouble に拡大変換されるためです。 詳細については、「 Widening and Narrowing Conversions」を参照してください。

縮小変換 (拡大しないもの) は、実行時の失敗、あるいはデータ損失のリスクを伴います。 型変換関数を使用して、縮小変換を明示的に実行することも、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)
    

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

  • 式内の 2 項演算子 (+-/*Mod<><><=>=^>><<AndAndAlsoOrOrElseLikeXor) の後。 次に例を示します。

    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
    

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

  • クエリ演算子 (AggregateDistinctFromGroup ByGroup JoinJoinLetOrder BySelectSkipSkip WhileTakeTake WhileWhereInIntoOnAscending、および Descending) の前か後。 複数のキーワードで構成されているクエリ演算子 (Order ByGroup JoinTake While、および Skip While) のキーワードの間で改行することはできません。 次に例を示します。

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

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

  • For Each ステートメント内の In キーワードの後。 次に例を示します。

    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 つのステートメントを複数の行に分割する方法と、複数のステートメントを同じ行に配置する方法を示します。
方法: ステートメントへのラベル付け コード行にラベルを付ける方法を示します。