Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4224 / 13644 ツリー ←次へ | 前へ→

【57629】BeforeCloseイベントについて いかぽっぽ 08/9/6(土) 0:08 質問[未読]
【57638】Re:BeforeCloseイベントについて りん 08/9/6(土) 12:42 発言[未読]
【57640】Re:BeforeCloseイベントについて こたつねこ 08/9/6(土) 13:12 発言[未読]
【57641】Re:BeforeCloseイベントについて りん 08/9/6(土) 13:59 発言[未読]
【57642】Re:BeforeCloseイベントについて こたつねこ 08/9/6(土) 14:54 発言[未読]
【57645】Re:BeforeCloseイベントについて kobasan 08/9/6(土) 19:29 発言[未読]
【57646】Re:BeforeCloseイベントについて りん 08/9/6(土) 19:52 発言[未読]
【57648】Re:BeforeCloseイベントについて こたつねこ 08/9/6(土) 19:56 発言[未読]
【57649】Re:BeforeCloseイベントについて りん 08/9/6(土) 20:14 発言[未読]
【57650】Re:BeforeCloseイベントについて kobasan 08/9/6(土) 22:50 発言[未読]
【57651】Re:BeforeCloseイベントについて kobasan 08/9/6(土) 23:56 発言[未読]
【57653】Re:BeforeCloseイベントについて kobasan 08/9/7(日) 9:59 発言[未読]
【57654】Re:BeforeCloseイベントについて kobasan 08/9/7(日) 12:43 回答[未読]
【57666】Re:BeforeCloseイベントについて ichinose 08/9/8(月) 8:48 発言[未読]
【57668】Re:訂正 ichinose 08/9/8(月) 10:38 発言[未読]
【57800】Re:訂正 kobasan 08/9/13(土) 16:46 発言[未読]
【57806】Re:訂正 りん 08/9/13(土) 18:16 発言[未読]

【57629】BeforeCloseイベントについて
質問  いかぽっぽ  - 08/9/6(土) 0:08 -

引用なし
パスワード
   初めまして いかぽっぽと申します。
最近VBAを勉強し始めた超初心者です;;;

早速なのですが、仕事で2つのエクセルファイルがあり、仮にファイル名を001.xls・002.xlsとした場合、

 001.xlsに入力・保存した後に、002.xlsを開き入力・保存する。

という流れ作業があるのですが、

001.xlsを閉じる時にBeforeCloseイベントでMsgBoxをyesnoで表示し、

"002.xls"を開きますか?"
Yes→001.xlsを閉じて、002.xlsを開く。
No→001.xlsを閉じる。

というマクロを組んでみたのですが、001.xlsが閉じられず、002.xlsを閉じる際にも001.xlsで設定したMsgBoxが表示されてしまうなど、うまく動きません;;;
BeforeCloseイベントの使い方が間違っているのでしょうか??
そもそも別のやり方があるのでしょうか??

教えてください、お願いします!

【57638】Re:BeforeCloseイベントについて
発言  りん E-MAIL  - 08/9/6(土) 12:42 -

引用なし
パスワード
   いかぽっぽ さん、こんにちわ。

>001.xlsを閉じる時にBeforeCloseイベントでMsgBoxをyesnoで表示し、
>
>"002.xls"を開きますか?"
>Yes→001.xlsを閉じて、002.xlsを開く。
>No→001.xlsを閉じる。

どういうマクロを組まれているのかわかりませんが、
002.xlsにはOpen/BeforeCloseマクロなし
001.xlsには以下のマクロを記述

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  '念のため保存しておく(ここで上書きしたくない場合はSavedを使う)
  ThisWorkbook.Save
  '開くかどうかの分岐
  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then Workbooks.Open "002.xls"
End Sub

で上記の動作になりました。

【57640】Re:BeforeCloseイベントについて
発言  こたつねこ  - 08/9/6(土) 13:12 -

引用なし
パスワード
   りんさん、いかぽっぽさん、こんにちわ。

ちょっと時間があったので、りんさんのコードを実行してみた結果
当方の環境では「002.xls」を開いた場合は「001.xls」のBookは
閉じられませんでした。
Excelのバージョンが違うのかな???

