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

このブログの人気の投稿

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

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

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

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

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

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

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

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

ACCESSのVBAでリストビュー(ListView)を使う為の設定 | Office365

ASP.NETのでクライアント証明書を使ったログイン認証を行う方法