VBA入門
Withステートメント

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2023-03-07

第51回.Withステートメント


VBA With ステートメント

With ステートメントを使う事で、
Withに指定したオブジェクトに対してオブジェクト名を繰り返し記述することなく、オブジェクトのプロパティやメソッドを記述することができます。


同じオブジェクトに対して様々な処理を行う時に、Withで1度だけ書いて、その後はオブジェクトを省略して書くことができます。

文章で例えて言えば、主語を一度だけ書いて、その後は主語を省略するような書き方になります。


Withの構文

With object
  [statements]
  ・・・
End With

With~End Withの間では、
ピリオドから書き始めることでオブシェクト名を省略した書き方ができます。


Withを使った時と使わない時の比較

Withステートメントを使わない通常の記述では、

オブジェクト.プロパティ = 値
オブジェクト.メソッド

このように記述するところを、

With オブジェクト
  .プロパティ = 値
  .メソッド
End With

このようにオブジェクトの記述を省略し、.から書き始めることが出来るということです。


Withの使用例

Worksheets(1).Cells(1, 1) = 1
Worksheets(1).Cells(2, 1) = 2


これを、Withを使って書くと、

With Worksheets(1)
  .Cells(1, 1) = 1
  .Cells(2, 1) = 2
End With


このようになります。
つまり、
With~End Withの間では、
.で書き始めれば、.の前のWithのオブジェクトが省略できることになります。

Range("A1").Font.Bold = True
Range("A1").Font.Color = vbRed
Range("A1").Font.Size = 12


これを、Range("A1") をWithに指定して書くと、

With Range("A1")
  .Font.Bold = True
  .Font.Color = vbRed
  .Font.Size = 12
End With


さらに、Range("A1").Font までをWithに指定して書くと、

With Range("A1").Font
  .Bold = True
  .Color = vbRed
  .Size = 12
End With


このように書く事も出来ます。


Withのネスト

Withはネストする事も出来ます。

With Range("A1")
  With .Font
    .Bold = True
    .Color = vbRed
    .Size = 12
  End With
End With


Withがネストされている場合に、.の前の省略されているオブジェクトは、
直前(そのステートメントが含まれる最も内側)のWithステートメントに指定したオブジェクトになります。
ただし、
Withのネストは、可読性が悪いので多用するのは避けた方が良いでしょう。


Withを使ったときに気を付けるべき書き方

まずは、以下のVBAコードをご覧ください。

Sub sample1()
  With Worksheets(1)
    Debug.Print .Name
    Worksheets.Add Before:=Worksheets(1)
    Debug.Print .Name
  End With
End Sub

イミディエイト ウインドウには、
もともと先頭にあったシートのシート名が2回出力されます。
Withの時点で捕まえたオブジェクトは、End Withまで保持され、
Withの中では常に同じワークシートを参照します。
つまり、
WithでWorksheets(1)と書かれていても、必ずしも1番目のシートを参照しているとは限らないという事です。

Sub sample2()
  With Range("A1")
    Debug.Print .Address
    Rows(1).Insert
    Debug.Print .Address
  End With
End Sub

イミディエイト ウインドウには、
$A$1
$A$2
このように出力されます。
Worksheets(1)と同じで、
WithでRange("A1")と書かれていても、必ずしもA1セルを参照しているとは限りません。
Withの時点で捕まえたRangeがそのまま保持されます。

Withの中で、
Withで指定したオブジェクトの位置をずらすようなVBAコードは書いてはいけません。
このようなコードを書いてしまうと、後々判読不能なVBAとなってしまいます。


Withの使いどころ

VBAを書く時は、まずは、

With ワークシート
  ・・・
End With

このような形を意識して書き始めてみると良いでしょう。
タイピングが楽になり、また、文章の主語とも言えるオブジェクトを明確に意識してVBAを書き進められると思います。
必ずしも常にこのように書いたほうが良いという事ではありません。
習い始めにおいて、このように意識して書く練習をしてみると良いという事です。

Withステートメントを使った時の、最も多い間違いは、
先頭の「.」を書き忘れてしまう事でしょう。

これは、いくら注意しても、やってしまいます。
ただ、そのような間違いが多いと意識していれば、おのずと減らすことが出来るでしょう。

Withを使用する事で、記述を省略できてタイピングも楽に速くなります。
そして何より、そのVBAコードが読みやすくなります。
Withステートメントは、VBAにおいて習得必須になります。
次回の
第52回.オブジェクト変数とSetステートメント
・オブジェクト変数 ・個有のオブジェクト型とは ・Setステートメント ・Setステートメントの使用例 ・WithとSetの使い分け方 ・Setステートメントの実践的な使い方 ・Is演算子によるオブジェクトの比較 ・最後に
こちらと合わせて、しかっりと使えるようになってください。


サイト内の参考ページ

練習問題15(Withとオブジェクト変数の練習)
・マクロVBA練習問題 ・シンキングタイム ・マクロVBA練習問題解答へ
Withステートメントのマクロ実行速度について
・マクロVBAのテストコード(Worksheet) ・マクロVBAのテストコード(Range) ・Withステートメントの注意点 ・最後に




同じテーマ「マクロVBA入門」の記事

第49回.Like演算子とワイルドカード
第50回.総合練習問題6
第87回.WorksheetFunction(ワークシート関数を使う)
第51回.Withステートメント
第52回.オブジェクト変数とSetステートメント
第53回.Workbookオブジェクト
第54回.Windowsオブジェクト
第55回.Worksheetオブジェクト
第56回.Rangeオブジェクト(RangeとCells)
第57回.Applicationのプロパティ(マクロ高速化と警告停止等)
第58回.コレクションとは(Collection)


新着記事NEW ・・・新着記事一覧を見る

列全体を指定する時のRangeとColumnsの違い|ツイッター出題回答 (2023-09-24)
シートのActiveXチェックボックスの指定方法|ツイッター出題回答 (2023-09-24)
ByRef引数の型が一致しません。|ツイッター出題回答 (2023-09-22)
シートコピー後のアクティブシートは何か|ツイッター出題回答 (2023-09-19)
Excel関数の引数を省略した場合について|ツイッター出題回答 (2023-09-14)
セル個数を返すRange.CountLargeプロパティとは|VBA技術解説(2023-09-08)
記号を繰り返してグラフ作成(10単位で折り返す)|ツイッター出題回答 (2023-08-28)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-08-24)
ランクによりボイントを付ける(同順位はポイントを分割)|ツイッター出題回答 (2023-08-22)
OneDrive使用時のThisWorkbook.Pathの扱い方|VBA技術解説(2023-07-26)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロとは?VBAとは?VBAでできること|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.条件分岐(IF)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