VBAの『With』ステートメントの使い方徹底解説 – オブジェクト変数(Set)との違いも解説

Withステートメントを徹底解説 VBA

「特定のオブジェクトに対して、複数のプロパティやメソッドを簡潔に記述したいけど、どうやって書けばいいんだろう…」
そんな疑問を持っていませんか?

お悩みポイント
悩む人
  • 任意のオブジェクトに対する操作を簡潔にまとめたい
  • SetとWithの違いがよく分からない
  • オブジェクト変数と組み合わせた使い方を理解したい

この記事では、VBAの「Withステートメント」を使って、オブジェクトに対する操作を効率的に記述する方法を詳しく解説します。

「Withステートメント」を使うことで、Excel VBAでのコードが読みやすくなり、ミスを減らすことができます。

使用例もすべてコピペして実行できるので、ぜひ最後までご覧いただき、実践してみてください。


【 この記事の概要 】

  よく使う度    4.0  
  難しさ     3.0  
  覚えておくと安心度     5.0  

この記事でできるようになること

この記事を読むことで、以下のことができるようになります。

この記事を見てできるようになること

VBAのWithステートメントとは?

Withステートメントは、VBAで特定のオブジェクトに対して複数のプロパティやメソッドを簡潔にまとめて記述するために使用される構文です。

たとえば、あるセル範囲に対して複数のプロパティを設定する場合、一つずつ記述するとコードが長くなってしまいます
しかし、Withステートメントを使うことで、対象のオブジェクトを一度だけ指定し、その後に続くプロパティやメソッドを短く書くことができます。


Withを使用した場合としなかった場合の違い

VBA Withステートメントの基本構文

Withステートメントの基本構文
設定解説
  • オブジェクト
    • Withステートメントの対象となるオブジェクト
      ここで指定したオブジェクトに対して、以降のプロパティやメソッドが適用されます。
  • プロパティやメソッド
    • Withステートメント内で適用されるプロパティやメソッドを記述します。
      「.」をつけることで、指定したオブジェクトに対して直接操作が行われます。

より詳しい情報は、Microsoft公式のWith ステートメントを参照してください。

Withステートメントがよく使われる場面

Withステートメントは、以下のような場面で頻繁に使用されます。

よく使われる事例
  • セル範囲の書式設定
    • 同じセル範囲に対して、複数の書式設定を行う場合に使用されます。
  • 図形やグラフのプロパティ設定
    • 図形やグラフに対して、色やサイズなど複数のプロパティを設定する際に便利です。
  • ワークシートやブックの操作
    • ワークシート全体やブック全体に対して、一括で設定を行うときに使われます。

WithとSetの違いについて解説

VBAでコードを書いていると、「With」と「Set」をどのように使い分ければよいのか?よく分からなくなることがあります。
その違いを詳しく解説します。

Setとは?

まずは、「Setステートメント」について簡単に解説します。

「Setステートメント」は、オブジェクト変数に特定のオブジェクトを代入するために使用されます。
つまり、特定のオブジェクトに対する参照を保存するために使うものです。

「Setステートメント」については、別途記事で解説を行っているため、合わせてご覧ください。

Setステートメントの記載例

Dim Ws As Worksheet
Set Ws = ThisWorkbook.Sheets("Sheet1")

WithとSetを比較

具体的な「With」と「Set」の違いは、次の通りです。

機能「 With 」「 Set 」
役割特定のオブジェクトに対して、
複数の操作を簡潔にまとめる
特定のオブジェクトへの参照を
オブジェクト変数に代入する
使い方同じオブジェクトに複数のプロパティや
メソッドを適用する際に使用
オブジェクトを変数に保存し、
後で再利用する際に使用
利点・ コードを簡潔にできる
・ 繰り返し操作をまとめられる
・ ミスが減る
・ 一度設定すれば、何度でも利用できる
・ 複数の場所で同じオブジェクトを
  操作する場合に便利
