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は使用しない事等を規約に入れていくと良いだろう

このブログの人気の投稿

ACCESSでバーコードをスキャンして登録更新する簡単なサンプル

VBAのADOで「パラメーターが少なすぎます。xを指定してください。」と表示された場合の原因

ACCESSのVBAを実行するとACCESSが強制終了する事がある

DataSpiderのファイル処理が遅い原因は大体コレ

ACCESSでバーコードスキャンしたら自動でイベントを起こす方法

DataSpiderでお手軽に配列でマッチングするみたいな事をする方法

PostgreSQL 11 でpg_dumpallを使ってバックアップしたデータをリストアするとき文字化けの対処法

VBSでマクロの実行時に警告を非表示にする方法

pgAdmin 4が遅いのは仕方がない | PostgreSQL things.

ACCESSのVBAでADOを利用したバインド変数を利用したデータベース連携方法