『EXCEL終了時にVBAマクロを実行したい』(たひら)  "EXCEL起動時に実行したいVBAマクロは次のフォルダに入れて置けば良いが、EXCEL終了時に実行したい場合はどうすれば。 [EXCEL起動時に実行するマクロの格納フォルダ:WindowsVistano場合]  C:\User\ユーザID\AppData\Roaming\Microsoft\Excel\ELSTART [EXCEL終了時に実行するマクロの格納フォルダ:WindowsVistano場合]  ??? ---- Vistaは捨てたので確認できないけど、ELSTART だった? XLSTART じゃなく? それはそれとして、開始時に実行するマクロは、そのフォルダに入れたマクロブックのWorkbook_Openに記述してあるか そこからCall してるんだろうね。 同じく、その Workbook_BeforClose に書いたらどうかな? (ぶらっと) ---- ぷらっとさんへ (たひら)  ご指摘の通りELSTARTではなくXLSTARTでした。  ところでWorkBook_OpenにはそのWorkBook(=EXCELファイル)がOPENされる時に実行するプログラムを記述し、 Woekbook_BeforeCLOseにはWorkBookがCLOSEされる時に実行するプログラムを記述します。  私がしたいのは、WorkbookのOPEN/CLOSE時ではなく、EXCEL本体(EXCEL.EXE)のCLOSE時にある処理をするマクロを自動的に実行させたいのです。Workbook_Openにマクロを記述してXLSTARTフォルダに入れて置けばEXCEL本体を立ち上げた時に自動的に実行されが、EXCEL本体がCLOSEする時に実行させる方法が判らない。  具体的には、アドイン登録し有効状態のユーザ定義関数はEXCEL立ち上げ時に自動的にOPENされる。登録しているユーザ定義関数が二十数個と多く、これらユーザ定義関数を使用しない通常の処理でEXCEL立ち上げる時も毎回自動的にOPEN処理されるので非常に煩わしい。そこで通常はこれらユーザ定義関数は無効状態しておき、使用時に有効状態にするのだが、処理終了時に無効化するのを忘れ勝ちである。そのため、EXCEL本体の終了時に自動的に有効状態のユーザ定義関数を無効状態にするマクロを自動的に実行するようにしたい。 ---- アドインをアンインストールする専用アドインを用意する という方法は? ichinose@今から、蓼科高原を散策 ---- う〜ん・・・ イメージがいまいち理解できない。 なにが理解できないかというと、最初の文面から、現在は XLSTARTフォルダに、あるマクロブックが 保存されていて、それらはExcel稼働時に、自動的にExcelに呼び込まれるわけで そのオープンルーティンで「必ず何かの処理」をしている。同様にExcelが終了するタイミングでも 「必ず別の何か」をしたいということだったので、今、XLSATRTにいれてある、そのマクロブックの クローズルーティンで処理したらいいのではと回答したんだけど・・・ 2番目のレスを読むと、「あるユーザー関数を利用する特定のExcelブックを開くときだけ」 読込済みのユーザー定義関数を記述したブック(アドインかどうかは重要じゃない)を有効にしたい。 だからExcelを終了する時にそれらを「いったん」削除しておきたい?。 現在の構えがXLSTARTにいれてあるブックで無条件にやっているとすれば、かりにそのExcelを終了させる時点で、削除しても 次のExcel立ち上げでは「泣いても笑っても」有効になっちゃうよ。 これをやるなら、XLSTARTにいれて自動的に実行している今の形をやめ ・そのユーザー定義関数を使いたいExcelブックを開くときのみ、そのExcelブックの  オープンルーティンでユーザー定義関数を記述したブックをアドイン。 ・そのExcelブックを閉じるときに、アドインを削除。 このような構えにしないと無理なんじゃない? で、該当の各ブックでそのコードを、いちいち記述するのは大変だということなら アドインを登録する機能とアドインを削除する機能をもった「アドイン」を登録しておいて (あるいは、これをXLSTARTにいれておいてもいいけど)該当のブックでは、それを利用しては? このように思うし、ichinioseさんのアドバイスも同じかな・・・? ★ このページの左上に「初めての人へ」というリンクがあるので、そこを参照して、書き込み時の「整形ルール」に目をとおしておいてね。 (ぶらっと) ---- ある業務で使用するユーザ定義関数をアドイン形式にして、多数のユーザに提供しようとしています。 これらのユーザ定義関数は、EXCEL標準組み込みのAverageやSum等の関数と同じようにで使用できるように、 アドイン形式(拡張子".xla")にし、"・・・\Microsoft\AddIns"フォルダにコピーしアドイン登録します。 (ichinose)さんのアドバイスの「アドインをアンインストールする専用アドインを用意する」案は既に考慮 済みです。提供予定のユーザ定義関数以外に提供関連ツールとして下記を用意しています。 (1) インストールとアンインストールのマクロ (2) 各関数を有効化と無効化するマクロ (3) 各関数の登録状況や有効/無効状況の表示マクロ (4) 各関数のヘルプ 利用者は関数使用前に有効化マクロを実行して関数を使用します。関数使用後に無効化マクロを実行してから EXCEL本体を閉じれば、何ら問題ありません。しかし、利用者は業務終了後に常に無効化マクロを実行するとは 限らないので、EXCEL終了時に自動的に無効化するようにしたいと思った次第です。 前回の(ぶらっと)さんのアドバイスより、ユーザ定義関数の"Workbook_BeforClose"へ無効化する処理を書き 込んでみました。 この状態でEXCELを閉じると、確かに"Workbook_BeforClose"へ制御が渡り無効化処理が実行されました。 しかし、ユーザ定義関数が2個以上になると、EXCEL自体がエラ−になり下記の[最初のメッセージ]を表示し、 暫くすると一端CLOSE後に自動的に再度EXCELが立ち上がります。そこで再びアドイン関数を有効にしてEXCELを 閉じると初めは[最初のメッセージ]を表示しているが、暫くするとEXCELのCLOSE後に下記の[最終メッセージ]と なります。 これは、EXCEL本体のCLOSE処理とアドイン関数の無効化処理(この処理中にアドインがCLOSEされる)が競合 しているためと思われる。このようにEXCELがエラーとなるのでは、ユーザへ提供はできません。 [最初のメッセージ] Microsoft Office EXCELは動作を停止しました この問題を解決策を確認しています [最終メッセージ] Microsoft Office EXCELは動作を停止しました 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ。解決策がある場合は Windowsから通知されます。 (たひら) ---- こんにちは。 「秘密のコードのどこがマズイか教えなさい」と言われても無理なはなしです。 現象を再現できる最小限のコードを提示して下さい。 −佳−  ---- >アドバイスの「アドインをアンインストールする専用アドインを用意する」案は既に考慮 済みです。 私が申し上げたかったのは、関連ツールというより、 アドイン全体の汎用的なアンインストールする機能を持つアドインファイルです。 アンインストール専用アドイン内のWorkbook_BeforCloseイベント内にて アンインストールすべきアドインファイルを全てアンインストールする という仕様にするのです。 つまり、アンインストール専用アドインは、常駐するような仕様です。 ですから、たぶん、運用方法が違うと思います。 それから、エラーに関してですが、エラー再現手順をここに投稿できるようなコードで 再現してみてください。 ichinose ---- そのユーザー定義関数を使用するエクセルブックが、同一エクセルに複数呼び込まれていて その中の1つを閉じた段階で、関連アドインを削除してしまうと、残っているブックで様々な不都合が生じるのは自明の理。 佳さんからコメントあるように、実際のコードも含めて、具体的な情報がわからないと「一般論」としてのコメントしかできない。 一般論で言うなら、専用アドインにカウンターを設けておいて利用側ブックからリクエストがあったときに値をアップ。 カウンターが1なら組み込み実行。 利用ブックのクローズルーティンでリリース要求。-->カウンター値をダウン--> カウンター値が 0 ならアドインを削除。 でも、エクセルにアドインを使用すべきブックと使用しないブックが読み込まれていたとして、その両方で有効になるけど。 今もそのようになっているはずで、それでも不都合ではないということなんだろうね。 いずれにしても、検討するうえで必要な要件を具体的に、網羅してもらえないと、いやいや、実は。。。 この繰り返しでは、解決は遠いよ。 (ぶらっと)