- ベストアンサー
VBAでファイルを閉じる時に、他のエクセルファイルを閉じるには?
VBAで、 Private Sub Workbook_Open() Workbooks.Open FileName:="バス時刻表.xls",ReadOnly:=True End Sub で、バス時刻表.xlsを自動的にオープンした後、 閉じる時に、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("バス時刻表.xls").Close End Sub で記述したら、エラーとなります。 どのようにすればいいのでしょうか? よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。Wendy02です。 たぶん、こういうことだと思います。 #4 #もし、そのコードで違うというのでしたら、もう一度、その閉じないという状況を、どうしているのか説明してください。 #6 GreatDrangoさん Wrote: #環境・手順の詳細を教えていただけませんか いくつか、シミュレートしてみて、質問で書かれていないものがあると思いました。 それは、imogasiさんの言葉のヒントからですが、 >標準モジュール(本体処理)の方で>「エクセルを終了しようとしていた」なんてのがあるとエラーが起こるのでしょう。 これで、閉じない条件は、Excelの全終了(Application.Quit)の場合です。 この場合は、そのコードの間違いではなく、そのコードのタイミングの問題です。 それを書かなければ、私は、正しく質問を理解できません。 ただし、On Error Resume Next は、エラー処理として、私は必要だと思います。先に閉じるケースはあるのですから。 '標準モジュールに Sub Auto_Close() On Error Resume Next Workbooks("バス時刻表.xls").Close End Sub とすれば、Application.Quit のコマンドは生きます。
その他の回答 (7)
- papayuka
- ベストアンサー率45% (1388/3066)
#3です。 「バス時刻表.xls」ってファイル名は間違い無いですか? 閉じる対象が見つからないからインデックスが無効だったり、閉じずに終了したりするような、、、 「バス」が全角じゃなく半角とか、時刻表の後ろに空白があるとか、本当は「バス時刻表.xls.xls」だとか。
お礼
皆さん ご迷惑をおかけしました。やっと解決できました。 これは、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("パス名\バス時刻表.xls").Close End Sub としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。 よく考えたら、ファイルが開いている訳だからパス名は不用でした。 でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。
- GreatDragon
- ベストアンサー率46% (186/402)
ANo.1A および No.2 のご返信を読むと私が想定していることと、内容・手順が異なっているようです。 環境・手順の詳細を教えていただけませんか?
お礼
皆さん ご迷惑をおかけしました。やっと解決できました。 これは、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("パス名\バス時刻表.xls").Close End Sub としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。 よく考えたら、ファイルが開いている訳だからパス名は不用でした。 でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
見当はずれの場合はお許しください。 私がやってみた場合、book2.xlsのイベントプロシージュアーに 下記を入れて実行しましたが、エラーは出ません。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("Book1.xls").Close End Sub Private Sub Workbook_Open() Workbooks.Open "Book1.xls" End Sub だから質問のコードが間違っているのでなく、正しい。 しかし、イベントプロシージュアーでなく、標準モジュール(本体処理)の方で>「エクセルを終了しようとしていた」なんてのがあると エラーが起こるのでしょう。 どんなコードになってますか。 book2の標準モジュールに Sub test01() Application.Quit End Sub を入れて実行すると、うまくいきました。 また本体のエクセルを終了する直前ステップに Workbooks("Book1.xls").Close を入れればよい(イベントプロシージュアーで閉じる必要がない) のでは。
お礼
皆さん ご迷惑をおかけしました。やっと解決できました。 これは、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("パス名\バス時刻表.xls").Close End Sub としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。 よく考えたら、ファイルが開いている訳だからパス名は不用でした。 でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >でも、このOn Error Resume Nextでは、 >Workbooks("バス時刻表.xls").Closeの処理をスキップするので、エラーは出ま >せんが、肝心のバス時刻表.xlsは閉じてくれません。 なぜですか? ちゃんと、試した上でおっしゃっているのでしょうか? On Error Resume Next は処理をスキップしているのではありませんよ。その部分のエラーを、エラー・オブジェクトに入れているのです。だから、エラー・オブジェクトで、エラー番号をみれば、そのエラーがわかります。 もし、そのコードで違うというのでしたら、もう一度、その閉じないという状況を、どうしているのか説明してください。 他のブックを開け閉めするのに、その目的のブックを先に閉じてしまっているからエラーを返しているわけではないのですか?
お礼
Wendy02さん こんなに夜遅くどうもありがとうございます。 そうです。ちゃんと試しました。 バス時刻表.xlsが開いたままなので、手動というか右上にあるバツ印にカーソルを置いてクリックして閉じます。 すみません。今日も夜遅いのでまた返事します。明日も夜遅いので、数日したらまた返信しますので、申し訳ありません。 何の為にこれを作ったのかというと、バス時刻表.xlsの表を使って、vlookup関数を使って参照させる為です。バス時刻表.xlsを開かなくてもvlookup関数は他のファイルを参照することは出来るのですが、バス時刻表.xlsは何万行もあるので、バス時刻表.xlsを開かないと正常にならないようです。ですから、自動的にバス時刻表.xlsを開いて、使い終わったら、このファイルを閉じる時にバス時刻表.xlsも閉じてくれればいいと思った訳です。 以上、よろしくお願い致します。かなりの反響があってうれしいです。後で、他の回答を見て返信させて頂きます。
- papayuka
- ベストアンサー率45% (1388/3066)
もっと良い方法があるかも知れませんが、、、 残ってたら閉じるようにするとか。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim wb As Workbook For Each wb In Workbooks If wb.Name = "バス時刻表.xls" Then Workbooks("バス時刻表.xls").Close Next wb End Sub
お礼
papayukaさん ご回答どうもありがとうございます。 この方法を使ったら、エラーもなく自分のファイルは閉じましたが、バス時刻表.xlsは閉じてくれません。 何故か分からないが、貴方のコードは間違いではないはずですが。。。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 エラーメッセージが出ているはずです。 インデックスがありません、とか出ていませんか? もし、そうなら、それは、ブックを正しい順序で、閉じていれば、そのようなエラーは出ないはずです。 私個人は、依存関係にあるブックは、参照設定するというのが決まりなのですが、参照設定のマクロは、なかなか閉じるときに、他のトラブルが発生してくれますので、以下のような処理方法が簡単でよいです。 'オープンのほうは、なぜか、エラーが出ません。 Private Sub Workbook_Open() Workbooks.Open FileName:="バス時刻表.xls",ReadOnly:=True End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next '←このようなエラー解除が一番簡単です。 Workbooks("バス時刻表.xls").Close End Sub
お礼
Wendy02さん 早速の回答ありがとうございます。 そうです。インデックスが出ていませんと出ます。 解決例のコードありがとうございます。 でも、このOn Error Resume Nextでは、 Workbooks("バス時刻表.xls").Closeの処理をスキップするので、エラーは出ませんが、肝心のバス時刻表.xlsは閉じてくれません。 方法はないものでしょうか?
- GreatDragon
- ベストアンサー率46% (186/402)
勘違いがあったら申し訳ありません。 試してみましたが問題はありませんでした。 考えられることは、ブックではなく Excel を終了しようとしているのではないか、ということです。 この場合、「バス時刻表.xls」が先に閉じられ、その後にマクロを記述したブックが閉じられますが、 「Workbook_BeforeClose」が実行されるタイミングでは既に「バス時刻表.xls」が閉じられているために 「インデックスが有効範囲にありません」とメッセージが表示される、と推測しています。 エラーを出さない方法としては、先にマクロを記述したブックを閉じるか、 または「Workbook_BeforeClose」を削除すればよいかと思います。
お礼
GreatDragonさん 早速の回答ありがとうございます。 そうでしたか。エクセルを終了しようとしていたからなんですね。だから、バス時刻表.xlsが閉じられたということでしたか。だから、「インデックスが有効範囲にありません」とメッセージが表示されるんですね。 それなら、Workbook_BeforeCloseというタイミングではダメなんですね。じゃ、どうすればいいの??
お礼
皆さん ご迷惑をおかけしました。やっと解決できました。 これは、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("パス名\バス時刻表.xls").Close End Sub としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。 よく考えたら、ファイルが開いている訳だからパス名は不用でした。 でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。