[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『他のブックのマクロを実行させる時...』(Hoy)
ワークブックモジュールに他のブックを開き そのブックのマクロを実行させるコードを入れているのですが、 ブックを閉じるところでうまくいきません。 何か回避する方法を教えていただけますでしょうか?
↓ワークブックに入っているモジュールです。 Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim MyPath As String, NPath As String, MyFlag As Boolean Dim MyFile As Object, MyBk As String
If MsgBox("メインメニューへ戻りますか?", vbQuestion + vbYesNo + _ vbDefaultButton1, "確認...") = vbNo Then MsgBox "日報業務を終了します..." Exit Sub Else
MyPath = ThisWorkbook.Path NPath = Mid(MyPath, 1, Len(MyPath) - 6) MyBk = ファイル名です。
MyFlag = False For Each MyFile In Windows If MyFile.Caption = MyBk & ".xls" Then MyFlag = True Next MyFile
If MyFlag = False Then
MsgBox "メインメニューへ戻ります..."
Workbooks.Open (NPath & "\" & MyBk & ".xls")
End If
Application.Run "'" & MyBk & ".xls'!auto_open"
ThisWorkbook.Close (True) ↑ここでもう一度閉じると認識してしまうらしく 最初のメッセージボックスが出てしまいます。 End If End Sub
こんばんは! >Private Sub Workbook_BeforeClose(Cancel As Boolean) って閉じる前に勝手に発生するイベントだから >ThisWorkbook.Close (True) は、いらないんじゃないの??? あっ、失礼!↓で分岐してるのかな? >If MsgBox("メインメニューへ戻りますか?", それなら、どこか違うコードで 「閉じますか?」 と聞いて 「はい」なら閉じて そうでなければ戻ればいいんじゃないの? よくわかってなかったら、ごめんちゃいです。m(__)m (SoulMan)
これが、いいかどうかわからなけど、こんな感じでどうでしょう? Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) Cancel = True If vbYes = MsgBox("閉じますか", vbYesNo) Then Cancel = False MsgBox "閉じます" End If End Sub 直接は関係ないかもしれないけど、参考までに載せておきます。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html (SoulMan)
SoulManさんありがとうございます。 確認遅くなってしまって申し訳ございませんでした。
参考にさせていただきます。ちょっとお返事遅くなってしまうと 思いますが必ず結果報告いたします。
(Hoy)
大変遅くなりました。 いろいろと試してみたのですが...
え〜、どちらにしてもブックを閉じるイベントの入ってる ブックは閉じます。
そのまま閉じるか他のブック(メインメニュー)を開いてマクロを実行させてから 閉じるかのIF分岐をしたかったのです。 どうしても他のブックを開いた後に閉じる処理を入れると もう一回"メインメニューへ・・・"のMsgBoxが出てきてしまいます。 どうすればよいでしょうか?
(Hoy)
>後に閉じる処理を入れると 入れなければ、いいんじゃないんですか? Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) Cancel = True If vbYes = MsgBox("閉じますか", vbYesNo) Then Cancel = False MsgBox "閉じます" Else '他のBookのマクロ・・・・ Cancel = False MsgBox "閉じます" End If End Sub (SoulMan)
ウーンo(;-_-メ;)o
少し分かりました。参考に出していただいた CloseとQuit の違いですね? 少し混乱してますが...
内側の×だと閉じました。 外側の×だと閉じません...(なので自分は閉じる処理を入れました。)
ファイルを使う人ほとんどが外側の×をクリックすると思うのですが、 そうすると閉じないのですよね? それとも何か組み合わせて思い通りに いきますでしょうか?
分かりにくい表現でスイマセン。
(Hoy)
> 内側の× > 外側の× どちらのボタンでもブックを閉じることになるので、closeイベントは発生します。 (INA)
INAさん ありがとうございます。
Closeイベントにはどんな処理を入れようとそのブックは閉じるはずですよね? ところが外側の×ボタンだと閉じないのです... IFのコードなど削除して他のブックを開くだけの処理(Workbooks.Open)を残しても 元のブックが閉じないのですが...?
(Hoy)
一度、 ●Private Sub Workbook_BeforeClose(Cancel As Boolean) ↑ここにブレイクポイントを設定して動きをF8で追っかけてみてはどうでしょうか? なんか、それが一番近道の様な気がします。 (SoulMan)
>Closeイベントにはどんな処理を入れようとそのブックは閉じるはずですよね? いいえ。 cancel = True を書くと閉じません。
> Application.Run "'" & MyBk & ".xls'!auto_open" thisworkbookのopenイベントを使えば、RUNメソッドすることないのでは? このauto_openで何かしているのでは? runしなければ問題なし?
(INA)
> ブレイクポイントを設定して動きをF8で追っかけて〜 問題なく End Sub まで行きます
auto_openは標準モジュールです。 thisworkbookのopenイベントに変えてみましたが、 runしなくても変わりませんでした...
auto_openではユーザーフォームを表示するだけです。 Userform1.Show vbMordless
(Hoy)
Quit(外の×) した後に 別のBookをOpenしているから、 Excelが終了できないんじゃないでしょうか? 別のBookもCloseしたらどうなりますか? (SoulMan)
> 別のBookもCloseしたらどうなりますか? ○ 別のBookの内側の×で閉じる ⇒ 元のブックは開いたまま残っている ○ 別のBookの外側の×で閉じる ⇒ 元のブックのCloseイベントが発生するが 両方のブックが閉じる ということでしょうか? (Hoy)
こんな感じでどでしょう? Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "Book2.xls" ActiveWorkbook.Close End Sub (SoulMan)
SoulManさんの説明で理解できました。 (INA)
(_ _,)/~~白旗〜 すいません。理解できません... 両方閉じてしまいますよね...? (Hoy)
えっ、最終的に両方閉じたいんじゃないんですか? 上の私のコードでわかる様に ActiveWorkbook.Close これをコメントすると終わりませんよね? つまり、終了しようとしてるのにOpenしている。。。 あっ、それなら、開いてるBookの数を数えて 自分だけっだたら・・○○して ふたっつ開いていたら、パスするとにかにしたらどうでしょうか? (SoulMan)
説明下手で申し訳ございません。 やりたいことは、「あっちを開いてこっちを閉じる」というような事です。
まずauto_openのブックにはユーザーフォームにいくつかコマンドボタンが あってそれぞれのボタンで他のブックが開くようになってます。 (最初に書いたようなコードがそのコマンドボタンに入っています) その開いたブックでの作業が終了したら、またメインメニューである auto_openのブックを開きたかったので、BeforeCloseイベントで その処理をしようと思いました。 (インターネットをイメージしていただければ...?)
コマンドボタンをひとつ作成してそこからしか終了できないようにすれば できるのですが、たいてい終わったら×のボタンで閉じるかな?と思い BeforeCloseでやってみたのですが、前記のとおり引っかかってしまって...
> つまり、終了しようとしてるのにOpenしている。。。 この辺でやはり難しいのでしょうか? 結局閉じる処理を入れてしまうと、Closeイベントが発生してしまうわけですよね?
もう一度・・・説明下手でゴメンナサイです...m(..)m スンマセン (Hoy)
最後の自分で自分を閉じるところを ↓に変えたら、、どうなりますか? Application.EnableEvents = False ThisWorkbook.Close Application.EnableEvents = True え〜〜っと、解決しましたか?? なんだかんだと引っ張ってしまったけど、こんな感じじゃないでしょうか? Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim MyPath As String, NPath As String, MyFlag As Boolean Dim MyFile As Object, MyBk As String If MsgBox("メインメニューへ戻りますか?", vbQuestion + vbYesNo + _ vbDefaultButton1, "確認...") = vbNo Then MsgBox "日報業務を終了します..." Exit Sub Else MyPath = ThisWorkbook.Path ' NPath = Mid(MyPath, 1, Len(MyPath) - 6) MyBk = "Book2" MyFlag = False For Each MyFile In Windows If MyFile.Caption = MyBk & ".xls" Then MyFlag = True Next MyFile If MyFlag = False Then MsgBox "メインメニューへ戻ります..." Workbooks.Open (MyPath & "\" & MyBk & ".xls") End If ' Application.Run "'" & MyBk & ".xls'!auto_open" Application.EnableEvents = False ThisWorkbook.Close (True) Application.EnableEvents = True '↑ここでもう一度閉じると認識してしまうらしく '最初のメッセージボックスが出てしまいます。 End If End Sub (SoulMan)
> ファイルを使う人ほとんどが外側の×をクリックすると思う そもそも↑の考え方が間違えてる。
アプリケーションを終了したいときは、外側の× を、 ブックを閉じたいときは、内側の× を使うもの。
WindowsにおけるMDIアプリの基本です。 (INA)
というかぁ、、私なんかは、言われるまで、ずっと ファイル→閉じる、、としてましたから、 へぇ〜〜っ、、そうなんだぁ、、っと思いました。(;^_^A あせあせ・・・ (SoulMan)
おはようございます。 遅くなりました。 アプリケーションとブックの関係、混乱しそうですが... 勉強していきたいと思います。 いままでの習慣というか、何か作業が終わったら外側の×で閉じることが 当たり前のように思っていました。でも会社の他のファイルを使う人に説明するのは とても困難だと思うので、出来るだけ詳しくない多くの人が、 なにげなく操作してしまうであろうという前提で作っていきたいと思うのですが...。
SoulManさんのでほぼうまくいきました、ありがとうございました。 何故でしょうか?2回目はCloseイベントが発生しません... つまり開いたファイルのユーザーフォームから再度元に戻ると 今度閉じた時にはすべてが終了してしますのです。 こんな処理はやらない方がよいでしょうか? (Hoy)
基本的に「閉じる」ことと「終了」とは違うと思うんだけど、どうでしょう? それから私の感想だけど、私なら、「しない」と思います。 メインメニューがどんなものか分からないけど、 そのユーザーフォームにメニューを作ると思います。 ファイルを「終了する」とか「閉じる」とかは操作する人に任せた方がいいんじゃないでしょうか? 操作する人が終了するって言ってるのに、それを「○○しますか?」って言ったって仕方ないんじゃないでしょうか? もう少し作業?流れを見直してみてはどうですか? 終了は終了、メインメニューに戻りたければ、デスクトップのシュートカットをダブルクリックすればいいわけだし・・? どうかな?他の方の意見も待ってみましょう。 (SoulMan)
そうですよね、戻りたかったら戻るようにしてあげればよいのですよね。 ちょっと見直してみます... SoulManさん、INAさん、理解力に乏しい自分にお付き合いいただき ありがとうございました。 (Hoy)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.