• ベストアンサー
  • 暇なときにでも

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
  • 閲覧数1543
  • ありがとう数11

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

皆さん ご迷惑をおかけしました。やっと解決できました。 これは、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("パス名\バス時刻表.xls").Close End Sub としていたからでした。Open時にパス名を入れていたので、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

  • VBAの「This Workbook」について

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

  • 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を閉じたいのですが そのようなことは可能でしょうか?

その他の回答 (7)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.6

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

見当はずれの場合はお許しください。 私がやってみた場合、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の方にもパス名を入れていました。 よく考えたら、ファイルが開いている訳だからパス名は不用でした。 でも、皆さんのアドバイスは参考になるものばかりで、新たに知識が増えたものがあります。みなさん、ありがとうございました。

  • 回答No.4
  • 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も閉じてくれればいいと思った訳です。 以上、よろしくお願い致します。かなりの反響があってうれしいです。後で、他の回答を見て返信させて頂きます。

  • 回答No.3
  • 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は閉じてくれません。 何故か分からないが、貴方のコードは間違いではないはずですが。。。

  • 回答No.2
  • 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は閉じてくれません。 方法はないものでしょうか?

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • エクセルVBAにて保存するとき

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("エクセルを終了してもよろしいですか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If Application.DisplayAlerts = False Application.Quit End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "そのボタンでは保存できません。" & vbCrLf & _ "雛形は残しておきましょう" & vbCrLf & _ "" & vbCrLf & _ "ツールバーの「マクロなし出力」から保存できます。" Cancel = True End Sub という二つのマクロをThisworkbookにいれてあるんですが、 この二つを有効(今は2つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?

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

    ブック(ファイル)だけじゃなくて アプリケーションも閉じたいのですが 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イベントを使っても アプリケーションも閉じる方法を教えてください。

  • VBAの書き方

    VBA初心者です。 EXCEL2007を使っています。 いま、下記のような書き方で、 1.セル(A1)をダブルクリックしたら「Z:\管理\01.xlsx」を開く 2.セル(A2)をダブルクリックしたら「Z:\管理\02.xlsx」を開く ・ ・ ・ n.セル(An)をダブルクリックしたら「「Z:\管理\0n.xlsx」を開く という動きをしたいと考えています。 わからないまま、WEBサイトで見つけた書き方を下記のように書き換えて試してみました。 一つではうまくいきますが、二つ目の設定をすると・・・ 添付画像のように、「コンパイルエラー 名前が適切ではありません」と出てしまいます。 WEBで調べた限りでは、 「Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)」 の部分が同じ名前がエラーの原因のように思えますが、どうしてよいかわかりません。 よろしくお願いします。 -------------------------------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address <> "$A$1" Then Exit Sub Cancel = True ChDir "Z:\管理\" Workbooks.Open Filename:="Z:\管理\01.xlsx" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address <> "$A$2" Then Exit Sub Cancel = True ChDir "Z:\管理\" Workbooks.Open Filename:="Z:\管理\02.xlsx" End Sub

  • 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 選択されたセルの範囲を別のセル

    excel vba 選択されたセルの範囲を別のセルに書き込みたい。 お世話になっております。 乱筆乱文お許し下さい。 EXCEL VBAについてですが、或るブックを閉じる時(Private Sub Workbook_BeforeClose(Cancel As Boolean))にその時点でACTIVEなsheetの名前を指定シートの指定セルに書き込み、そのブックを開く時(Private Sub Workbook_Open())に指定シートの指定セルの値の名前sheetをACTIVEにすることは出来たのですが、もう一歩進んで、 ブックを閉じる時(Private Sub Workbook_BeforeClose(Cancel As Boolean))にその時点でselectされているcellの範囲(単一セル・複数セル共に、名前がついていたら名前、ついていなければrangeを表す文字列)を指定シートの指定セルに書き込み、そのブックを開く時(Private Sub Workbook_Open())に指定シートの指定セルの値の名前cell範囲をselectするようなことがやりたいのですが、私の検索の仕方が下手で、なかなか出てきません。どなたかご教示下さい。よろしくお願いします。

  • 【Excel VBA】 ブッククローズ時の動作について

    環境: WindowsXP Office2003 ThisWorkBookモジュールに、 Private Sub Workbook_BeforeClose(Cancel As Boolean) 'ブックの保存を要求しない ThisWorkbook.Saved = True 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です。 よろしくお願いします。

  • VBAでファイルを保存せずに閉じた後の他ブックの挙動

    初めて質問させていただきます。 VBA初心者の為、質問自体に不足があるかもしれませんが、ご協力をお願い致します。 エクセル2000(SP3)で複数のブック(仮にA.xls,B.xlsとします)を起動した状態で、Aをマクロを使って保存せずに終了させたところ、Bの操作が出来なくなります。(セル選択等もできません。Bのsheetを選択するとアプリケーションエラーになってしまいます) 同Windows上に他アプリケーションが起動している場合、それらを一度選択してから再度Excelを選択すると、Bの操作が可能になります。 保存せずに終了させる為のマクロは次のとおりです。 ブックAのThisWorkbook内に記述しています。 Private Sub Workbook_BeforeClose(Cancel As Boolean) If Workbooks.count = 1 Then Application.DisplayAlerts = False Application.Quit Else ThisWorkbook.Close SaveChanges:=False End If End Sub 以上、よろしくお願い致します。

  • ExcelのVBAでWEBページを開くのが遅い

    よろしくお願いいたします。 現在社内システムのデータをExcelに落とすVBAを作っています。 単純に、 sub test () URL = "http://..." Dim xls As Workbook Set xls = Application.Workbooks.Open(URL) end sub のようなものを作成して実行したのですが、 Set xls = Application.Workbooks.Open(URL) の所で50~60秒ほど時間がかかってしまいます。 もう少し早くする方法はないのでしょうか?