« 『Excel VBAスタンダード VBAエキスパート』 | トップページ | あるあるエラー:オブジェクト変数 »

2011年9月 3日 (土)

Withを使うか、オブジェクト変数を使うか

Withステートメントを使うと入力を省略できます。
例えば次のようなコードについて説明します。

Sheets("Sheet1").Cells(1,1) = 1
Sheets("Sheet1").Range("A2") = 2

このコードをWithステートメントを使うと
次のコードのように入力できます。

With Sheets("Sheet1")
    .Cells(1,1) = 1
    .Range("A2") = 2
End With

これをオブジェクト変数を使ってやってみます。

Dim sh As Object
Set sh = Sheets("Sheet1")
sh.Cells(1,1) = 1
sh.Range("A2") = 2

個人的には上から順番に
コードの仕方が変わってきました。
WithはJavaにはなかったのでスルーしていましたが、
使えば便利です。

しかし、Withステートメントは入れ子状に使うので
その中のコードが長くなるとき見にくくなるので、
最近は避けるようになりました。
またIf文のような中でWithを使うと
何重にも入れ子になり見にくくなると思います。

このような理由でオブジェクト変数を使うのを好みます。

大体の処理や操作は
A → B
なので汎用のオブジェクト変数が2つあれば
たくさん変数を宣言しなくても対応できます。

例えば、"Sheet1"シートのセルA1の値を
"Sheet2"シートのセルC1の値に代入するときこのようにします。

Dim sh1 As Object
Dim sh2 As Object
Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")

sh2.Range("C1") = sh1.Range("A1")

もう一つWithステートメントの使いにくいところを挙げると、
デバッグモードのときに
Withの中のコンマで始まる個所を変更できないことです。
変更しようとすると
次のようなダイアログが出て終了しなければいけません。
Vba20110903a

現時点での方針は、
扱うオブジェクトが少ない、つまり
WithとEnd Withの間が短くて済む場合は
Withステートメントを使います。
そのほかの場合はオブジェクト変数を使います。

本ブログを参考にする場合、
この事を頭の片隅に置いて読むと理解しやすいかと思います。

|

« 『Excel VBAスタンダード VBAエキスパート』 | トップページ | あるあるエラー:オブジェクト変数 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Withを使うか、オブジェクト変数を使うか:

« 『Excel VBAスタンダード VBAエキスパート』 | トップページ | あるあるエラー:オブジェクト変数 »