Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5753 / 13645 ツリー ←次へ | 前へ→

【49011】複数のユーザーフォーム使用時のエラー びぎなぁ 07/5/21(月) 1:17 質問[未読]
【49013】Re:複数のユーザーフォーム使用時のエラー ponpon 07/5/21(月) 2:06 発言[未読]
【49015】Re:複数のユーザーフォーム使用時のエラー ichinose 07/5/21(月) 7:42 発言[未読]
【49027】Re:複数のユーザーフォーム使用時のエラー ponpon 07/5/21(月) 13:23 発言[未読]
【49034】Re:複数のユーザーフォーム使用時のエラー Jaka 07/5/21(月) 14:49 発言[未読]
【49064】Re:複数のユーザーフォーム使用時のエラー びぎなぁ 07/5/22(火) 10:41 お礼[未読]
【49093】Re:複数のユーザーフォーム使用時のエラー ichinose 07/5/22(火) 20:43 発言[未読]

【49011】複数のユーザーフォーム使用時のエラー
質問  びぎなぁ  - 07/5/21(月) 1:17 -

引用なし
パスワード
   皆様にご教授いただきたく投稿します。

ユーザーフォーム1から2へ移動しました。

Private Sub CommandButton2_Click()
    UserForm2.Show
    Unload UserForm1
   
End Sub

ユーザーフォーム2から1へ移動を試みると、

実行時エラー'400':
フォームは既に表示されているので、モーダル表示することはできません。

というエラーが...。

当方、まったくの初心者でして、いろいろ検索してみたのですが理解できなくて途方に暮れています。

私としては新たなユーザーフォームを開いたら、その時点でそれまで開いていたものが閉じてくれればいいのですが前述の方法ではダメなようで。
(それとも、そもそもこんな方法がいけないことなのかもしれませんが...)

簡単なコードの追加等で、私の望む動きになるような手段について何かお知恵を拝借できればと思い投稿した次第です。

よろしくお願いいたします。

【49013】Re:複数のユーザーフォーム使用時のエラー
発言  ponpon  - 07/5/21(月) 2:06 -

引用なし
パスワード
   ▼びぎなぁ さん:
>皆様にご教授いただきたく投稿します。
>
>ユーザーフォーム1から2へ移動しました。
>
>Private Sub CommandButton2_Click()
>    UserForm2.Show
>    Unload UserForm1
>   
>End Sub


このコードはどこに書いていますか?
UserForm1のモジュールに書いているなら問題ないと思いますが・・・

>
>ユーザーフォーム2から1へ移動を試みると、

これは、どんなコードをどこに書いていますか?
上の逆ですからUserForm2のモジュールに・・・
見えなくするだけでよいのなら、Hideもありますが・・


>実行時エラー'400':
>フォームは既に表示されているので、モーダル表示することはできません。
>
>というエラーが...。
>
>当方、まったくの初心者でして、いろいろ検索してみたのですが理解できなくて途方に暮れています。
>
>私としては新たなユーザーフォームを開いたら、その時点でそれまで開いていたものが閉じてくれればいいのですが前述の方法ではダメなようで。
>(それとも、そもそもこんな方法がいけないことなのかもしれませんが...)
>
>簡単なコードの追加等で、私の望む動きになるような手段について何かお知恵を拝借できればと思い投稿した次第です。
>
>よろしくお願いいたします。

【49015】Re:複数のユーザーフォーム使用時のエラー
発言  ichinose  - 07/5/21(月) 7:42 -

引用なし
パスワード
   おはようございます。

>ユーザーフォーム1から2へ移動しました。
>
>Private Sub CommandButton2_Click()
    unload me 
>    UserForm2.Show

>   
>End Sub
>
ユーザーフォーム2では、逆に

Private Sub CommandButton2_Click()
    unload me 
     UserForm1.Show
>End Sub

とすれば、一見すると正常に作動しているように見えますし、

表示・非表示の切り替えが数える程度の話なら、
これでも良いですが・・・。