コード例With Worksheets(“Sheet1”)
.Range(“A1”).Value = “Hello”
.Range(“A1”).Font.Bold = True
End With
Dim ws As Worksheet
Set ws = Worksheets(“Sheet1”)

ws.Range(“A1”).Value = “Hello”
ws.Range(“A1”).Font.Bold = True

WithとSetの具体的な使い分けの例

「With」と「Set」の使い分けに明確な正解はありませんが、以下のように使い分けを行うとコードがスッキリします。

Withが有利な場面

シート全体の設定
例えば、シート全体に同じ設定を適用したいとき。

With Worksheets("Sheet1")
    .Range("A1:A10").Font.Bold = True
    .Range("B1:B10").Interior.Color = RGB(255, 255, 0)
End With

同じセル範囲に対して複数の操作をする場合
例えば、セルの書式設定や値の設定を一度に行うとき。

With Range("A1:D10")
    .Font.Size = 12
    .Font.Color = RGB(0, 0, 0)
    .Borders.LineStyle = xlContinuous
End With

Setが有利な場面

複数のプロシージャで同じオブジェクトを使用する場合
例えば、シートやセル範囲を複数のサブルーチンで何度も操作する場合。

Dim rng As Range
Set rng = Worksheets("Sheet1").Range("A1:D10")

'// 1回目の処理
rng.Value = "Initial Value"

'// 2回目の処理
rng.Font.Bold = True

繰り返し処理で同じオブジェクトを参照する場合
例えば、ループ内で同じセル範囲を操作する場合。

Dim i As Long
Dim rng As Range
Set rng = Worksheets("Sheet1").Range("A1")

For i = 1 To 10
    rng.Offset(i, 0).Value = "Row " & i
Next i

Withステートメントを使う際の注意ポイント

Withステートメントを使用する際には、以下の点に注意しましょう。

注意ポイント 1: オブジェクトを変えないようにする

Withステートメント内で操作するオブジェクトを途中で変えないようにしましょう
変えてしまうと、コードの可読性が悪くなり、予期しない動作が起きることがあります。

With Worksheets("Sheet1")
    .Range("A1").Value = "Hello"

    '// ここでオブジェクトを別のシートに変えない
    Worksheets("Sheet2").Range("B1").Value = "World"

    '// 再びSheet1を操作しようとすると混乱が生じる
    .Range("C1").Value = "Again"
End With
注意ポイント1の実行結果

解説

上記のコードでは、Withステートメントの中でSheet1の操作をしている途中に、突然Sheet2に切り替えています。
その後、またSheet1に戻ろうとしていますが、このようにオブジェクトを途中で変えると、コードの動作が分かりにくくなり、意図しない結果が生じる可能性があります。

対策

Withステートメント内では、一貫して同じオブジェクトに対する操作を行うようにしましょう。

また、このように複数のオブジェクトを取り扱う場合は「Set」を使用することで、コードの読みやすさが向上します。

Dim ws1 As Worksheet:  Set ws1 = Sheets("Sheet1")
Dim ws2 As Worksheet:  Set ws2 = Sheets("Sheet2")

ws1.Range("A1").Value = "Hello"
ws2.Range("B1").Value = "World"

注意ポイント 2: ネストに注意

Withステートメントを入れ子にする(ネストする)と、コードが複雑になり、見た目がわかりにくくなります
ネストする場合は、インデント1を使って見やすくしましょう。

インデントは、コードを見やすくするために使うスペースのことです。通常、半角スペース4つ分でインデントを行います。 ↩︎

With Worksheets("Sheet1")
    With .Range("A1:B2")
        .Font.Bold = True
        .Interior.Color = RGB(255, 255, 0)
    End With
    .Range("C1").Value = "SampleText"
End With
注意ポイント2の実行結果

解説

上記のコードでは、Withステートメントをネストして使っています。
外側のWithはSheet1を、内側のWithはSheet1のセル範囲A1を対象にしています。
ネストしている場合は、インデントをしっかりとつけて、どのWithステートメントがどのオブジェクトを操作しているかを明確にすると良いです。

対策

