投稿

ラベル(With)が付いた投稿を表示しています

Translate

VBAやVBでWithを使うのは避けた方が良い

Withを使うと、非同期処理や他コードへの移植に支障が出る。 オブジェクト変数または With ブロック変数が設定されていません VBAで、処理速度改善等で、最終的にはApplication.Ontime 等を利用した非同期処理に手を出す事になるが、コーディングにWithを利用していると非常に不味い事になる。 非同期処理でSheet1とSheet2の両方に何かを出力するプログラムがあるとして、Sheet1への非同期処理と、Sheet2の非同期処理が同時に動いた際に、With Sheets("Sheet1")= "test"とWith Sheets("Sheet2") という処理が同時に動作すると、 片方のWithはSheet1を指しながら、同時にSheet2のセルへ何かを書き込む処理が在ったとすると、Sheet1へ書き込まれるべきものが、Sheet2の.Range("A1").Value = "1" とみなされSheet2へ書き込まれたり等してしまう。 両方の処理でWithがSheetを指している場合は、誤動作レベルで済むが、Withがそれぞれ、別のコントロールや、共通のメソッドを持っていない物で使用されていると、「オブジェクト変数または With ブロック変数が設定されていません」と表示されてしまう。 コーディングに熟練した人であれば、予め非同期や多言語移植も考えて、Withが便利であっても使用せずにコーディングするのだが、VBAの小、中級プログラマーは、非同期や、多言語間への移植など考慮せずにコーディングするので、予めコーディング規約などで、Withは使用しない事等を規約に入れていくと良いだろう