【VBA入門】Withステートメントの使用方法、入れ子・複数オブジェクトでの使い方

  • 2025.03.14
       
【VBA入門】Withステートメントの使用方法、入れ子・複数オブジェクトでの使い方

ExcelVBAでは、同一のオブジェクトに対して複数の処理を行う時、「With」ステートメントを使用してオブジェクト名の記述を省略することができます。
コードの記述量を減らすことができたり、オブジェクト名が変更になった場合に修正にかかる手間を省くことができたりと、効率的に作業が行えるようになる便利な方法です。

今回の記事では、Withステートメントの使い方について詳しく解説していきますので、ぜひ参考にしてみてください!

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

Withステートメントは、ExcelVBAで使用できる構文の一種です。
同一のオブジェクトに対して複数の処理を行う時、Withステートメントでそのオブジェクトに対する処理を囲うことで、オブジェクト名を省略して記述をまとめることができます。

Withステートメントを使用する際は、次のような形式でコードを記述します。

【基本構文】

With 対象のオブジェクト名
    .処理1
    .処理2
    ...
End With

このように、本来は「.(ドット)」の前に記述しなければいけないオブジェクト名を、Withステートメントで囲うことで省略することができます。
オブジェクト名が変更になった時も、ステートメントの隣に記述したコードを修正するだけで済むため、効率が良くなるだけでなくミスの削減にも繋がります。

Withステートメントの使い方

Withステートメントの使い方について、サンプルコードと共に見ていきましょう。
例えば、次のようなコードがあるとします。

【サンプルコード1】

Sub sample()

    Worksheets("Sheet1").Cells(1, 1).Font.Color = vbRed
    Worksheets("Sheet1").Cells(1, 1).Font.Size = 20
    Worksheets("Sheet1").Cells(1, 1).Font.Bold = True
    Worksheets("Sheet1").Cells(1, 1).Font.Underline = xlUnderlineStyleSingle
    
End Sub

Fontオブジェクトを使用し、セルの文字色やサイズなどの書式変更を行っています。
処理ごとに基準となるオブジェクトを記述するだけでもかなりの量があり、コード自体も煩雑として見えるため、あまり可読性が高くありません。

このコードを、Withステートメントを使用して記述し直してみましょう。

【サンプルコード2】

Sub sample()

    With Worksheets("Sheet1").Cells(1, 1).Font

        .Color = vbRed
        .Size = 20
        .Bold = True
        .Underline = xlUnderlineStyleSingle

    End With
    
End Sub

Withステートメントで記述をまとめることで、すっきりと見やすい印象になったかと思います。
全体のコードが簡潔になっただけでなく、1つのブロックとして処理をまとめることで、どのオブジェクトに対応しているのかが視覚的にも明確になっています。

コードの可読性に関しては処理内容にもよるため、反対にデメリットとなり得るケースもありますが、上記のようなコードは使用に適している一例と言えるでしょう。

Withで複数のオブジェクトを指定したい場合はどうする?

操作したいオブジェクトが複数ある場合に、Withステートメントを入れ子(ネスト)状態で記述することもできます。
詳しい使い方について見ていきましょう。

Withを入れ子(ネスト)で使う

例えば、同一のワークシート内で、セルごとに複数の処理を行うといったケースがあるとします。
セルごとにWithステートメントのブロックを完全に分けて記述する方法も勿論ありますが、入れ子状態に記述することで、類似する処理を1つのブロックにまとめることもできます。

以下のサンプルコードを見てみましょう。

【基本構文】

Sub sample()
    
    With Worksheets("Sheet1").Cells(1, 1)

        With .Font

            .Color = vbRed
            .Size = 15
            .Bold = True

        End With

        With .Interior

            .Color = vbCyan
            .Pattern = xlVertical

        End With
        
    End With

End Sub

同一のセルに対して、セルの書式に関する処理と背景に関する処理を、それぞれWithステートメントでまとめています。

入れ子にせず、オブジェクトごとに処理を完全に分ける場合は、次のようなコードになります。

【サンプルコード2】

Sub sample()
    
    With Worksheets("Sheet1").Cells(1, 1).Font

        .Color = vbRed
        .Size = 15
        .Bold = True

    End With
    
    With Worksheets("Sheet1").Cells(1, 1).Interior

        .Color = vbCyan
        .Pattern = xlVertical
        
    End With
       
End Sub

どちらの方が見やすいかと感じるかは、見る人や内容によって変わるかと思いますので、状況に応じて管理のしやすい方で記述するといいでしょう。

Withの中で条件分岐させたい場合はどうする?

セルの値によって文字色を変化させたりなど、処理内容を条件分けしたいケースもあるでしょう。
Withステートメント内で条件分岐を行う場合の記述方法についても説明していきます。

WithとIfを組み合わせて使う

通常のコードと同じように、Withステートメント内でもIfステートメントを使用することができます。
以下のサンプルコードを見てみましょう。

【サンプルコード】

Sub sample()

    With Worksheets("Sheet1").Cells(1, 1)
    
        If .Value = "出席" Then
        
            .Font.ColorIndex = 3
            .Interior.ColorIndex = 0
            
        ElseIf .Value = "欠席" Then
        
            .Font.ColorIndex = 1
            .Interior.ColorIndex = 15

        End If

    End With
    
End Sub

If文を使用して、セルの値に応じて文字色と背景色を変更しています。
Withステートメント内にコードを記述しているため、If文においてもオブジェクト名を省略することができています。

Withブロック変数のエラーが出た場合の対処法

Withステートメントを使用した際に、「実行時エラー ‘91’: オブジェクト変数またはWithブロック変数が設定されていません」というエラーメッセージが出ることがあります。
このエラーが発生する要因として最も多いのが、Setステートメントを付け忘れているケースです。

例えば、以下のサンプルコードのように、変数に一旦オブジェクトを格納してから処理を行おうとしたとします。

【サンプルコード】

Sub sample()

    Dim cell As Range
    cell = Worksheets("Sheet1").Cells(1, 1)

    With cell.Font

        .ColorIndex = 3
        .Bold = True

    End With
    
    With cell.Interior

        .ColorIndex = 20
        .Pattern = xlGray8
        
    End With
    
End Sub

このコードを実行しようとすると、上記のエラーが発生します。
変数にオブジェクトを格納する際は、変数名の前に必ずSetステートメントを付けるようにしましょう。

【正しい実装例】

Sub sample()

    Dim cell As Range
    Set cell = Worksheets("Sheet1").Cells(1, 1)

    With cell.Font

        .ColorIndex = 3
        .Bold = True

    End With
    
    With cell.Interior

        .ColorIndex = 20
        .Pattern = xlGray8
        
    End With
    
End Sub

まとめ

いかがでしたか?
Withステートメントは、コードを簡潔に記述する上で有用なツールの1つになります。
ぜひ、使い方を覚えて活用してみてくださいね!

関連記事

VBAの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事