• ベストアンサー

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 で記述したら、エラーとなります。 どのようにすればいいのでしょうか? よろしくお願いします。

  • hiroi
  • お礼率89% (223/248)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。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 のコマンドは生きます。

hiroi
質問者

お礼

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

その他の回答 (7)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.8

#3です。 「バス時刻表.xls」ってファイル名は間違い無いですか? 閉じる対象が見つからないからインデックスが無効だったり、閉じずに終了したりするような、、、 「バス」が全角じゃなく半角とか、時刻表の後ろに空白があるとか、本当は「バス時刻表.xls.xls」だとか。

hiroi
質問者

お礼

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

回答No.6

ANo.1A および No.2 のご返信を読むと私が想定していることと、内容・手順が異なっているようです。 環境・手順の詳細を教えていただけませんか?

hiroi
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

見当はずれの場合はお許しください。 私がやってみた場合、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 を入れればよい(イベントプロシージュアーで閉じる必要がない) のでは。

hiroi
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >でも、このOn Error Resume Nextでは、 >Workbooks("バス時刻表.xls").Closeの処理をスキップするので、エラーは出ま >せんが、肝心のバス時刻表.xlsは閉じてくれません。 なぜですか? ちゃんと、試した上でおっしゃっているのでしょうか? On Error Resume Next は処理をスキップしているのではありませんよ。その部分のエラーを、エラー・オブジェクトに入れているのです。だから、エラー・オブジェクトで、エラー番号をみれば、そのエラーがわかります。 もし、そのコードで違うというのでしたら、もう一度、その閉じないという状況を、どうしているのか説明してください。 他のブックを開け閉めするのに、その目的のブックを先に閉じてしまっているからエラーを返しているわけではないのですか?

hiroi
質問者

お礼

Wendy02さん こんなに夜遅くどうもありがとうございます。 そうです。ちゃんと試しました。 バス時刻表.xlsが開いたままなので、手動というか右上にあるバツ印にカーソルを置いてクリックして閉じます。 すみません。今日も夜遅いのでまた返事します。明日も夜遅いので、数日したらまた返信しますので、申し訳ありません。 何の為にこれを作ったのかというと、バス時刻表.xlsの表を使って、vlookup関数を使って参照させる為です。バス時刻表.xlsを開かなくてもvlookup関数は他のファイルを参照することは出来るのですが、バス時刻表.xlsは何万行もあるので、バス時刻表.xlsを開かないと正常にならないようです。ですから、自動的にバス時刻表.xlsを開いて、使い終わったら、このファイルを閉じる時にバス時刻表.xlsも閉じてくれればいいと思った訳です。 以上、よろしくお願い致します。かなりの反響があってうれしいです。後で、他の回答を見て返信させて頂きます。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

もっと良い方法があるかも知れませんが、、、 残ってたら閉じるようにするとか。 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

hiroi
質問者

お礼

papayukaさん ご回答どうもありがとうございます。 この方法を使ったら、エラーもなく自分のファイルは閉じましたが、バス時刻表.xlsは閉じてくれません。 何故か分からないが、貴方のコードは間違いではないはずですが。。。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 エラーメッセージが出ているはずです。 インデックスがありません、とか出ていませんか? もし、そうなら、それは、ブックを正しい順序で、閉じていれば、そのようなエラーは出ないはずです。 私個人は、依存関係にあるブックは、参照設定するというのが決まりなのですが、参照設定のマクロは、なかなか閉じるときに、他のトラブルが発生してくれますので、以下のような処理方法が簡単でよいです。 'オープンのほうは、なぜか、エラーが出ません。 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

hiroi
質問者

お礼

Wendy02さん 早速の回答ありがとうございます。 そうです。インデックスが出ていませんと出ます。 解決例のコードありがとうございます。 でも、このOn Error Resume Nextでは、 Workbooks("バス時刻表.xls").Closeの処理をスキップするので、エラーは出ませんが、肝心のバス時刻表.xlsは閉じてくれません。 方法はないものでしょうか?

回答No.1

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

hiroi
質問者

