Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2013)
モードレスでのExcel画面の非表示方法
投稿日時: 18/01/31 18:30:13
投稿者: Arika.D

ExcelVBAで「モーダル」でユーザーフォームを使用のときは「Application. Visible = False」でExcelのウインドウを非表示できていたのですが、「モードレス」で使用しようとした場合、非表示になりません。
ユーザーフォームと一緒にExcelシート、データ用Excelシート等が表示されてしまいます。
モードレスでユーザーフォーム以外を非表示にする方法はありませんか?
ご教授願います。

回答
投稿日時: 18/01/31 19:18:21
投稿者: simple

再現するコードを提示してください。

回答
投稿日時: 18/02/01 06:51:19
投稿者: mokutachi

モードレスの必要性も知りたいです。
Excel画面が見えないなら必要なさそうにおもえますが。

投稿日時: 18/02/01 12:02:47
投稿者: Arika.D

複数のユーザーフォームを並行で使用するためです。
これもモードレスで無いと1つのユーザーファームしか操作できません。
 
 

mokutachi さんの引用:
モードレスの必要性も知りたいです。
Excel画面が見えないなら必要なさそうにおもえますが。

投稿日時: 18/02/01 12:07:03
投稿者: Arika.D

再現はそのままで、
Application. Visible = False
UserForm●
Application. Visible = True
 
で、確認できます。
 
 
 

simple さんの引用:
再現するコードを提示してください。

回答
投稿日時: 18/02/01 13:05:25
投稿者: hatena
投稿者のウェブサイトに移動

Arika.D さんの引用:
再現はそのままで、
Application. Visible = False
UserForm●
Application. Visible = True

 
Application. Visible = True を削除したらどうですか。

投稿日時: 18/02/01 15:20:16
投稿者: Arika.D

終了の前には表示できるように戻してから終了しますので削除はできません。
下記のUserForm●を実行中に表示されないようにしたいのです。
説明不足でしたね。
 
 
 

hatena さんの引用:
Arika.D さんの引用:
再現はそのままで、
Application. Visible = False
UserForm●
Application. Visible = True

 
Application. Visible = True を削除したらどうですか。

回答
投稿日時: 18/02/01 15:52:28
投稿者: eden

モーダルの場合はユーザーフォームを閉じるまで次の命令は実行されませんが、
モードレスの場合は閉じなくてもすぐに実行されます。
Application. Visible = True を適切なところに移動してください。

回答
投稿日時: 18/02/01 15:54:01
投稿者: mokutachi

ダイアログ(モーダル)のUserFormであれば
Showメソッドの後に記述したコードは
Userformを閉じた後に実行されますが。
 
モードレスのUserformではShowメソッドの後に記述したコードは
Show実行後にそのまま実行されてしまいます。
 

Arika.D さんの引用:
終了の前には表示できるように戻してから終了しますので

ですから
Visible = True
は別のところでやればいいんじゃないかと。
何かのイベントとか?

回答
投稿日時: 18/02/01 16:03:57
投稿者: もこな2

コード提示についてsimpleさんが指摘されてるけど、頑なにコード提示拒んでいらっしゃるようなのでよくわかりませんが・・・・

Arika.D さんの引用:
終了の前には表示できるように戻してから終了しますので削除はできません。
下記のUserForm●を実行中に表示されないようにしたいのです。
説明不足でしたね。

<標準モジュール>
Sub ユーザーフォーム表示()
    UserFormA.Show vbModeless
    UserFormB.Show vbModeless
    UserFormC.Show vbModeless
    Application.Visible = False
End Sub

<UserFormAのモジュール>
Private Sub 終了ボタン_Click()
    Application.Visible = True
    Unload UserFormC
    Unload UserFormB
    Unload Me
End Sub

こんな感じにしてもダメだったってことでしょうか?
外していたらごめんなさい。

回答
投稿日時: 18/02/01 17:02:59
投稿者: mattuwan44

Sub test1()
    Application.Visible = False
    UserForm1.Show vbModal
End Sub

Sub test2()
    Application.Visible = False
    UserForm1.Show vbModeless
End Sub

 
どっちでもエクセルが非表示になりますが、
モーダルかモードレスかどっちでしたいかわかんない^^;
 
上手く行かないコードを提示してくれないと、
こちらで再現が出来ないので原因究明は難しいかと。

回答
投稿日時: 18/02/01 17:04:33
投稿者: mattuwan44

もしかして、
VBEの画面とかエクセル以外のウィンドウも全部という話だろうか。。。?

回答
投稿日時: 18/02/01 17:07:36
投稿者: hatena
投稿者のウェブサイトに移動

UserFormA がメニューフォーム的なもので、そこから、UserFormB UserFormC が呼び出されるとして、
×ボタン や Alt+F4 で閉じられることも考慮するなら、
Terminateイベントで Application.Visible = True でするのが安全ですね。
動作的にもモーダルとほぼ同じになると思います。
 
<UserFormAのモジュール>

Private Sub 終了ボタン_Click()
    Unload Me
End Sub

Private Sub UserForm_Terminate()
    Unload UserFormC
    Unload UserFormB
    Application.Visible = True
End Sub

投稿日時: 18/02/01 17:41:47
投稿者: Arika.D

ありがとうございます。
「閉じなくてもすぐに実行される」ですね。
モードレスの理解ができていませんでした。
解決です!
 
 

eden さんの引用:
モーダルの場合はユーザーフォームを閉じるまで次の命令は実行されませんが、
モードレスの場合は閉じなくてもすぐに実行されます。
Application. Visible = True を適切なところに移動してください。

投稿日時: 18/02/01 17:43:16
投稿者: Arika.D

ありがとうございます。
皆様の回答でモードレスがやっと理解できました。
解決です。
 
 
 

mokutachi さんの引用:
ダイアログ(モーダル)のUserFormであれば
Showメソッドの後に記述したコードは
Userformを閉じた後に実行されますが。
 
モードレスのUserformではShowメソッドの後に記述したコードは
Show実行後にそのまま実行されてしまいます。
 
Arika.D さんの引用:
終了の前には表示できるように戻してから終了しますので

ですから
Visible = True
は別のところでやればいいんじゃないかと。
何かのイベントとか?

投稿日時: 18/02/01 17:44:18
投稿者: Arika.D

ありがとうございます。
皆様の回答でモードレスがやっと理解できました。
解決です。
 
 

もこな2 さんの引用:
コード提示についてsimpleさんが指摘されてるけど、頑なにコード提示拒んでいらっしゃるようなのでよくわかりませんが・・・・
Arika.D さんの引用:
終了の前には表示できるように戻してから終了しますので削除はできません。
下記のUserForm●を実行中に表示されないようにしたいのです。
説明不足でしたね。

<標準モジュール>
Sub ユーザーフォーム表示()
    UserFormA.Show vbModeless
    UserFormB.Show vbModeless
    UserFormC.Show vbModeless
    Application.Visible = False
End Sub

<UserFormAのモジュール>
Private Sub 終了ボタン_Click()
    Application.Visible = True
    Unload UserFormC
    Unload UserFormB
    Unload Me
End Sub

こんな感じにしてもダメだったってことでしょうか?
外していたらごめんなさい。