第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の時点で捕まえたオブジェクトは、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で指定したオブジェクトの位置をずらすような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 ・・・新着記事一覧を見る
抜けている数値を探せ|エクセル雑感(2022-07-01)
.Net FrameworkのSystem.Collectionsを利用|VBA技術解説(2022-06-29)
迷路ネコが影分身の術を体得したら…|エクセル雑感(2022-06-27)
迷路にネコが挑戦したら、どうなるかな…|エクセル雑感(2022-06-26)
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)|エクセル雑感(2022-06-24)
「マクロの登録」で登録できないプロシージャーは?|エクセル雑感(2022-06-23)
オブジェクトのByRef、ByVal、Variant|エクセル雑感(2022-06-22)
コメントから特定形式の年月を取り出す|エクセル雑感(2022-06-19)
4,9を使わない連番作成|エクセル雑感(2022-06-17)
連番を折り返して出力|エクセル雑感(2022-06-16)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.マクロって何?VBAって何?|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.エクセルVBAでのシート指定方法|VBA技術解説
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。