With...End With ステートメント (Visual Basic)With...End With Statement (Visual Basic)

オブジェクトまたは構造のメンバーにアクセスする場合にステートメントで簡単な構文を使用できるように、単一のオブジェクトまたは構造を繰り返し参照する一連のステートメントを実行します。Executes a series of statements that repeatedly refer to a single object or structure so that the statements can use a simplified syntax when accessing members of the object or structure. 構造体の使用時には、メンバー値の読み取りまたはメソッドの呼び出しのみを行うことができます。また、With...End With ステートメントで使用されている構造体のメンバーに値を割り当てようとすると、エラーが発生します。When using a structure, you can only read the values of members or invoke methods, and you get an error if you try to assign values to members of a structure used in a With...End With statement.


With objectExpression
    [ statements ]
End With


用語Term 定義Definition
objectExpression 必須です。Required. オブジェクトとして評価される式。An expression that evaluates to an object. この式は、任意で複雑にできます。評価されるのは 1 回のみです。The expression may be arbitrarily complex and is evaluated only once. 基本データ型だけでなく、どのデータ型として評価される式でも指定できます。The expression can evaluate to any data type, including elementary types.
statements 任意。Optional. With の評価によって生成されるオブジェクトのメンバーを参照できる、End WithobjectExpression 間の 1 つ以上のステートメント。One or more statements between With and End With that may refer to members of an object that's produced by the evaluation of objectExpression.
End With 必須です。Required. With ブロックの定義を終了します。Terminates the definition of the With block.


With...End With を使用すると、特定のオブジェクトの名前を複数回指定することなく、そのオブジェクトに対して一連のステートメントを実行できます。By using With...End With, you can perform a series of statements on a specified object without specifying the name of the object multiple times. With ステートメント ブロック内では、先頭に With ステートメント オブジェクトを付ける場合と同様に、先頭にピリオドを付けてオブジェクトのメンバーを指定できます。Within a With statement block, you can specify a member of the object starting with a period, as if the With statement object preceded it.

たとえば、単一のオブジェクトに対して複数のプロパティを変更する場合、プロパティを割り当てるステートメントを With...End With ブロック内に指定すると、プロパティを割り当てるたびにオブジェクトを参照するのではなく、一度参照するだけで済みます。For example, to change multiple properties on a single object, place the property assignment statements inside the With...End With block, referring to the object only once instead of once for each property assignment.

コードの複数のステートメントで同じオブジェクトにアクセスする場合、With ステートメントを使用することにより次の利点が得られます。If your code accesses the same object in multiple statements, you gain the following benefits by using the With statement:

  • 複雑な式を複数回評価したり、そのメンバーを複数回参照するために一時変数に結果を割り当てたりする必要はありません。You don't need to evaluate a complex expression multiple times or assign the result to a temporary variable to refer to its members multiple times.

  • 反復的な修飾式の使用を避けることにより、コードを読みやすくします。You make your code more readable by eliminating repetitive qualifying expressions.

objectExpression のデータ型には、任意のクラス型や構造体の型、または Visual Basic の基本型 (Integer など) も使用できます。The data type of objectExpression can be any class or structure type or even a Visual Basic elementary type such as Integer. objectExpression の結果がオブジェクト以外になる場合、メンバー値の読み取りまたはメソッドの呼び出しのみを行うことができます。また、With...End With ステートメントで使用されている構造体のメンバーに値を割り当てようとすると、エラーが発生します。If objectExpression results in anything other than an object, you can only read the values of its members or invoke methods, and you get an error if you try to assign values to members of a structure used in a With...End With statement. これは、構造体を返したメソッドを呼び出し、GetAPoint().x = 1 など、関数の結果のメンバーにアクセスして直ちに値を割り当てた場合に発生するエラーと同じです。This is the same error you would get if you invoked a method that returned a structure and immediately accessed and assigned a value to a member of the function’s result, such as GetAPoint().x = 1. いずれの場合も問題になるのは、構造体が呼び出し履歴にのみ存在することです。また、こうした状況で変更された構造体のメンバーが、プログラム内の他のコードが変更を確認できるような方法でいずれかの場所に書き込むことができません。The problem in both cases is that the structure exists only on the call stack, and there is no way a modified structure member in these situations can write to a location such that any other code in the program can observe the change.

objectExpression は、ブロックへの入力時にのみ評価されます。The objectExpression is evaluated once, upon entry into the block. objectExpression ブロック内から With を再度割り当てることはできません。You can't reassign the objectExpression from within the With block.

With ブロック内で、修飾せずにアクセスできるのは、指定したオブジェクトのメソッドやプロパティだけです。Within a With block, you can access the methods and properties of only the specified object without qualifying them. 他のオブジェクトのメソッドやプロパティを使用するには、オブジェクト名で修飾する必要があります。You can use methods and properties of other objects, but you must qualify them with their object names.

With...End With ステートメントは入れ子に配置できます。You can place one With...End With statement within another. 入れ子の With...End With ステートメントは、参照されているオブジェクトがコンテキストから明確でない場合、混乱を招くことがあります。Nested With...End With statements may be confusing if the objects that are being referred to aren't clear from context. 内側の With ブロックの内部からオブジェクトが参照された場合、外側の With ブロックにあるオブジェクトに対する完全修飾参照を提供する必要があります。You must provide a fully qualified reference to an object that's in an outer With block when the object is referenced from within an inner With block.

ブロック外から With ステートメント ブロックに分岐することはできません。You can't branch into a With statement block from outside the block.

ブロックの内部にループがなければ、ステートメントは一度だけ実行されます。Unless the block contains a loop, the statements run only once. さまざまな種類の制御構造を入れ子にできます。You can nest different kinds of control structures. 詳細については、「入れ子になった制御構造」を参照してください。For more information, see Nested Control Structures.


また、オブジェクト初期化子で With キーワードを使用することもできます。You can use the With keyword in object initializers also. 詳細と例については、「オブジェクト初期化子:名前付きの型と匿名型」および「匿名型」を参照してください。For more information and examples, see Object Initializers: Named and Anonymous Types and Anonymous Types.

直前にインスタンス化したオブジェクトのプロパティまたはフィールドのみを With ブロックを使用して初期化する場合は、代わりにオブジェクト初期化子を使用することを考慮します。If you're using a With block only to initialize the properties or fields of an object that you've just instantiated, consider using an object initializer instead.


次の例では、各 With ブロックが単一のオブジェクトに対して一連のステートメントを実行します。In the following example, each With block executes a series of statements on a single object.

Private Sub AddCustomer()
    Dim theCustomer As New Customer

    With theCustomer
        .Name = "Coho Vineyard"
        .URL = "http://www.cohovineyard.com/"
        .City = "Redmond"
    End With

    With theCustomer.Comments
        .Add("First comment.")
        .Add("Second comment.")
    End With
End Sub

Public Class Customer
    Public Property Name As String
    Public Property City As String
    Public Property URL As String

    Public Property Comments As New List(Of String)
End Class


次の例では、With…End With ステートメントを入れ子にしています。The following example nests With…End With statements. 入れ子にされた With ステートメント内の構文では、内側のオブジェクトを参照します。Within the nested With statement, the syntax refers to the inner object.

Dim theWindow As New EntryWindow

With theWindow
    With .InfoLabel
        .Content = "This is a message."
        .Foreground = Brushes.DarkSeaGreen
        .Background = Brushes.LightYellow
    End With

    .Title = "The Form Title"
End With

関連項目See also