「特定のオブジェクトに対して、複数のプロパティやメソッドを簡潔に記述したいけど、どうやって書けばいいんだろう…」
そんな疑問を持っていませんか?
この記事では、VBAの「Withステートメント」を使って、オブジェクトに対する操作を効率的に記述する方法を詳しく解説します。
「Withステートメント」を使うことで、Excel VBAでのコードが読みやすくなり、ミスを減らすことができます。
使用例もすべてコピペして実行できるので、ぜひ最後までご覧いただき、実践してみてください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事でできるようになること
この記事を読むことで、以下のことができるようになります。
VBAのWithステートメントとは?
Withステートメントは、VBAで特定のオブジェクトに対して複数のプロパティやメソッドを簡潔にまとめて記述するために使用される構文です。
たとえば、あるセル範囲に対して複数のプロパティを設定する場合、一つずつ記述するとコードが長くなってしまいます。
しかし、Withステートメントを使うことで、対象のオブジェクトを一度だけ指定し、その後に続くプロパティやメソッドを短く書くことができます。
VBA Withステートメントの基本構文
- オブジェクト
- 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
解説
上記のコードでは、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
解説
上記のコードでは、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背景色と枠線の設定
セルの背景色を黄色に変更し、枠線を設定して書式を完成させます。
処理結果
このコードで使用している機能
- Font.Bold (文字を太字)
- Font.Color (文字の色変更)
- Interior.Color (セルの色変更)
- Borders.LineStyle (罫線を設定)
1行ずつ解説
- Sub FormatRange()
- この行で、「FormatRange」というサブルーチン(処理のまとまり)を定義しています。
このサブルーチンを実行すると、指定したセル範囲の書式が変更されます。
- この行で、「FormatRange」というサブルーチン(処理のまとまり)を定義しています。
- With Worksheets(“Sheet1”).Range(“B2:F7”)
- 「Sheet1」の「B2」から「F7」までのセル範囲を指定し、その範囲に対して後続の操作を行う準備をしています。
「With」を使うことで、この範囲に対して複数の設定を一度に行うことができます。
- 「Sheet1」の「B2」から「F7」までのセル範囲を指定し、その範囲に対して後続の操作を行う準備をしています。
- .Font.Bold = True
- 指定したセル範囲内のすべての文字を太字にします。
「True」を指定することで、太字が有効になります。
- 指定したセル範囲内のすべての文字を太字にします。
- .Font.Color = RGB(255, 0, 0)
- フォントの色を赤(RGB値で指定)に変更します。
RGB(255, 0, 0)は、赤色を意味します。
- フォントの色を赤(RGB値で指定)に変更します。
- .Interior.Color = RGB(255, 255, 0)
- セルの背景色を黄色に変更します。
RGB(255, 255, 0)は、黄色を意味します。
- セルの背景色を黄色に変更します。
- .Borders.LineStyle = xlContinuous
- 指定したセル範囲に枠線を設定します。
「xlContinuous」は、「連続した線(実線)」を意味します。
- 指定したセル範囲に枠線を設定します。
- End With
- 「With」で開始した操作がここで終了します。
これにより、指定したセル範囲の書式設定が完了します。
- 「With」で開始した操作がここで終了します。
- 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」に設定します。
- フォントの太字設定
- テキストのフォントを太字に設定します。
- 塗りつぶし色
処理結果
このコードで使用している機能
- Shapes (図形のオブジェクト)
- Fill.ForeColor (図形の塗りつぶし)
- Line.Weight (図形の線の太さ)
- TextFrame2.TextRange.Text (図形内のテキスト)
- TextFrame2.TextRange.Font.Bold (図形内のフォント太字)
1行ずつ解説
- Sub FormatShape()
- 新しいサブルーチン「FormatShape」を定義します。
これは、図形のプロパティを設定するためのマクロです。
- 新しいサブルーチン「FormatShape」を定義します。
- With Worksheets(“Sheet1”).Shapes(“Rectangle 1”)
- 「Sheet1」の中にある「Rectangle 1」という名前の図形を指定します。
これにより、以降の操作はこの図形に対して行われます。
- 「Sheet1」の中にある「Rectangle 1」という名前の図形を指定します。
- .Fill.ForeColor.RGB = RGB(0, 112, 192)
- 指定した図形の塗りつぶし色を青系の色「RGB(0, 112, 192)」に設定します。
RGBは色を指定するための関数で、赤・緑・青の値を組み合わせて色を設定します。
- 指定した図形の塗りつぶし色を青系の色「RGB(0, 112, 192)」に設定します。
- .Line.Weight = 2.25
- 図形の枠線の太さを「2.25」ポイントに設定します。
これにより、図形の輪郭が強調されます。
- 図形の枠線の太さを「2.25」ポイントに設定します。
- .TextFrame2.TextRange.Text = “Sample Text”
- 図形内に表示されるテキストを「Sample Text」に設定します。
「TextRange.Text」は、図形内のテキストを操作するためのプロパティです。
- 図形内に表示されるテキストを「Sample Text」に設定します。
- .TextFrame2.TextRange.Font.Bold = msoTrue
- 図形内のテキストを「太字」に設定します。
「msoTrue」は「太字」を有効にするための定数です。
- 図形内のテキストを「太字」に設定します。
- End With
- 「Withステートメント」を終了し、図形に対する操作を完了します。
- End Sub
- すべての処理が完了し、「FormatShape」サブルーチンが終了します。
このコードは、Excelで図形の外観やテキスト設定を効率的に行うための方法となります。
図形のように、特定のオブジェクトに対して複数のプロパティを設定する際、「Withステートメント」を使用することで、コードの可読性とメンテナンス性が向上します。
また、設定ミスが減り、統一されたデザインを簡単に適用できるようになります。
まとめ
VBAの「Withステートメント」は、特定のオブジェクトに対して複数の操作を行う際にコードを簡潔に保つための強力なツールです。
このステートメントを適切に使うことで、コードの可読性が向上し、メンテナンスが容易になります。
ポイントのおさらい
この記事の内容を実践することで、VBAでのオブジェクト操作を効率的に行うことができ、日常業務の自動化や効率化に大いに役立つでしょう。
まずは、サンプルコードを試してみて、少しずつ自分のコードに取り入れてみてください。