OS:WindowsXP SP2
Excel2003

>Private Sub Workbook_BeforeClose(Cancel As Boolean)
>  '念のため保存しておく(ここで上書きしたくない場合はSavedを使う)
>  ThisWorkbook.Save
>  '開くかどうかの分岐
>  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then Workbooks.Open "002.xls"
>End Sub
>
>で上記の動作になりました。

【57641】Re:BeforeCloseイベントについて
発言  りん E-MAIL  - 08/9/6(土) 13:59 -

引用なし
パスワード
   こたつねこ さん、こんにちわ。

>OS:WindowsXP SP2
>Excel2003
環境は全く同じです。
002.xlsに何か入ってますか?

実験環境
 001.xlsにさっきのマクロ
 002.xlsはマクロなし

 001.xlsを閉じるときに分岐で002.xlsを開くか開かないか。
 002.xlsを直接開くことは考慮していません。

【57642】Re:BeforeCloseイベントについて
発言  こたつねこ  - 08/9/6(土) 14:54 -

引用なし
パスワード
   りんさん、こんにちは。
>>OS:WindowsXP SP2
>>Excel2003
>環境は全く同じです。
>002.xlsに何か入ってますか?
>
>実験環境
> 001.xlsにさっきのマクロ
> 002.xlsはマクロなし
>
> 001.xlsを閉じるときに分岐で002.xlsを開くか開かないか。
> 002.xlsを直接開くことは考慮していません。
まったく同じ状況で、001.xlsが閉じませんね。

なにが違うのか・・・謎です。^^;

【57645】Re:BeforeCloseイベントについて
発言  kobasan  - 08/9/6(土) 19:29 -

引用なし
パスワード
   ▼こたつねこ さん:

>>>OS:WindowsXP SP2
>>>Excel2003
>>環境は全く同じです。
>>002.xlsに何か入ってますか?
>>
>>実験環境
>> 001.xlsにさっきのマクロ
>> 002.xlsはマクロなし
>>
>> 001.xlsを閉じるときに分岐で002.xlsを開くか開かないか。
>> 002.xlsを直接開くことは考慮していません。
>まったく同じ状況で、001.xlsが閉じませんね。
>
>なにが違うのか・・・謎です。^^;

皆さん今晩は。

赤×で閉じようとしたときは、001.xlsは残りました。
黒×で閉じようとしたときは、001.xlsは閉じました。

当方
OS:WindowsXP SP3
Excel2002
です。

【57646】Re:BeforeCloseイベントについて
発言  りん E-MAIL  - 08/9/6(土) 19:52 -

引用なし
パスワード
   みなさん、こんばんわ。

>>>実験環境
>>> 001.xlsにさっきのマクロ
>>> 002.xlsはマクロなし
>>>
>>> 001.xlsを閉じるときに分岐で002.xlsを開くか開かないか。
>>> 002.xlsを直接開くことは考慮していません。


>赤×で閉じようとしたときは、001.xlsは残りました。
>黒×で閉じようとしたときは、001.xlsは閉じました。

赤× → ブックウィンドウが元のサイズ
黒× → ブックウィンドウが最大 ということでしょうか。

両方試してみたところ、どっちも閉じましたが。
他に試したのは
CTRL + W(閉じるコマンド)
 正常動作

ただし、ALT + F4で閉じた場合、
 002.xlsを
  開く → 両方残る
  開かない → EXCEL終了

でした。
ブックを閉じるというよりは、エクセルを終了するかどうかが分岐点な気がします。

【57648】Re:BeforeCloseイベントについて
発言  こたつねこ  - 08/9/6(土) 19:56 -

引用なし
パスワード
   みなさん、こんばんわ。

>ただし、ALT + F4で閉じた場合、
> 002.xlsを
>  開く → 両方残る
>  開かない → EXCEL終了
つい癖で、これやってました。

>ブックを閉じるというよりは、エクセルを終了するかどうかが分岐点な気がします。
まさにこれですね・・・失礼しました^^;

【57649】Re:BeforeCloseイベントについて
発言  りん E-MAIL  - 08/9/6(土) 20:14 -

引用なし
パスワード
   みなさん、こんばんわ。

