[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Auto_Openで開いたファイルを実行後閉じる』(あや)
2003 XP
Moduleに Sub Auto_Open() を使っています。
エクセルファイルをダブルクリックしたら マクロが実行され、 エクセルファイルは閉じるというようにしようと思っています。
記述の最後に Application.DisplayAlerts = False Workbooks.Close Application.DisplayAlerts = True を書き込んでいます。
これだと Bookは閉じるのですが、 エクセルの枠が残ってしまいます。 (普段ファイルが表示されている場所はグレーになってるのですが) ( ファイル(F)編集(E)などのバーが残る形 )
希望としては、exeのような実行ファイルにしたいなと思っています。 "エクセルが起動して閉じた"というのが一瞬見えてもOKです。
ただ、実行前に他のエクセルファイルを開いて使っていた場合など、 それは一緒に閉じてもらうと困ります。
良い方法がありましたら、教えてください。
本テーマと Auto_Open は何か関連があるのかな? そのAuto_Open で何をしているのかな?
追記) ↑ 説明をよく読んでいなかった。マクロ実行をさせているんだね。
ともあれ、同じエクセル区画に【自分に関係のあるブック】(自分自身や、自分が読み込んだブック) しかないのか、そのほかのブックもあるのかによって、前者であれば Application.Quit 。 後者であれば、自分自身が読み込み、まだ閉じていないブックを閉じたうえで ThisWorkbook.Close。
自分自身が何を読み込んだか、それらはその後閉じられているのか、閉じられていないのか こういったロジックは、別途、作りこまなきゃいけないね。
★もしかしたら、マクロでほかのブックを読み込んでいないのかな?
追記) VBS起動にしたらいいと思う。これからすこし手が離せなくなるので コード案アップは少し遅くなるけど、その前にほかの回答者さんから回答があればいいね。
(ぶらっと)
いそぎ書いたのでアップ。(いそいだので間違いあったらご容赦)
1.メモ帳に以下を貼り付けて 任意の名前.vbs という名前で、実行しようとするマクロブックと同じフォルダに保存。 (実行するマクロブック名は正しいものになおしてね)
Option Explicit Dim objXLApp Dim objXLBook Dim VbsPath Dim VbsFull Dim x VbsFull = WScript.ScriptFullName x = InStrRev(VbsFull, "\") VbsPath = Left(VbsFull, x) Set objXLApp = CreateObject("Excel.Application") Set objXLBook = objXLApp.Workbooks.Open(VbsPath & "マクロブック.xls")
2.マクロブック側、Auto_Open をやめて ThisWorkbookモジュールに以下。 サンプルとして MSGBOX 表示しているけど、ここに実際のロジックを書き、Application.Quit で おわらせる。
Private Sub Workbook_Open() MsgBox "Hello" '★この場所に実行コードを Application.Quit End Sub
実行は、作成した なんとか.vbs をエクスプローラ上でダブルクリック。
(ぶらっと)
類似のスレッドがありました。
ichinose
私がアップした方式について、ちょっと補足。
【exeのような実行ファイル】のかわりが vbs なんだけど、この vbs は、かりに起動時に エクセルが立ち上がっていても、それとは別のエクセルを立ち上げ、そこで、このマクロブックのみを開く。 別に立ち上げたエクセルは、非表示になっているのでマクロブックもエクセルそのものも見えない。 で、実行後、 Application.Quit でマクロブックも閉じられ、立ちあげたこのエクセルも終了する。
ただし、実行中にエラーなどで終了させると、この Application.Quit が実行されない。 どうなるかというと、【見えないエクセル幽霊】がPC上で漂う。
このような場合、
・PCをシャットダウンすれば、もちろん幽霊も消える。 ・エクスプローラでマクロブックをダブルクリックすると見えずに漂っていたエクセルブックが表示されるので それを閉じる。 ・PC上で動いているエクセルを終了させた状態で、タスクマネージャのプロセスタブをみると、ないはずのエクセルが EXCEL.EXE としてそこに存在。 これを右クリックして【プロセスツリーの終了】を選択。
このいずれかで【幽霊退治】ができる。 (幽霊退治をマクロでやることもできるけど、とりあえずは、上記のような手法で)
(ぶらっと)
ichinoseさんが紹介されたスレッドの記載について、ちょっと補足というか、蛇足。
Workbooks.Count で、このエクセル区画に存在するブック数がわかる。 で、一般には これが 1 なら、自分だけ、2以上ならほかのブックも存在する。
紹介先に書かれていたように、PERSONAL.XLS が存在する場合、あるいは XLSTARTフォルダにほかのブックが 存在している場合、自分自身を開くと自動的にそれらも開かれる。 また(実際にはないだろうけど)xlsブック(あるいはxlsmブック)を自分自身に【参照設定】してある場合も それが自動的に読み込まれている。
なので Workbooks.Count での判定もしにくいし、実は紹介先でかかれていた For Each で ブックを 取得して自分自身以外があるかどうかの判定も悩ましいところがでてくる。 つまり、上でいったようなブックは、自分自身が開かれたことに伴い読み込まれたブックなので 自分自身とみなすことができる。でも、それらは自分自身じゃないので、【関係のない別ブック】が存在するという 判定になってしまう。
究極は、最初のレスでコメントしたように、自分自身に関連するブック(自分自身が明示的に開いたものも含め) を網羅的に把握しておいて、それら以外があるかどうかの判定で Application.Quit をかけるのか 自分自身に関連したブック.Close と ThisWorkbook.close をかけるのかを区別しなきゃいけない。
(ぶらっと)
これ厳密には、大変なのですが、
application.quit thisworkbook.close false
で編集中のブックがあれば、確認メッセージが表示されるので、 ある程度のチェックで良いと思いますけどねえ!! 自分で意識して開いたブックは、自分で閉じるのは、やっていただいてのことですが。
Xlstart内にあるものを意識して判別するか否か程度でよいのでは ないでしょうか?
因みに私の場合、Excelは、閉じない仕様が殆どです。 Excelは、オペレータに閉じてもらうようにしています。
ichinose
ぶらっとさん 詳しいことまで細かく説明いただき、 助かります。
すぐには頭がついていきませんでしたが 理解できました。
ややこしい質問ながら 貴重な書き込みありがとうございます。
ichinoseさん オペレーターさんの対応もありですね。
状況をまとめてもう一度読み返して考えてみます。
ありがとうございました。
(あや)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.