質問: xlminimized workbooks.open "b.xls", readonly:=true" ←(1) workbooks("b.xls").activate application.run ("'アドイン.xla'!module_関数.admin") ←(2) end sub アドインのコード public sub admin() workbooks("a.xls").close savechanges:=false ←(3) userform1.show vbmodal ←問題部分 end sub
回答: ----------------------- 現在うまく行かない理由[a.xls].workbook_open 【 ・a.xlsを最小化 ・b.xlsを開く [アドイン.xla].admin 【 ・a.xlsを閉じる →→※※ [a.xls].workbook_openが終了 ・userformを表示 →→※※ 呼び出し元が終了しているので、ここまで辿り着かない 】 】 実現方法例[a.xls].workbook_open 【 ・a.xlsを最小化 ・b.xlsを開く ・アドインタイマー起動要求 [アドイン.xla].admin 【 ・a.xlsをアドイン内部で記憶 ・タイマーを開始 】 】 [アドイン.xla].タイマー 【 ・タイマーが複数回起動しないように切断 ・アドイン内部で記憶をしているa.xlsを閉じる ・userformを表示 】 ※~~~以下サンプル 開始~~~ '----------------- '-- a.xls '-- thisworkbook '----------------- option explicit private sub workbook_open() dim l_xlsdata as workbook activewindow.windowstate = xlminimized set l_xlsdata = workbooks.open("c:\b.xls", readonly:=true) l_xlsdata .activate call application.run("'アドイン.xla'!module_関数.admin", me) end sub '----------------- '-- アドイン.xla '-- module_関数 '----------------- option explicit private declare function settimer lib "user32" (byval hwnd as long, byval nidevent as long, byval uelapse as long, byval lptimerfunc as long) as long private declare function killtimer lib "user32" (byval hwnd as long, byval nidevent as long) as long private m_xlsbook as workbook private m_lngtimerid as long public sub admin(p_xlsbook as workbook) set m_xlsbook = p_xlsbook m_lngtimerid = settimer(0&, 31000&, 0&, addressof timerproc) end sub public sub timerproc() 'タイマーが複数回起動しないように切断 killtimer 0&, m_lngtimerid 'アドイン内部で記憶をしているa.xlsを閉じる call m_xlsbook.close(false) 'userformを表示 userform1.show vbmodal end sub ※~~~以上サンプル 終了~~~ 補足aの処理を ・b.xlsを開く ・アドインタイマー起動要求を発行(パラメータはb.xls) ・a.xlsを閉じる というような流れにした方が、機能を簡潔に出来るかもしれませんね。