プロが教えるわが家の防犯対策術!

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
で記述したら、エラーとなります。

どのようにすればいいのでしょうか?

よろしくお願いします。

A 回答 (8件)

勘違いがあったら申し訳ありません。



試してみましたが問題はありませんでした。
考えられることは、ブックではなく Excel を終了しようとしているのではないか、ということです。
この場合、「バス時刻表.xls」が先に閉じられ、その後にマクロを記述したブックが閉じられますが、
「Workbook_BeforeClose」が実行されるタイミングでは既に「バス時刻表.xls」が閉じられているために
「インデックスが有効範囲にありません」とメッセージが表示される、と推測しています。

エラーを出さない方法としては、先にマクロを記述したブックを閉じるか、
または「Workbook_BeforeClose」を削除すればよいかと思います。
    • good
    • 0
この回答へのお礼

GreatDragonさん

早速の回答ありがとうございます。
そうでしたか。エクセルを終了しようとしていたからなんですね。だから、バス時刻表.xlsが閉じられたということでしたか。だから、「インデックスが有効範囲にありません」とメッセージが表示されるんですね。

それなら、Workbook_BeforeCloseというタイミングではダメなんですね。じゃ、どうすればいいの??

お礼日時:2005/11/30 00:10

こんばんは。


エラーメッセージが出ているはずです。
インデックスがありません、とか出ていませんか?

もし、そうなら、それは、ブックを正しい順序で、閉じていれば、そのようなエラーは出ないはずです。

私個人は、依存関係にあるブックは、参照設定するというのが決まりなのですが、参照設定のマクロは、なかなか閉じるときに、他のトラブルが発生してくれますので、以下のような処理方法が簡単でよいです。

'オープンのほうは、なぜか、エラーが出ません。

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
    • good
    • 0
この回答へのお礼

Wendy02さん

早速の回答ありがとうございます。
そうです。インデックスが出ていませんと出ます。

解決例のコードありがとうございます。
でも、このOn Error Resume Nextでは、
Workbooks("バス時刻表.xls").Closeの処理をスキップするので、エラーは出ませんが、肝心のバス時刻表.xlsは閉じてくれません。

方法はないものでしょうか?

お礼日時:2005/11/30 00:15

もっと良い方法があるかも知れませんが、、、


残ってたら閉じるようにするとか。

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
    • good
    • 0
この回答へのお礼

papayukaさん
ご回答どうもありがとうございます。

この方法を使ったら、エラーもなく自分のファイルは閉じましたが、バス時刻表.xlsは閉じてくれません。

何故か分からないが、貴方のコードは間違いではないはずですが。。。

お礼日時:2005/12/01 00:29

こんばんは。



>でも、このOn Error Resume Nextでは、
>Workbooks("バス時刻表.xls").Closeの処理をスキップするので、エラーは出ま
>せんが、肝心のバス時刻表.xlsは閉じてくれません。

なぜですか?

ちゃんと、試した上でおっしゃっているのでしょうか?

On Error Resume Next は処理をスキップしているのではありませんよ。その部分のエラーを、エラー・オブジェクトに入れているのです。だから、エラー・オブジェクトで、エラー番号をみれば、そのエラーがわかります。

もし、そのコードで違うというのでしたら、もう一度、その閉じないという状況を、どうしているのか説明してください。

他のブックを開け閉めするのに、その目的のブックを先に閉じてしまっているからエラーを返しているわけではないのですか?
    • good
    • 0
この回答へのお礼

Wendy02さん
こんなに夜遅くどうもありがとうございます。

そうです。ちゃんと試しました。
バス時刻表.xlsが開いたままなので、手動というか右上にあるバツ印にカーソルを置いてクリックして閉じます。

すみません。今日も夜遅いのでまた返事します。明日も夜遅いので、数日したらまた返信しますので、申し訳ありません。

何の為にこれを作ったのかというと、バス時刻表.xlsの表を使って、vlookup関数を使って参照させる為です。バス時刻表.xlsを開かなくてもvlookup関数は他のファイルを参照することは出来るのですが、バス時刻表.xlsは何万行もあるので、バス時刻表.xlsを開かないと正常にならないようです。ですから、自動的にバス時刻表.xlsを開いて、使い終わったら、このファイルを閉じる時にバス時刻表.xlsも閉じてくれればいいと思った訳です。

以上、よろしくお願い致します。かなりの反響があってうれしいです。後で、他の回答を見て返信させて頂きます。

お礼日時:2005/12/01 00:56

見当はずれの場合はお許しください。


私がやってみた場合、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
を入れればよい(イベントプロシージュアーで閉じる必要がない)
のでは。
    • good
    • 0
この回答へのお礼

皆さん

ご迷惑をおかけしました。やっと解決できました。
これは、
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Workbooks("パス名\バス時刻表.xls").Close
End Sub
としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。
よく考えたら、ファイルが開いている訳だからパス名は不用でした。
でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。

お礼日時:2005/12/04 16:47

ANo.1A および No.2 のご返信を読むと私が想定していることと、内容・手順が異なっているようです。


環境・手順の詳細を教えていただけませんか?
    • good
    • 1
この回答へのお礼

皆さん

ご迷惑をおかけしました。やっと解決できました。
これは、
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Workbooks("パス名\バス時刻表.xls").Close
End Sub
としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。
よく考えたら、ファイルが開いている訳だからパス名は不用でした。
でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。

お礼日時:2005/12/04 16:48

こんにちは。

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 のコマンドは生きます。
    • good
    • 0
この回答へのお礼

皆さん

ご迷惑をおかけしました。やっと解決できました。
これは、
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Workbooks("パス名\バス時刻表.xls").Close
End Sub
としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。
よく考えたら、ファイルが開いている訳だからパス名は不用でした。
でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。

お礼日時:2005/12/04 16:49

#3です。



「バス時刻表.xls」ってファイル名は間違い無いですか?
閉じる対象が見つからないからインデックスが無効だったり、閉じずに終了したりするような、、、

「バス」が全角じゃなく半角とか、時刻表の後ろに空白があるとか、本当は「バス時刻表.xls.xls」だとか。
    • good
    • 0
この回答へのお礼

皆さん

ご迷惑をおかけしました。やっと解決できました。
これは、
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Workbooks("パス名\バス時刻表.xls").Close
End Sub
としていたからでした。Open時にパス名を入れていたので、BeforeCloseの方にもパス名を入れていました。
よく考えたら、ファイルが開いている訳だからパス名は不用でした。
でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。

お礼日時:2005/12/04 16:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A