1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自フォームでもコントロールにアクセスするときにはMe修飾子を付けよう

1
Posted at

前置き

Access等でフォーム上にコントロールを乗せて、VBAでそのコントロールにアクセスする際には、そのコントロール名を指定すると思います。普通にコードを記述すると、コントロール名だけで、値やプロパティを操作できるのですが、思わぬ現象に遭遇したので、備忘としてここに残します。

現象

フォーム上のコントロール名が既存フォーム上のコントロール名と重複している別フォームを別のaccdbよりインポート、フォームの削除、インポートを繰り返すと、インポートしたフォームを開くタイミングでAccessごと落ちるようになる。
この別フォームは自前のツールのため、インポート後に使えなくなったことに困っていました。

暫定対応

インポート後に、decompileをかければ問題なく動作することが分かったため、インポート後はdecompileを行い、一時しのぎとしてしました。ただ、その後最適化してしまうと再発するため、根本解決にはなっていませんでした。

結局

何が悪かったかというとコードの書き方が悪かったのです。
エラートラップでの記述が誤っていたため(しかもコンパイルでは引っかからないパターン)その場で無限ループに陥りAccessが落ちていただけでした。

残った謎

しかし、Formを開くタイミングでエラーが発生する(FormLoadイベントでエラーになる)のは完全に謎のままでした
chatGPTで壁打ちをしたところ、コントロールの参照にMe!修飾子が付いていないので、付けるように言われたので、付けたところ、現象が治まりました。個人的には意味が分かりません。
ここからは完全に推測になりますが、プロジェクトに追加された順番で内部番号が付けられていて、その番号が事実上の優先度になっているのではないかと思います。

その結果、(Me!が付いていない場合)名称が重複していると、先に見つかった方が最適化の対象として紐づけられ、そのまま訳の分からない状態になってしまったのだろうと想像しています。

結論

勝手にコントロール名は未修飾でも自フォームのものを参照するものだと思い込んでいたので、痛い目にあいました。今後はきちんとMe修飾子を付けようと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?