ネストする際には、インデントを使ってコードを見やすくしましょう。
また、ネストし過ぎるとコードが複雑になりがちなので、必要最低限に留めるのがベストです。

また、このような場合も「Set」を使用することで、コードの読みやすさが向上します。

Dim ws As Worksheet:  Set ws = Sheets("Sheet1")
Dim rng As Range:  Set rng = ws.Range("A1:B2")
    
rng.Font.Bold = True
rng.Interior.Color = RGB(255, 255, 0)
ws.Range("C1").Value = "SampleText"

Withステートメントの使用例を紹介

ここでは、VBAのWithステートメントの具体的な使用例を紹介します。

使用例1: セル範囲の書式を変更する

指定したセル範囲の書式を一括で設定する方法を紹介します。

主な使用用途
セル範囲に対してフォント、色、枠線などの書式を一度に設定したい場合に使用します。

Sub FormatRange()
    With Worksheets("Sheet1").Range("B2:F7")
        .Font.Bold = True
        .Font.Color = RGB(255, 0, 0)
        .Interior.Color = RGB(255, 255, 0)
        .Borders.LineStyle = xlContinuous
    End With
End Sub
動作概要
  • STEP1
    セル範囲の指定

    Worksheets(“Sheet1”).Range(“B2:F7”)で操作対象のセル範囲を指定します。
    この例では、「Sheet1」の「B2」から「F7」までの範囲が対象です。

  • STEP2
    フォントの書式設定

    「Withステートメント」内で、指定したセル範囲のフォントを太字にし、色を赤に設定します。

  • STEP3
    背景色と枠線の設定

    セルの背景色を黄色に変更し、枠線を設定して書式を完成させます。

処理結果

使用例1の実行結果

このコードで使用している機能

  • Font.Bold (文字を太字)
  • Font.Color (文字の色変更)
  • Interior.Color (セルの色変更)
  • Borders.LineStyle (罫線を設定)

1行ずつ解説

コードの詳細
  1. Sub FormatRange()
    • この行で、「FormatRange」というサブルーチン(処理のまとまり)を定義しています。
      このサブルーチンを実行すると、指定したセル範囲の書式が変更されます。
  2. With Worksheets(“Sheet1”).Range(“B2:F7”)
    • 「Sheet1」の「B2」から「F7」までのセル範囲を指定し、その範囲に対して後続の操作を行う準備をしています。
      「With」を使うことで、この範囲に対して複数の設定を一度に行うことができます。
  3. .Font.Bold = True
    • 指定したセル範囲内のすべての文字を太字にします。
      「True」を指定することで、太字が有効になります。
  4. .Font.Color = RGB(255, 0, 0)
    • フォントの色を赤(RGB値で指定)に変更します。
      RGB(255, 0, 0)は、赤色を意味します。
  5. .Interior.Color = RGB(255, 255, 0)
    • セルの背景色を黄色に変更します。
      RGB(255, 255, 0)は、黄色を意味します。
  6. .Borders.LineStyle = xlContinuous
    • 指定したセル範囲に枠線を設定します。
      「xlContinuous」は、「連続した線(実線)」を意味します。
  7. End With
    • 「With」で開始した操作がここで終了します。
      これにより、指定したセル範囲の書式設定が完了します。
  8. End Sub
    • すべての処理が完了し、「FormatRange」サブルーチンが終了します。

このコードは、Excelでのセル範囲の書式設定を効率的に行うための方法を紹介しました。
セル範囲の書式設定のように、同一範囲を複数処理する際に便利です。
「Withステートメント」を使用することで、特定のセル範囲に対して複数の操作を一度にまとめて行うことができ、コードの可読性とメンテナンス性が向上します。

使用例2: 図形のプロパティを変更する

ワークシート上の図形に対して複数のプロパティを設定する方法を紹介します。

主な使用用途
図形やグラフの外観をカスタマイズする際に便利です。
特に、複数のプロパティを一度に設定したい場合に効果的です。

