[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『2つのユーザーフォーム』(あきお)
独学でネットなどの情報でvbaを学んで、仕事に使っています。
2つのユーザーフォームがあり
?@FormA・・・初期画面
?AFormB・・・入力用フォーム
としています。
用途としては、?@でプルダウン上の選択肢とコマンドボタンがあり
プルダウンで選択した状態でコマンドボタンを押すと?Aフォームへ飛ぶ(本来はあといくつかのフォームがあり、それぞれに応じたフォームを表示します)
入力用フォームには
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
FormB.Hide FormA.Show
End Sub
と記載しており、1度目は正常にFormAに戻ってくれます。
この状態で、FormBを表示するとFormBは表示できるのですが戻れなくなります。
マクロの編集画面でF8で閉じるところの検証をしても、まず動いていないので検証のしようがありません。
原因がわからず困っています。
なにかアドバイスがあれば教えていただけませんでしょうか。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
>マクロの編集画面でF8で閉じるところの検証をしても、 >まず動いていないので検証のしようがありません。
ちょっとよく分からないです。
コードのどの部分まで動いていたのですか?
(半平太) 2019/04/17(水) 17:18
動かなくなるのは、Querycloseのマクロです。
F8でステップインしようとしてもそもそもマクロが開始されません。
2回目のフォームは正常に表示でき、他の入力機能なども働いています。
1度目の表示であれば、FormBのQueryCloseも正常に働いていて、FormAに戻れます。
(あきお) 2019/04/17(水) 17:32
>F8でステップインしようとしてもそもそもマクロが開始されません。
なるほどです。
そういうときは、要所々々に「STOP」を入れて置くか、「ブレークポイント」を設定して、 プログラムの動きを確認して行くものですけども・・
(半平太) 2019/04/17(水) 17:38
F8で実行しているのは、FormAの表示のところから実行しています。
QueryCloseイベントも1度目は正常にステップインでイベント開始されます。
2度めはそもそもイベント自体、開始されないのです。
念の為ですが、
FormB.Hide FormA.Show の間にそれぞれ、MSGBOX "TEST" をいれてストップして確認しています。 (あきお) 2019/04/17(水) 17:59
【ブレークポイント】
https://www.tipsfound.com/vba/01010
https://www.239-programing.com/excel-vba/basic/basic022.html
【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
(もこな2) 2019/04/17(水) 19:13
>?AFormB・・・入力用フォーム
>入力用フォームには >Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) > FormB.Hide > FormA.Show >End Sub
↑2つは同じもの? 同じものだとすると、閉じちゃって(unload)いるから、hideもくそもないと思うけど。 (BJ) 2019/04/18(木) 02:46
なかなか寝付かれないので、PCだけ起動して書き込み(文字がよく見えない) なんとなく解りました。 帰るための1本の命綱が途中で切れちゃうって事ですね。 手動での閉じるボタンを見分ける方法があったと思うので、その時はキャンセル、ツゥル―してハイドとか・・・。 ま、あんまりフォーム同士で、開いたり閉じたりしない方がいいんじゃないかと・・・? 今度こそ気合い入れて寝ます。 (BJ) 2019/04/18(木) 04:15
FormA はモーダルで表示していますので閉じるまでは QueryClose の実行中です。 FormA.Show のあとにも確認用を入れて FormA を閉じた後実行されているか確認
(cai) 2019/04/18(木) 06:18
UserFormの呼び出しの親子関係をきちんと整理しましょう。
子供のUserFormBから親のUserFormAをShowしちゃだめです。
親になるUserFormAから、 => 子UserFormBをModalでShowする。 => 孫UserFormAをModalでShowする。 => ひ孫UserFormAをModalでShowする。 => 以下、連続して子孫が続々
となってしまっています。 並列で交互に表示すると考えてはいけません。
親になるUserFormAから、 => 子UserFormBをModalでShowする。 <= 子UserFormBを閉じる 親UserFormAに実行が戻る
のようにしないといけません。
親のUserFormAから UserFormBを呼び出すときに、
Private Sub CommandButton1_Click() Me.Hide '自分を隠す UserFormB.Show ' 子UserFormBをModalで表示 Me.Show ' 子UserFormBが閉じられたら、自分を表示 End Sub
とします。
子供のUserFormBは Me.Hide するか Unload Me だけすればいいです。 (でれすけ) 2019/04/18(木) 06:19
退勤してファイルの動作確認がとれず、今までかかりました。
最終的に、でれすけ様にご回答いただいた方法で解決致しました。
> 親になるUserFormAから、
=> 子UserFormBをModalでShowする。
<= 子UserFormBを閉じる
親UserFormAに実行が戻る
ここで腑に落ちました。
お知恵をお貸しいただきました皆様ありがとうございます。
また何かありましたらよろしくお願いいたします。
(あきお) 2019/04/18(木) 09:59
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.