開発環境
3台分ございます。
①期待通りの動作をするマシン その1
OS:Windows10 Home 64bit
Office(Excel):Home and Business 2019 64bit
②期待通りの動作をするマシン その2
OS:Windows10 Pro 64bit
Office(Excel):Home and Business 2016 64bit
③期待通りに動作しないマシン(改善したい対象)
OS:Windows10 Home 64bit
Office(Excel):Professional Plus 2016 32bit
前提・要件
お世話になります。初質問のため、至らぬ点がございましたら
申し訳ございませんがご教示ください。
ExcelVBAにて、とある機能のユーザーフォーム(例:test_main.xlsm)を開発しております。
ユーザーフォームはtest_main.xlsmを起動時に即表示するようになっております。
こちらのユーザーフォームは起動時の要件として、以下がございます。
要件
①test_main.xlsmのブックを表示できないようにすること(他ブックが開かれていない場合はエクセルのアプリケーション自体を表示しないこと)
②他ブックへの影響を与えないこと(例:application.visible=falseなどは他ブックも巻き込んでしまうためNG)
③test_main.xlsmの起動前後で開いているブックを全て閉じてもtest_main.xlsmのフォームが閉じられないこと(巻き込まれないこと)
ソースコード
上記の要件を満たすため、ソースコードを以下のように組みました。
「test.xlsm」と「test_main.xlsm」の2ファイルがございますが、「test.xlsm」から起動して「test_main.xlsm」を呼び出す構成です。
test.xlsm
'MicroSoft Excel Objects->ThisWorkbook Private Sub Workbook_Open() Const MAIN_MACRO_NAME As String = "test_main.xlsm" Dim exApp As Excel.Application 'ブックの非表示 Windows(ThisWorkbook.Name).Visible = False '別プロセスでフォーム用マクロを起動 Set exApp = CreateObject("Excel.Application") exApp.EnableEvents = True exApp.Workbooks.Open ThisWorkbook.Path & "\" & MAIN_MACRO_NAME exApp.Visible = False Set exApp = Nothing '開かれているブックがこの起動用マクロのみならExcelを終了する If Workbooks.Count = 1 Then Application.Quit End If 'この起動用マクロのブックを閉じる ThisWorkbook.Close End Sub
test_main.xlsm
'MicroSoft Excel Objects->ThisWorkbook Private Sub Workbook_Open() 'ブックの非表示 Windows(ThisWorkbook.Name).Visible = False 'ユーザーフォームの表示 UserForm1.Show vbModeless End Sub
'フォーム->UserForm1 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'プロセスが残らないようにする用の処理 If CloseMode = 0 Then If Workbooks.Count = 1 Then Application.Quit End If ThisWorkbook.Close End If End Sub
発生している問題
上記のマクロを実行した結果、開発環境①②では要件を全て満たせておりました。
しかし、開発環境③で実行すると要件③を満たせていないことが分かりました。
開発環境③の場合、ユーザーフォーム表示後に別のブック(適当なxlsxファイルなど)を開き、そのブックを閉じた場合にユーザーフォームも一緒に閉じられてしまいます。(複数ブックを開いている場合は最後のブックを閉じた場合に)
※ユーザーフォーム起動前に適当なブックを開く→ユーザーフォーム起動→最初に開いたブックを閉じる の場合はユーザーフォームは閉じられないため問題なし。
###考えられる原因
上記の実行結果を見比べた際に、以下のことが分かりました。
開発環境①②で実行した場合は、ユーザーフォーム用マクロと後に開いたブックは別プロセスとなっている。(期待通り)
開発環境③で実行した場合は、ユーザーフォーム用マクロと後に開いたブックは同じプロセスになってしまっている。
(Officeの64bitと32bitによる挙動の違い…?)
実現したいこと
開発環境③の場合でも要件③を満たすため、ユーザーフォームを起動後に別ブックを開いて閉じてもユーザーフォームはプロセスに残るようにしたいです。
よろしくお願いいたします。
試したこと
①test_main.xlsmの変数exAppの型をObject型に変更し、事前バインディングから実行時バインディングになるようにしてみた。
⇒変化なし。
②test.xlsm起動時にtest_main.xlsm用のExcelObjectを生成する前にあらかじめダミーのマクロでExcelObjectを生成する。
ダミーの内容はWorkbook_Openイベント内で「Windows(ThisWorkbook.Name).Visible = False」のみ。
⇒test_main.xlsmとは別プロセスになり、後から開いたブックもダミーのプロセスに吸収されることを確認した。(先に開いたExcelプロセスが優先される?)
しかし、後から開いたブックを全て閉じればダミーのプロセスが消滅し、次回からブックを開いた際はtest_main.xlsmのプロセスが吸収してしまう。
回答2件
あなたの回答
tips
プレビュー