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

With ステートメントを使う事で、
Withに指定したオブジェクトに対してオブジェクト名を繰り返し記述することなく、オブジェクトのプロパティやメソッドを記述することができます。
Withの構文
With object
[statements]
・・・
End With
With~End 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 Range("A1")
With .Font
.Bold = True
.Color = vbRed
.Size = 12
End With
End With
Withがネストされている場合に、.の前の省略されているオブジェクトは、
直前(そのステートメントが含まれる最も内側)のWithステートメントに指定したオブジェクトになります。
ただし、
Withのネストは、可読性が悪いので多用するのは避けた方が良いでしょう。
Withを使ったときに気を付けるべき書き方
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で指定したオブジェクトの位置をずらすようなVBAコードは書いてはいけません。
このようなコードを書いてしまうと、後々判読不能なVBAとなってしまいます。
Withの使いどころ
・・・
End With
タイピングが楽になり、また、文章の主語とも言えるオブジェクトを明確に意識してVBAを書き進められると思います。
習い始めにおいて、このように意識して書く練習をしてみると良いという事です。
先頭の「.」を書き忘れてしまう事でしょう。
ただ、そのような間違いが多いと意識していれば、おのずと減らすことが出来るでしょう。
そして何より、そのVBAコードが読みやすくなります。
Withステートメントは、VBAにおいて習得必須になります。
次回の
第52回.オブジェクト変数とSetステートメント
サイト内の参考ページ
同じテーマ「マクロ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コードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。