【Excel VBA】フォームのテキストボックスが前の情報を保持し続けてしまう問題の解決方法

【Excel VBA】フォームのテキストボックスが前の情報を保持し続けてしまう問題の解決方法

Excelのユーザフォームが便利なので、VBAを使って簡単な業務効率化ツールとかをすぐに作ってしまうのですが、今まで「何でこんなことになるんだろう?」って思ってたことがあります。

  1. とあるセルに入力している内容を読み取ってユーザフォームのテキストボックス内に表示するプログラム
  2. セルの値に値を設定してユーザフォームを開くと設定した値がテキストボックスに表示されます。
  3. セルの値を修正してもう一度ユーザーフォームを閉じて開き直すと変更前の値がテキストボックスに表示される
  4. ???????????
  5. ユーザーフォームを閉じる「キャッシュとかあるのかなぁ?」なんて思う
  6. 2度目にユーザフォームを開けば変更後の値が表示されるので満足する

ということであまり問題視せずに放置していたのですが、今回仕事で自分が使うツールではなくユーザが利用する業務効率ツールを作ることになったので、このバグは残してちゃいかん!ということで原因調査をして無事に解決できたので、その方法について共有しておこうと思います。

 

UserForm_initialize()が重要だった

実はこのコントロールを使っていなかったことが一番の原因のようです。
Excelのユーザフォームに初期設定する内容を当初は、モジュール側から設定していました。
その場合、モジュール側からの初期値設定とモジュールがUserFormを開く順序性が崩れてしまって正しく変更後の値を取得することができていなかったようです。
なので、モジュール側で実装していた処理を全てUserForm_initialize()の中に引っ越すことで問題は解決出来ました。

 

UserForm.hideの罠

モジュール側からUserFormを呼び出すときには以下のプログラムを使うと思います。

UserForm.show

なら当然閉じるときは、showの反対でhideを使いたくなるのが普通ですよね?

UserForm.hide

これが罠だったんです。
hideでユーザーフォームを閉じるとたとえUserForm_initialize()コマンドを利用していたも、そのユーザーフォームは閉じられたのではなく非表示になってるだけです。そのため値は変数上に保持されたままとなるので値を修正しても修正前の値が表示されることが多々あります。UserFormを閉じるときはhideではなくUnloadを使うように心がけましょう。

Unload UserForm

 

まとめ

この事象ってなかなかネット上に情報が転がってなくて、もしかするとVBAを扱うひとにとっては常識なのかもしれませんね。
あと、わたしが現在利用しているOfficeのバージョンがまさかの2002というのも関係しているかもしれません。。。

 

らいか
Officeはバージョンが違うだけで全然挙動が違うから、すぐにこういうハマり方をしちゃうんだよね
【Excel VBA】フォームのテキストボックスが前の情報を保持し続けてしまう問題の解決方法

SNSへのシェアはこちらから!

ABOUTこの記事をかいた人

工業高等専門学校を卒業後、NTTグループのSI企業に就職。数々の炎上案件を鎮火するために日本各地を5年間転々とする。2015年に一般ユーザ向けのWebシステム開発案件のチームリーダとして業務に従事し、改めて"Webのものづくりの楽しさ"に気付きWeb制作会社に転職。Web制作やアクセス解析を使ったオウンドメディアの運用改善などを行っていく中で、もっとユーザー目線でWebをただ制作するだけではなく企画や運用まで幅広い領域で仕事がしたいと感じるようになり、Webディレクターのキャリアを目指す。日本中のビジネスホテルに詳しく、犬や猫よりも鳥派。