お礼

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

関連するQ&A

  • VBAの更なる応用編

    度々すみません。 VBAで教えて下さい。 主ファイルYYYY.xlsmに下記の記述をしました。 副ファイルXXXX.xlsmがあります。 ------------------------------------------------- Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Workbooks("XXXX.xlsm").Close End Sub Private Sub Workbook_Open() Workbooks.Open Filename:= _ "XXXX.xlsm" Worksheets("Sheet1").Activate End Sub ------------------------------------------------- 以上で、YYYY.xlsmとXXXX.xlsmの場合、主、副の共に保存せずに 終了するにはどのようなコメントを追記したら良いですか。 ネットで調べた下記の内容は場所が悪いのか動作しませんでした。 Sub CloseWorkbook() Workbooks("XXXX").Close SaveChanges:= False End Sub

  • Excel VBA ブックが本当に閉じられた時だけ別のブックを閉じたい

    Excel VBA ブックが本当に閉じられた時だけ別のブックを閉じたい A.xls B.xls と二つのブックがあります。 A.xlsが閉じられる時、B.xlsも同時に閉じたいです。 A.xlsに以下のマクロを入れました。 Private?Sub?Workbook_BeforeClose(Cancel?As?Boolean) ?Workbooks("B.xls").Close?SaveChanges:=False End?Sub 問題はA.xlsが保存してない場合、「A.xlsへの変更を保存しますか?」というメッセー ジが 出てきますが、そこでキャンセルを押された場合でもB.xlsが閉じられてしまいます。 A.xlsが本当に閉じられた時だけB.xlsを閉じたいのですが そのようなことは可能でしょうか?

  • もしも新規Excelファイルを開いてる場合は閉じる

    Excel2003です・ ユーザーが新規Excelファイル(book1)かテスト用ファイルを開いている場合は閉じる処理を考えております。 Option Explicit Dim ws As Workbook, flag As Boolean Private Sub Workbook_Open() For Each ws In Workbooks If ws.Name = "Book1" Then flag = True Next ws If flag = True Then Workbooks("Book1.xls").Close   Else   End IF For Each ws In Workbooks If ws.Name = "テスト用.xls" Then flag = True Next ws If flag = True Then Workbooks("テスト用.xls").Close   Else   End IF End Sub このコードだとBook1を開いているのに、Trueで拾ってくれません。 ws.Name = "Book1.xls"にしても同じです。 どこかおかしい部分があるのでしょうか?

  • VBAの「This Workbook」について

    VBAの「This Workbook」にコードを書くことについて教えて下さい。 ここにコードを書きと、例えばどんな便利な機能があるのでしょうか? よろしくお願いします。 私は下記の意味はだいだいわかります。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Private Sub Workbook_Open()

  • アプリケーションも閉じたいのですが

    ブック(ファイル)だけじゃなくて アプリケーションも閉じたいのですが Private Sub Workbook_BeforeClose(Cancel As Boolean) ActiveWorkbook.Close SaveChanges:=True End Sub としたのですが、実際閉じるのはブックだけでアプリケーションは開いたままです。 「ウインドウを閉じる」を押して、ブックだけが閉じるのはわかるのですが 図のようにアプリケーション閉じるボタンを押してもウインドウ(ブック)しか閉じません。 Private Sub Workbook_BeforeClose(Cancel As Boolean) ActiveWorkbook.Close SaveChanges:=True Application.Quit End Sub にしても結果は同じです。 しかし、Workbook_BeforeCloseイベントがないファイルなら、 アプリケーション閉じるボタンを押しても全て終了できます。 Workbook_BeforeCloseイベントを使っても アプリケーションも閉じる方法を教えてください。

  • Office2010のVBAファイル自動オープン

    VBAの自動オープンで対象ファイルの開き方によって VBAが正常に動かないので質問させt下さい。 ネットワーク上のサーバーである AD-1から開くのとネットワークドライブPから開くのとでは Excelの名前の管理機能が動作しません。 Private Sub Workbook_Open() Workbooks.Open Filename:= _ "\\ad1\共通\aaaa.xlsx" Worksheets("Sheet1").Activate と Private Sub Workbook_Open() Workbooks.Open Filename:= _ "P:\共通\aaaa.xlsx" Worksheets("Sheet1").Activate 両方とも稼働させる方法はあるのでしょうか? よろしくお願いします。 End Sub

  • Excel VBAで異なるファイル間のコピー

    異なるファイル間で値のみをコピーしたいです。下記の様な感じです。 hoge1.xlsのA1からA10のセルの値のみをhoge2.xlsのB1からB10へコピーする。 以下の様に書いてみたのですが、数式がコピーされてしまいます。 VBAをやったことがなく、今ネットで30分ほど見て書いてみたので 根本的に理解していません。簡単な書き方を教えていただきたいです。 Sub test() Dim Fname As String Fname = "hoge1.xls" Workbooks.Open Filename:=Fname, ReadOnly:=True Dim range1 As Range Set range1 = Worksheets("Sheet1").Range("A1:A10") range1.Copy Destination:=Workbooks("hoge2.xls").Worksheets("Sheet1").Range("B1:B10") End Sub また、ファイルを開いたり閉じたりは必要なのでしょうか? Workbooks.Open Filename:=Fname, ReadOnly:=True を書かずに、いきなり Set range1 = Workbooks("hoge1.xls").Worksheets("Sheet1").Range("A1:A10") はダメなのでしょうか?? よろしくお願いします。

  • アクセスのMDBファイルを他のユーザーに強制的に読

    アクセスのMDBファイルを他のユーザーに強制的に読み取り専用で開かせる方法は? 私が作ったファイルを他の人にメールで送って その人はローカルで保存し、共有ではなく一人で使う場合、 読み取り専用にしたいです。 エクセルなら Private Sub Workbook_Open() Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & ActiveWorkbook.Name, ReadOnly:=True End Sub でできましたが アクセスの場合は どうすればいいでしょうか? ヴァージョンは2003です。 よろしくお願いします。

  • 自分のExcelを読み取り専用で開くVBAは?

    Excel2003を使っています。 基本的なことで恐縮なのですが、 Excelファイルを手動で開くとき、読み取り専用にするような方法はないでしょうか。 ファイルのプロパティから「読み取り専用」にチェックを入れても NASの性質なのか、チェックが外れてしまいます。 (前提として、ここの変更は考えていません) そこで、「読み取り専用を推奨する」にしたのですが、毎回メッセージボックスが出るため 「読み取り専用にしない」を選択される場合もあります。 そのため、VBAにその指示を書き込む方法を探していました。 たとえば、以下のコードを試してみました。 しかし、開いたファイルに指示しているため、当然ながら以下のメッセージが出ます。 "***.xls は既に開いています。2重に開くと、これまでの変更内容は破棄されます。***.xls を開きますか?" Private Sub Workbook_Open() Dim Filename As String Filename = ThisWorkbook.FullName With Workbooks.Open(Filename, , True) .ActiveSheet.Activate End With End Sub 「読み取り専用を推奨する」をオンにして、Workbook.Openの引数である ignorereadonlyrecommended を設定する…というのも、 やはり上記の点で引っかかります。 何か方法はないものでしょうか。。。

  • Excel VBAでユーザーフォームが表示されない

    使用環境:Excel2007 OS:Winows Vista A、Bの二つのExcel97-2003形式のxlsファイルがあります。 エクセルには自作のアドインを設定してあります。 (1) Aを開くと、Bを読み取り専用で開きます (2) Bを開いたら、アドインのモジュールを呼び出します。 (3) アドインからAを保存せずに閉じさせ、Bのデータを使用しフォームを表示させます。 ↑の(3)のフォームを表示部分でエラーも出ず、スルーされてしまい困っています。。。 Showの前までは正常に動いています。 この方法よりスマートな手法があればぜひお聞かせください。 みなさまのお力をお貸し下さい。お願いします。 以下コード Aのコード Private Sub Workbook_Open() ActiveWindow.WindowState = 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

専門家に質問してみよう