ついでにAuto_Closeでも試してみましたよ。

>>ただし、ALT + F4で閉じた場合、
>> 002.xlsを
   開く → EXCEL終了
   開かない → EXCEL終了
でしたw
BeforeCloseの場合は、002を開いたところでエクセルの終了がキャンセルされるので、ついでに001のクローズもキャンセル、Auto_Closeの場合は002を開いてもそのままエクセルが終了(002ごとクローズ)になるということのようですね。

>>ブックを閉じるというよりは、エクセルを終了するかどうかが分岐点な気がします。
>まさにこれですね・・・失礼しました^^;
ということは、いかぽっぽさんのもエクセルを終了していただけかもしれませんね。

【57650】Re:BeforeCloseイベントについて
発言  kobasan  - 08/9/6(土) 22:50 -

引用なし
パスワード
   みなさん、こんばんわ。

>赤× → ブックウィンドウが元のサイズ
>黒× → ブックウィンドウが最大 ということでしょうか。

ではなく

赤×(右上のアイコン)  → EXCEL終了ウィンドウ終了
黒×(その下のアイコン) → ブックウィンドウ終了

ということです。

>ということは、いかぽっぽさんのもエクセルを終了していただけかもしれませんね。

ということです。

ユーザーが 、赤×、黒×のどちらを押しても001.xls を終了できるようにしたい
と言うことだと思います。これ難しいですね。

【57651】Re:BeforeCloseイベントについて
発言  kobasan  - 08/9/6(土) 23:56 -

引用なし
パスワード
   訂正
>赤×(右上のアイコン)  → EXCEL終了ウィンドウ終了
赤×(右上のアイコン)  → EXCELウィンドウ終了
でした。

「イベントを監視するマクロを含むBook」を終了するのは難しいですね。
以前、これに似た「EXCEL終了」、「Book終了」の問題に直面したことがあります。
ユーザーが、データブックを残して、「イベントを監視するマクロを含むマクロブック」を先に終了する場合があったので、それに対応するのに大変苦労したことがありました。
私自身この問題を不完全にしかクリアできていないので、解決策が出るのが楽しみ
です。

【57653】Re:BeforeCloseイベントについて
発言  kobasan  - 08/9/7(日) 9:59 -

引用なし
パスワード
   >>赤×(右上のアイコン)  → EXCEL終了ウィンドウ終了
> 赤×(右上のアイコン)  → EXCELウィンドウ終了

下記コードで、とりあえず、この両方で閉じます

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If Workbooks.Count = 2 Then
   ThisWorkbook.Close False
   Exit Sub
  End If
  '念のため保存しておく(ここで上書きしたくない場合はSavedを使う)
  '開くかどうかの分岐
  ThisWorkbook.Save
  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
   Workbooks.Open "002.xls"
   ThisWorkbook.Close False
  End If
End Sub

とりあえずで、気に入らないのは、
   ThisWorkbook.Close False
を2回記述しているところです。手抜きですが、これくらいです。

【57654】Re:BeforeCloseイベントについて
回答  kobasan  - 08/9/7(日) 12:43 -

引用なし
パスワード
   気に入らない、
   ThisWorkbook.Close False
を除去できました。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If Workbooks.Count > 1 Then
   'ThisWorkbook.Close False  '<=●タイミングの関係でこれ不要みたい●
   Exit Sub
  End If
  '念のため保存しておく(ここで上書きしたくない場合はSavedを使う)
  '開くかどうかの分岐
  ThisWorkbook.Save
  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
   Workbooks.Open "002.xls"
   ThisWorkbook.Close False
  End If
End Sub

【57666】Re:BeforeCloseイベントについて
発言  ichinose  - 08/9/8(月) 8:48 -

引用なし
パスワード
   おはようございます。

>Private Sub Workbook_BeforeClose(Cancel As Boolean)
>  If Workbooks.Count > 1 Then
>   'ThisWorkbook.Close False  '<=●タイミングの関係でこれ不要みたい●
>   Exit Sub
>  End If
>  '念のため保存しておく(ここで上書きしたくない場合はSavedを使う)
>  '開くかどうかの分岐
>  ThisWorkbook.Save
>  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
   Workbooks.Open thisworkbook.path & "\002.xls"
