トップ回答者
Visual basic でのForm制御について

質問
-
はじめまして
Visual BasicでのForm制御について質問があります。
[環境]
・Microsoft Visual Basic 6.5 in CATIA V5R18
(CATIAに内蔵されたVBA環境で開発しています)
[行いたいこと]
・From上のボタンやコンボボックスを押下/変更し、CAD側のパラメータ更新等を行っている間、
UI上の操作を不可としたい
[課題]
・NewされたUserFromをの中の押下イベントで、
NewされたFormオブジェクトのEnabledプロパティをFalse→Trueにしても
Formは触れないまま
[コード]
UIオープン
Dim uIformObj As UserForm1
Set uIformObj = New UserForm1
uIformObj.Show vbModeless
ボタンクリック時Private Sub btn1_Click()
Me.Enabled = false
Call function1()
Me.Enabled = True
End Sub
上記のコードを記載した場合、ボタン1を押下した後、Formが触れなくなったままとなります。(処理は終了しており、Clickイベントも最後まで通過している)
ただし、下のように別のFormをClickイベント内でモーダレスでShowすると
処理が終了した際にFormは触れるようになることが分かっています
Private Sub btn1_Click()
AnotherForm.Show vbModeless
Me.Enabled = false
Call function1()
Me.Enabled = True
End Sub
この場合、AnotherFormはNewしているのではなく、直接、Showしています(複数起動は出来ない)
(New AnotherFormの場合の結果は未確認)
上記の挙動を取る理由/原因が分からず、
AnotherForm.Show vbModeless
を展開しても良いか、迷っています。何か、理由や原因が分かる方がいらっしゃいましたら、レスを頂ければと思います。
回答
-
私の環境であるWindows 7 Ultimate, Excel 2010でも再現しました。
少し検索してみましたが、
Private Sub CommandButton1_Click()
Me.Enabled = False
Me.Enabled = True
End Sub
のコードはExcel97までは期待通りに動いていたようです。とりあえず以下のように2回trueを実行するとうまく動くようです。私の環境でも動きましたが、完璧に対処療法ですね。
Private Sub CommandButton1_Click()
Me.Enabled = False
Me.Enabled = True
Me.Enabled = TrueEnd Sub
代替として、以下のようなコードはいかがでしょうか?
Private Sub CommandButton1_Click()
For Each Control In Me.Controls
Control.Enabled = False
NextFor Each Control In Me.Controls
Control.Enabled = True
Next
End Sub(参考)
userform Enabled property behavior changes between excel 97 and 2000/3
http://www.officekb.com/Uwe/Forum.aspx/excel-prog/99228/userform-Enabled-property-behavior-changes-between-excel-97Bug With UserForm.Enable Property
http://www.mrexcel.com/forum/showthread.php?t=186429userform.enable
http://www.ozgrid.com/forum/showthread.php?t=38356&page=1
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 山本春海 2011年6月29日 8:10
すべての返信
-
問題の原因がコードの書き方にあるのか、VBA のランタイムにあるのか、そのソフトウェアの実装にあるのか、わかりません。
もし、そのソフトウェアの実装上の問題である場合、VBA の一般的な問題とは言えず、このフォーラムで扱うには不適切となるかもしれません。(あくまで可能性です)まずは、再現できることが前提になりますが、たとえば、Excel VBA で再現可能なコードを示すことはできますか?
その環境で再現できるならばそれを元に議論することができます。逆に再現できないのであれば、第三者に回答は難しいかもしれません。(そのソフトウェアの入手難易度、そのソフトウェアでの再現性にもよりますが)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答の候補に設定 山本春海 2011年6月29日 8:10
-
Azuleanさん、
早速、返信いただき、ありがとうございます。
エクセルで同様のコードを実行してみた結果、再現しましたので、
そちらのコードを展開します。
ボタンを1つ配置したUserForm1を作成し、クリックイベントに以下の処理を記述
Private Sub CommandButton1_Click()
Me.Enabled = False
Me.Enabled = True
End Sub
モジュール内でUIを開く
Public Sub Main()
Dim uiFrm As UserForm1
Set uiFrm = New UserForm1
uiFrm.Show vbModeless
End Sub
Mainを実行してUIを起動後、ボタンを押すとUIが触れなくなってしまいます。
単純な勘違いの可能性もありますが、原因が分かれば、お教え頂ければと思います。
よろしくお願いします。
-
私の環境であるWindows 7 Ultimate, Excel 2010でも再現しました。
少し検索してみましたが、
Private Sub CommandButton1_Click()
Me.Enabled = False
Me.Enabled = True
End Sub
のコードはExcel97までは期待通りに動いていたようです。とりあえず以下のように2回trueを実行するとうまく動くようです。私の環境でも動きましたが、完璧に対処療法ですね。
Private Sub CommandButton1_Click()
Me.Enabled = False
Me.Enabled = True
Me.Enabled = TrueEnd Sub
代替として、以下のようなコードはいかがでしょうか?
Private Sub CommandButton1_Click()
For Each Control In Me.Controls
Control.Enabled = False
NextFor Each Control In Me.Controls
Control.Enabled = True
Next
End Sub(参考)
userform Enabled property behavior changes between excel 97 and 2000/3
http://www.officekb.com/Uwe/Forum.aspx/excel-prog/99228/userform-Enabled-property-behavior-changes-between-excel-97Bug With UserForm.Enable Property
http://www.mrexcel.com/forum/showthread.php?t=186429userform.enable
http://www.ozgrid.com/forum/showthread.php?t=38356&page=1
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 山本春海 2011年6月29日 8:10
-
こんにちは、shinobon724 さん。
MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
有効な情報をいただいているようでしたので、他の方にもこの情報を有効活用していただくよう、勝手ながら私のほうで回答としてマークさせていただきました。
情報をくださった皆さん、ありがとうございました。
解決に役立った情報や、参考になった情報には、回答としてマークすることをお願いしています。
今後、同じ問題でこのスレッドを参照される方にも、有効な情報がわかりやすくなるかと思いますので、ご協力よろしくお願いいたします。
今後とも、MSDN フォーラムをよろしくお願いいたします。
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海