VBA入門
Withステートメント

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

第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の時点で捕まえたオブジェクトは、Wnd 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ステートメント
変数のデータ型の説明において、Object…オブジェクト型 というのがあった事を覚えているでしょうか。数値や文字ではなく、オブジェクトを入れる変数がオブジェクト変数です。オブジェクトと言っても、いろいろなものがあります。
こちらと合わせて、しかっりと使えるようになってください。


サイト内の参考ページ

練習問題15(Withとオブジェクト変数の練習)
マクロVBA練習問題 ・シート「練習15」の表データを、シート「練習15_回答」に支店別・分類別に集計して下さい。※シート「練習15_回答」には、すべての支店と分類が必ずあるとします。練習問題用のExcelファイル こちらからダウンロードできます。
Withステートメントのマクロ実行速度について
マクロVBAにおいてWithステートメントはとても重要です、可読性(読みやすさ、理解しやすさ)、実行速度においては、その役割はとても大きいものになります。本記事では、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 ・・・新着記事一覧を見る

VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)
エクセルVBA 段級位 目安|エクセル雑感(2021-06-21)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門




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


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



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