ExcelマクロVBA入門
第51回.Withステートメント

Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
最終更新日:2019-06-06

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


VBA With ステートメント


With ステートメントは、
指定したオブジェクトに対してオブジェクト名を再定義することなく、一連のステートメントを実行することができます。


文章で言えば、
主語を一度書いたら、その後は主語を省略する場合の書き方になります。


構文

With object
 [statements]

 ・・・
End With

With~End Withの間では、

Withに指定したオブジェクト名を省略できるようになります。



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

オブジェクト.プロパティ = 値

とするところを

With オブジェクト
 .プロパティ = 値
End 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


これを、Withを使うと、

With Range("A1")
  .Font.Bold = True
  .Font.Color = vbRed
  .Font.Size = 12
End 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の中では常に同じワークシートを参照しています。
つまり、
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の中で、
Withで指定したオブジェクトの位置をずらすようなVBAコードは書いてはいけません。
このようなコードを書いてしまうと、後々判読不能なVBAとなってしまいます。



VBAを書く時は、まずは、

With ワークシート

・・・

End With

このような形を意識して書き始めてみて下さい。


Withステートメントを使った時の、最も多い間違いは、

先頭の「.」を書き忘れてしまう事でしょう。

これは、いくら注意しても、やってしまいます。

ただ、そのような間違いが多いと意識していれば、減らすことが出来るでしょう。


Withを使用する事で、記述を省略できてタイピングも楽に速くなります。

そして何より、そのVBAコードが読みやすくなります。

Withステートメントは、積極的に使うようにして下さい。

サイト内の参考ページ

練習問題15(Withとオブジェクト変数の練習)
問題 ・シート「練習15」の表データを、シート「練習15_回答」に支店別・分類別に集計して下さい。※シート「練習15_回答」には、すべての支店と分類が必ずあるとします。練習問題用のExcelファイルは、こちらからダウンロードできます。

Withステートメントのマクロ実行速度について
マクロVBAにおいてWithステートメントはとても重要です、可読性(読みやすさ、理解しやすさ)、実行速度においては、その役割はとても大きいものになります。本記事では、Withステートメントを使うか使わないかでのマクロ実行速度の差に焦点を絞って検証します。




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

VBA関数(その他,Fix,Int,Rnd,Round,IsEmpty)
Like演算子とワイルドカード
総合練習問題6
Withステートメント
オブジェクト変数とSetステートメント
Workbookオブジェクト
Windowsオブジェクト
Worksheetオブジェクト
Rangeオブジェクト
Applicationのプロパティ
コレクションとは


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

IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)
Shift_JISのテキストファイルをUTF-8に一括変換|VBAサンプル集(5月31日)
「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)
VBA+SeleniumBasicで検索順位チェッカー作成|VBA技術解説(5月18日)
テーブル操作のVBAコード(ListObject)|VBA入門(5月12日)
テーブル操作の概要(ListObject)|VBA入門(5月12日)
VBAのスクレイピングを簡単楽にしてくれるSelenium|VBA技術解説(5月6日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.ひらがな⇔カタカナの変換|エクセル基本操作
7.繰り返し処理(For Next)|ExcelマクロVBA入門
8.マクロって何?VBAって何?|ExcelマクロVBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄


  • >
  • >
  • >
  • Withステートメント

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


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






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