なんだか無能なVBA

簡単な作業を自動化するためにAccessVBAスクリプトを書いた。
そのスクリプトで作成したクエリーを一括削除するために、また別のVBAを書いた。
すると、何故かクエリーが全部消えない。色々調査するうちにこのようなことが。

  • for each YYY in XXX で書いたが一部しか消えない。
  • for X = Y to Z で書いているうちに、「ちょうど半分しか消えない」ことが分かった。
  • つまり、「前から消しているのだが、消した瞬間にオブジェクトのインデックスが更新されるので、一つ進んだつもりが二つ進んでしまうことになる」
  • 後ろから消していくと全部消える。

for X = Y to Zで書いたときの問題ははっきり言って書き方が無能だったが、for each文がうまくいかないのは「対象コレクションの中身を消す」操作が想定外ということなのだろう。内部的にはindexでループ処理をしているに過ぎない、ということか。

ちなみに類似の方法でテーブルを全部消そうとしたら、「テーブルコレクションにシステムテーブルがふくまれている」為に簡単にはいかないことが分かった。システムテーブルとか非表示のテーブルとかについているプロパティがありそうなものだが、ぱっと身では見つからなかった。自分用に作っているだけなのでその時点で作業を放棄。