Categories: VBA

VBA│Withステートメントの使い方。オブジェクトを省略する

この記事では、VBAのWithステートメントの概要と使い方を実際のVBAコードも含めて紹介します。

Withステートメントは、同じセル等に複数のプロパティを設定する時など何度も同じオブジェクトを記述する手間を省略することができます。

VBAコードを書く手間の削減や可読性の向上にも役に立つステートメントとなりますので、使いどころも多いでしょう。

早速、Withステートメントの概要と実際のVBAコードを見ていきましょう。

VBA│Winthステートメントの概要

この章では、Withステートメントの概要を説明します。

オブジェクトを省略する

まずは、下記のイメージ図をご覧ください。セルB2に合計額というテキストが設定されています。

セルB2への操作内容

セルB2に対して実施した操作は下記の通りです。

  1. 合計額と入力
  2. 文字サイズを20に設定
  3. 赤字に設定
  4. 太字に設定
  5. 下線を設定

これらの設定は、基本的なVBAの構文の場合、すべてのステートメント(行)に「セルB2に・・」というようにオブジェクトを指定しなければなりません。「セルB2に合計額というテキストを設定」「セルB2のテキスト色を赤字に設定」・・という具合です。

この「セルB2」というオブジェクトを予め設定しておき、指定する範囲において「セルB2」という記述を省略するのが今回の記事で説明するWithステートメントです。

Withステートメント

Withステートメントを使わない例

  • セルB2に合計額というテキストを設定
  • セルB2の文字サイズを20に設定
  • セルB2を赤字に設定
  • セルB2を太字に設定
  • セルB2に下線を設定

Withステートメントを使った例

  • 合計額というテキストを設定
  • 文字サイズを20に設定
  • 赤字に設定
  • 太字に設定
  • 下線を設定

VBA│Withステートメントの実例

前章では、Withステートメントの概要を説明しました。オブジェクトを省略して記述することの意味はご理解いただけたかと思います。

この章では、Withステートメントを使った実際のVBAコードを紹介します。

基本

With.object
・・・
End With

  • object = 省略するオブジェクト
  • End With = Withステートメントの有効範囲

実例VBAコード

前章の事例を基に説明します。

  • 合計額というテキストを設定
  • 文字サイズを20に設定
  • 赤字に設定
  • 太字に設定
  • 下線を設定

[基本:実例VBAコード]

Sub Sample()

 With Range("B2")
  .Value="合計額"
  .Font.Size = 15
  .Font.ColorIndex = 3
  .Font.Bold = True
  .Font.Underline = True
 End With

End Sub
解説

Withステートメントでは、オブジェクトを省略する構文の前で予めオブジェクトを指定しておきます。

上記の例では、「With Range(“B2”)」の行ですね。以降、End Withまでの間は、With.Range(“B2”)というオブジェクトの代わりに「.(ピリオド)」を記述するだけで、With以降のオブジェクトが指定されます。

なお、上記のサンプルコードはWithステートメントを使わなかった場合、下記のようになります。

[Withステートメントを使わなかった例]

Sub Sample()
 
 Range("B2").Value="合計額"
 Range("B2").Font.Size = 20
 Range("B2").Font.ColorIndex = 3
 Range("B2").Font.Bold = True
 Range("B2").Font.Underline = True

End Sub

Withステートメントの入れ子(ネスト)

Withステートメントは入れ子で記述することも可能です。

入れ子(ネスト)とは・・大きい箱に中くらいの箱を入れて、さらに中くらいの箱の中に小さい箱を入れて、というように、構造が複数の階層になることを入れ子(ネスト)といいます。VBAに限らず、プログラミング言語全般の概念です。

この章で紹介したWithステートメントの構文では、「Range(“B2”)」というオブジェクトの他にも共通する箇所が存在しています。5行目から8行目にかけては「.Font」も共通していますね。

[共通箇所が複数ある例]

Sub Sample()

 With Range("B2")
  .Value="合計額"
  .Font.Size = 15
  .Font.ColorIndex = 3
  .Font.Bold = True
  .Font.Underline = True
 End With

End Sub

この場合、Withステートメントを入れ子にして下記のように記述することができます。

[Withステートメントの入れ子]

Sub Sample()

 With Range("B2")
  With .Font
   .Font.Size = 15
   .Font.ColorIndex = 3
   .Font.Bold = True
   .Font.Underline = True
  End With

   .Value="合計額"
 End With

End Sub

このサンプルには実用性はありませんが、Withステートメントの入れ子の一例としてご参照ください。

上記の例を見ても分かるのですが、入れ子(ネスト)をすると層が複雑化し可読性が悪くなる場合も多いです。合理的な箇所以外では多用は避けたほうがよいでしょう。

Webs

元事務処理担当者として、プログラミングを活用した業務改善を推進している。プログラマ出身ではない事務職の現場目線で情報を発信。 その他、webs-studio.jpをメインに、複数のブログサイトを立ち上げており、合計で月間10万PVのメディア運営を行っている。 姉妹サイト一覧