[[20190417160657]] 『2つのユーザーフォーム』(あきお) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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

>MSGBOX "TEST" をいれてストップ
ちょっと気になったので、私も念のため。

【ブレークポイント】
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


下記を参考にしてください。
>Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
http://officetanaka.net/excel/vba/tips/tips18.htm
>2つのユーザーフォーム
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_100_060.html
(のりん) 2019/04/17(水) 20:39

 >?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

みなさま、コメントありがとうございます。
ご紹介頂いたURLも読みました。

退勤してファイルの動作確認がとれず、今までかかりました。

最終的に、でれすけ様にご回答いただいた方法で解決致しました。
> 親になる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.