Excelフォームでリストボックスにフォーカスがロックされる現象に悩まされた話

 日頃からこの日記を見に来てくださっている方のほとんどは、「Excelフォーム」などは使わないだろうけれど、不可解な事象で悩まされ、解決(というより回避)を見つけたので、日記に書いておきます。
 「自分ってすげー!」と思うことがあるとしたら、こういう時なのだな、とひとりごちてみたりしたひとときでした。

フォーム

 Excel2003 UserForm を新規作成し、ListBox と、その他適当にTextやCommandButton などを配置する。ListBox 以外は単にフォーカスを移動させるために使うだけなので、なんでもいい。
 今回は名前は変更せずに、デフォルトのままにしてある。




コード

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  MsgBox "Hi!"
  
  ListBox1.Clear
  ListBox1.ColumnCount = 3
  ListBox1.ColumnWidths = "30pt;35pt;20pt"
  ListBox1.AddItem "AAA"
End Sub

 ここでは、ColumnWidths がポイントで、
Clear とか、ColumnCount とかは、まぁこういうふうに再描画したいんですよ、というイメージのために置いたもの。

現象

(1)実行して、ListBoxをダブルクリックします
(2)表示されたダイアログを閉じます
(3)TextやButtonなどをクリックしてみます。フォーカスは普通に移動可能です
(4)ListBoxに "AAA" が表示されているので、それをダブルクリックします
(5)表示されたダイアログを閉じます
(6)TextやButtonなどをクリックしてみます。フォーカス移動できません!!!無反応で、まるで固まってしまったかのように見えます!!
(7)一旦ListBox内をクリックすれば、TextやButtonなどにもフォーカス移動可能になります。

回避策

 なんでこんなことが起こるのかが想像もつかないのですが、なんらかのステータスが内部でちゅうぶらりんになるような、そんなイメージなんでしょうかね(←全然内容がないよう)。ListBox処理から出てこられなくなっちゃう、みたいな。
 今回問題となったのは、Listbox.ColumnWidths の再設定の部分なので、実は毎度設定しなおす必要もないので、フォーム生成時に移動することで、一件落着。
 まぁ、毎回幅を設定するという下品なコードを書いていたことが発端ではあるので、お恥ずかしいところではあるのですが、なんとも解せない挙動ですね。他のバージョンではどうなのかしらん。


.