このままだと長く表示・非表示を繰り返すと、スタックオーバーフローになります。
(又は、動作が途中で止まったりしますExcel2002で確認)

本格的にやるとなると、結構面倒なんですよ!!
興味深い話だと思いますが。

【49027】Re:複数のユーザーフォーム使用時のエラー
発言  ponpon  - 07/5/21(月) 13:23 -

引用なし
パスワード
   へー
そうなんだ、平気で使ってました。

【49034】Re:複数のユーザーフォーム使用時のエラー
発言  Jaka  - 07/5/21(月) 14:49 -

引用なし
パスワード
   フォーム上でロード、アンロードを繰り返して、帰る場所を見失いそうな気がするので、
こんな感じにしてみたけれど....。

標準モジュール
Public FLG As Integer

Sub mmdmmd()
UserForm1.Show
Do
 If FLG = 1 Then
   UserForm2.Show
 ElseIf FLG = 2 Then
   UserForm1.Show
 End If
Loop Until FLG = 0
End Sub

フォーム1
Private Sub CommandButton1_Click()
FLG = 1
Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> vbFormCode Then
  FLG = 0
End If
End Sub

フォーム2
Private Sub CommandButton1_Click()
FLG = 2
Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> vbFormCode Then
  FLG = 0
End If
End Sub

【49064】Re:複数のユーザーフォーム使用時のエラー
お礼  びぎなぁ  - 07/5/22(火) 10:41 -

引用なし
パスワード
   回答くださった皆様、お礼が遅れて申し訳ありません。

今回はichinose様からご教授された方法で動作確認しました。今回はとりあえずこの方法で対応させていただこうと思っています。
(今回お伺いしたユーザーフォームの移動?は多くても片手くらいしか実行されないので問題ないと勝手に判断させていただきました)

ただ、今後のことを考えるとJaka様の教えてくださったコードの利用も検討しなくてはいけないと言うことですね。
(「帰る場所を見失う...」というのが今回のエラー対策とどのような関係があるのか再度勉強しなくてはいけないと思うのですが、その件について何か参考になるURL等ありましたらアップくだされば幸いです)

皆様ありがとうございました。

【49093】Re:複数のユーザーフォーム使用時のエラー
発言  ichinose  - 07/5/22(火) 20:43 -

引用なし
パスワード
   ▼びぎなぁ さん:
こんばんは。

>
>今回はichinose様からご教授された方法で動作確認しました。今回はとりあえずこの方法で対応させていただこうと思っています。
あらら、駄目な例として上げたんですけどねえ!!

>(今回お伺いしたユーザーフォームの移動?は多くても片手くらいしか実行されないので問題ないと勝手に判断させていただきました)
片手ぐらいだとおおよそは大丈夫なんですが、ならば、
Unload Me の箇所をせめて me.hideにしておいてください。

>
>ただ、今後のことを考えるとJaka様の教えてくださったコードの利用も検討しなくてはいけないと言うことですね。

Jakaさんおコードをざっとみさせてもらいましたが、
たぶん、大丈夫でしょう・・。私も似たようなコードを想像していました。


>(「帰る場所を見失う...」というのが今回のエラー対策とどのような関係があるのか再度勉強しなくてはいけないと思うのですが、その件について何か参考になるURL等ありましたらアップくだされば幸いです)

これね、良くない理由は、
新規ブックの標準モジュールに
'=======================================================
Option Explicit
Sub a()
  Call b
End Sub
Sub b()
  Call a
End Sub

でaでもbでもよいですが、実行すると即
「スタック領域が不足しています」というエラーが発生します。

Userform1とUserform2の
Show(モーダルモード)メソッドを交互に実行するというのは、
上記のコードと同じです(Unloadの実行では、このスタック領域と呼ばれる
メモリー領域を減らすことの歯止めにはなりません)。

と説明しかけましたが、この質問箱にもよく回答されている
inoueさんのサイトでわかりやすい説明がありましたので参考にしてください

www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_100_060.html

5753 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free