Sub FormatShape()
    With Worksheets("Sheet1").Shapes("Rectangle 1")
        .Fill.ForeColor.RGB = RGB(0, 112, 192)
        .Line.Weight = 2.25
        .TextFrame2.TextRange.Text = "Sample Text"
        .TextFrame2.TextRange.Font.Bold = msoTrue
    End With
End Sub
動作概要
  • STEP1
    図形を指定

    まず、Worksheets(“Sheet1”).Shapes(“Rectangle 1”)を使用して、操作対象となる図形を指定します。
    この例では、「Sheet1」にある「Rectangle 1」という名前の四角形を操作します。

  • STEP2
    プロパティを設定

    Withステートメント内で、指定した図形に対して以下のプロパティを一括で設定します。

    • 塗りつぶし色
      • RGB(0, 112, 192)(青系の色)に設定します。
    • 線の太さ
      • 2.25ポイントの線の太さに設定します。
    • テキスト内容
      • 図形内に表示されるテキストを「Sample Text」に設定します。
    • フォントの太字設定
      • テキストのフォントを太字に設定します。

処理結果

使用例2の実行結果

このコードで使用している機能

  • Shapes (図形のオブジェクト)
  • Fill.ForeColor (図形の塗りつぶし)
  • Line.Weight (図形の線の太さ)
  • TextFrame2.TextRange.Text (図形内のテキスト)
  • TextFrame2.TextRange.Font.Bold (図形内のフォント太字)

1行ずつ解説

コードの詳細
  1. Sub FormatShape()
    • 新しいサブルーチン「FormatShape」を定義します。
      これは、図形のプロパティを設定するためのマクロです。
  2. With Worksheets(“Sheet1”).Shapes(“Rectangle 1”)
    • 「Sheet1」の中にある「Rectangle 1」という名前の図形を指定します。
      これにより、以降の操作はこの図形に対して行われます。
  3. .Fill.ForeColor.RGB = RGB(0, 112, 192)
    • 指定した図形の塗りつぶし色を青系の色「RGB(0, 112, 192)」に設定します。
      RGBは色を指定するための関数で、赤・緑・青の値を組み合わせて色を設定します。
  4. .Line.Weight = 2.25
    • 図形の枠線の太さを「2.25」ポイントに設定します。
      これにより、図形の輪郭が強調されます。
  5. .TextFrame2.TextRange.Text = “Sample Text”
    • 図形内に表示されるテキストを「Sample Text」に設定します。
      「TextRange.Text」は、図形内のテキストを操作するためのプロパティです。
  6. .TextFrame2.TextRange.Font.Bold = msoTrue
    • 図形内のテキストを「太字」に設定します。
      「msoTrue」は「太字」を有効にするための定数です。
  7. End With
    • 「Withステートメント」を終了し、図形に対する操作を完了します。
  8. End Sub
    • すべての処理が完了し、「FormatShape」サブルーチンが終了します。

このコードは、Excelで図形の外観やテキスト設定を効率的に行うための方法となります。
図形のように、特定のオブジェクトに対して複数のプロパティを設定する際、「Withステートメント」を使用することで、コードの可読性とメンテナンス性が向上します。
また、設定ミスが減り、統一されたデザインを簡単に適用できるようになります。

まとめ

VBAの「Withステートメント」は、特定のオブジェクトに対して複数の操作を行う際にコードを簡潔に保つための強力なツールです。

このステートメントを適切に使うことで、コードの可読性が向上し、メンテナンスが容易になります。

ポイントのおさらい

  • Withステートメントを使って、オブジェクトに対する操作を効率化する方法を理解する
  • WithとSetの違いを理解し、正しく使い分ける
  • Withステートメントがよく使われる場面を理解する
  • Withステートメントを使う際の注意点を押さえる
  • Withステートメントの使用例を確認し、実践的に利用する方法を学ぶ

この記事の内容を実践することで、VBAでのオブジェクト操作を効率的に行うことができ、日常業務の自動化や効率化に大いに役立つでしょう。

まずは、サンプルコードを試してみて、少しずつ自分のコードに取り入れてみてください。

タイトルとURLをコピーしました