>   ThisWorkbook.Close False
>  End If
>End Sub

私もいくつか考えてみたのですが、Excel2002 SP3では、うまくいきません。
上記のkobasanさんのコードも

コードを設定後、一度Excelを終了して後、
再度、Excelを起動し、問題の上記のコードを含んだ001.XLSを開いた後、
いきなり、Excel終了Xボタンをクリックすると、

>  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
   Workbooks.Open thisworkbook.path & "\002.xls"
上記のMsgboxで「はい」をクリックすると、
次行の

Workbooks.Open thisworkbook.path & "\002.xls"

ここで、
「実行時エラー'5'
 プロシジャー呼び出し、または引数が不正です」

というエラーが発生し、コードが止まります。
002.XLSは開かれいるので、

On Error Resume Next
Workbooks.Open thisworkbook.path & "\002.xls"

等と付加してもエラーは回避できません。
(VBEのオプションのエラートラップは 「エラー処理対象外のエラーで中断」を選択)
つまり、トラップを拾えない状況です。

しかし、このエラー発生後、一度、002.Xls,001.Xlsを閉じた後(Excelは終了しない)、再度001.XLSを開いて、同様の動作を行うと、001.XLSが閉じて、002.XLSが開く
という正しい処理がなされます。

いくつか修正も必要かと思いますが、001.XlsのThisworkbookに

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim bk As Object
  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
   
    On Error Resume Next
    With CreateObject("excel.application")
     .Visible = True
     .Workbooks.Open ThisWorkbook.Path & "\002.xls"
     End With
    Application.Quit
  End If
End Sub

などとして、別インスタンスのExcelに002.Xlsを開く方法ぐらいしか
正常に作動しません。


Excelの他のバージョンではいかがですか?

【57668】Re:訂正
発言  ichinose  - 08/9/8(月) 10:38 -

引用なし
パスワード
   失礼しました。
独自アドインが邪魔しているようでした。
アドインを外したら、kobasanさんのコードで正常に作動しました。

kobasanさん、失礼しました。

【57800】Re:訂正
発言  kobasan  - 08/9/13(土) 16:46 -

引用なし
パスワード
   皆さん、ichinose さん 今日は。

>Private Sub Workbook_BeforeClose(Cancel As Boolean)
>  Dim bk As Object
>  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
>   
>    On Error Resume Next
>    With CreateObject("excel.application")
>     .Visible = True
>     .Workbooks.Open ThisWorkbook.Path & "\002.xls"
>     End With
>    Application.Quit
>  End If
>End Sub
>
>などとして、別インスタンスのExcelに002.Xlsを開く方法

この使い方、
CreateObject("excel.application")
いいですね。

今回も勉強になり、投稿して良かったです。

【57806】Re:訂正
発言  りん E-MAIL  - 08/9/13(土) 18:16 -

引用なし
パスワード
   こんにちわ。

>>Private Sub Workbook_BeforeClose(Cancel As Boolean)
>>  Dim bk As Object
>>  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
>>   
>>    On Error Resume Next
>>    With CreateObject("excel.application")
>>     .Visible = True
>>     .Workbooks.Open ThisWorkbook.Path & "\002.xls"
>>     End With
>>    Application.Quit
>>  End If
>>End Sub
>>
>>などとして、別インスタンスのExcelに002.Xlsを開く方法
>
>この使い方、
>CreateObject("excel.application")
>いいですね。

これを踏まえて、BeforeCloseではなくてAuto_Closeで試してみました。

Sub Auto_Close()
  '標準モジュールに書きます。
  '上書きしない
  ThisWorkbook.Saved = True
  '開くかどうかの分岐
  If MsgBox("002を開きますか?", vbYesNo) = vbYes Then
   With CreateObject("excel.application")
     .Visible = True
     .Workbooks.Open ThisWorkbook.Path & "\002.xls"
   End With
  End If
End Sub

これでうまくいきましたが、XL2003とXL2007が同居している私のPCでは、001.xlsをXL2003で開いていても、実行したら002.xlsがXL2007で開くというちょっと微妙な結果になりましたw

4224 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free