- ベストアンサー
VBAでファイルを閉じる時の応用を教えて下さい。
VBAで 主となるファイルを立ち上げ時に副となるファイルを自動で開き 主なるファイルを閉じると副となるファイルを自動で閉じるのも分かるのですが 万が一、副となるファイルを先に閉じてしまった時にエラーがでるのを 回避したいのですが教えて下さい。 ※主となるファイルはファイル名が異なります。 副となるファイル名は同一です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
副ファイルを先に閉じてから、主ファイルを閉じようとするとエラーが起きるという事ではないのでしょうか。 違っていたら読み流してください。 主のファイルに Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("xxxx.xlsx").Activate ActiveWorkbook.Close End Sub となっているという事ですが Workbooks("xxxx.xlsx").Activateの部分がエラーになる訳ですよね。 下記のようにすれば、エラーは出ないと思うのですが。 Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Workbooks("xxxx.xlsx").Close End Sub
その他の回答 (3)
- tsubuyuki
- ベストアンサー率45% (699/1545)
> 副となるファイルを先に閉じてしまった時にエラーがでる どのエラーを指して「エラー」と言っていらっしゃいます? それによって「回避」の方法は変わりますので、 「エラー」の内容がわからないと何もできませんよ。 さて、前の回答を応用してみましょうか。 > 主となるファイルを立ち上げ時に副となるファイルを自動で開き という事ですが、「主のブック」のオープン時イベントでの処理でしょうか。 だとしたら、副が立ち上がる時に「主のブック」の名前は取得できますね。 それをどこかに保持しておけば、主のブックの名前がどのように変わろうと 副のブックを閉じるときに主のブックが開いているかどうかのチェックはできます。 また、「主のブックから開くときに限り、副のブックを非表示にする」 と言う方法で、副のブックだけを手動で強制的に閉じられることは回避できるはずです。 コレも主ブックのオープン時イベントで設定できます。 ただしこの場合、主のブックを閉じるときに非表示を解除、保存しないで終了するのをお忘れなく。
補足
主のファイルに下記の様に仕込んでいます。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("xxxx.xlsx").Activate ActiveWorkbook.Close End Sub Private Sub Workbook_Open() Workbooks.Open Filename:= _ "xxx.xlsx" Worksheets("Sheet1").Activate End Sub 以上を記述して、先にXXXXファイルを閉じると デバッグが発生してしまいます。 すみません。説明が下手で・・・。
- mar00
- ベストアンサー率36% (158/430)
単純に主ファイルを閉じるときに副ファイルを閉じるだけであれば Sub auto_close() On Error Resume Next Workbooks("****.xls").Close End Sub のようにすれば 副ファイルが開いていなくてもエラーを回避できると思います。
お礼
mor00さんありがとうございました。 ご回答頂きましたが 現状が正しく説明出来なくてすみません。 下記の様に主ファイルには記述していますが、 副ファイルすなわち「"項目.xlsx"」が先に終了した後に 主ファイルがエラーを起こしてしまう事を回避したいのです。 以上、よろしくお願いします。 -------------------------------------------- Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("項目.xlsx").Activate ActiveWorkbook.Close End Sub
- tsubuyuki
- ベストアンサー率45% (699/1545)
要するに・・ 「主のブックが開いていたら、副のブックを閉じられないようにしたい」 ってことですね。 違ったら、無視してくださいませ。 副のブックのThisWorkbookモジュールに以下のように。 Private Sub Workbook_BeforeClose(Cancel As Boolean) If 主ブックが開いている Then Cancel = True MsgBox("主ブックが開いています", vbOKOnly) Else Cancel = False End If End Sub 「主ブックが開いているかどうか」判断するコードは調べれば色々出てきますので 別途お調べくださいませ。
補足
tsubuyukiさん、ありがとうございます。 それでも良いのですが、副が先に強制的に閉じたら 主も閉じられれば良いのですが、主のファイル名が違う事が あるので別の方法が無いかと・・・。 副が先に閉じられてもエラーが出ない方法でも良いですので ご教授下さい。よろしくお願いします。
お礼
mar00さんありがとうございました。 大変助かりました。 ありがとうございました。