VBA入門
Withステートメント

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日: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 ・・・新着記事一覧を見る

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




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


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



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