Excel (VBA)

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

 
(指定なし : 指定なし)
フォームが閉じてしまう
投稿日時: 23/08/28 20:33:34
投稿者: FAB

教えてください。
 
test1.xlsmを起動。
 
Private Sub Workbook_Open()
 
    UserForm1.Show vbModeless
 
End Sub
 
Private Sub CommandButton1_Click()
 
 Unload UserForm1
 
    Application.Run "'C:\test2.xlsm'!test2"
     
End Sub
 
 
Sub test2()
 
    msgbox "○"
 
    Application.Run "'C:\test1.xlsm'!test1"
 
End Sub
 
 
Sub test1()
 
    UserForm1.Show vbModeless
     
    Workbooks("test2.xlsm").Save
    Workbooks("test2.xlsm").Close
 
End Sub
 
test2.xlsmを閉じるとフォームも閉じてしまいます。
よろしくお願い致します。

回答
投稿日時: 23/08/29 10:30:08
投稿者: Suzu

表示されているフォームは
 
test2 から、
 Application.Run "'C:\test1.xlsm'!test1"
 
で呼び出され、test1 内で 表示されたもの。
呼び出し元が閉じられたので、フォームも閉じました。
 
 
 
例えば
 
test1.xlsm
 
Sub test1()
  UserForm1.Show vbModeless
End Sub
 
 
test2.xlsm
 
Sub test2()
  MsgBox "○"
  Application.Run "'C:\DATA\Computer\Excel\TEST\test1.xlsm'!test1"
  ThisWorkbook.Close
End Sub
 
で、test2 内で ブックを閉じても、UserForm1 は閉じてしまいます。

回答
投稿日時: 23/08/29 12:13:14
投稿者: simple

# 既に適切な回答をいただいていますが、もう少し前の段階から書いてみました。
 
ユーザーフォームは、FM20.DLL というファイルで提供されるツール、ライブラリーです。
DLL(ダイナミックリンクライブラリ)と呼ばれるもので、
これは、例えばWordのような単独のアプリケーションと異なり、部品に過ぎません。
これを利用していた"親"(*)が閉じられれば、自然とそのツールも役目を終え、機能を終了します。
 
一方、例えば、Wordのような単独のアプリケーションの場合、

Sub test()
    Dim wd As Object
    Set wd = CreateObject("Word.Application")
    wd.Visible = True
    ThisWorkbook.Close
End Sub
のように作成したあとに、自分を閉じたとしても、
Wordは単独のアプリケーションなので、それを閉じる命令を実行しない限りまだ生きています。
これと対照的です。
 
つまり、ユーザーフォームというものは独立したアプリケーションではないので、
その事象はある意味で当然のことです。
納得しにくいかもしれませんが、これはそういうものだと思って、前に進んでください。
 
 
やりたいことは、ユーザーフォームだけを表示したいといったことですか?
それなら、「ユーザー表示だけ表示させたい」とかでネット検索すればよいでしょう。
ブックをむやみに閉じずに、Excelを非表示にすればよいのです。トライしてみて下さい。
それと、同時にUserForm_QueryCloseイベントプロシージャで、
    Application.Visible = True
として、復旧することをお忘れなく。
 
(*)何を以て親とするのかの正確な知識は私は持ち合わせていません。
   製品仕様なので、事実として受け容れるしかないと思っています。

投稿日時: 23/08/29 12:31:39
投稿者: FAB

Suzuさん、simpleさん、解答ありがとうございました。
また分からないことがありましたら、よろしくお願いします。
ありがとうございました!