[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『他のワークブックを開いた際に、Private Sub Workbook_Open()でエラーが出た場合、メインを止めたい』(ろでます)
こんにちわ、ろでますです。
度々失礼いたします。
表題に書いた通り、例えばA.xlsmからWorkBooks.OpenでB.xlsmを開いた際に、B.xlsmの
Private Sub Workbook_Open()
内でエラーが出た場合、
A.xlsm自体の処理を止めることはできないでしょか。
例として以下のようなマクロを作ってみたのですが、上手くいきません。
A.xlsm
Sub test()
Dim FG As Boolean FG = Application.Run(Workbooks.Open("C:\B.xlsm")) If FG = False Then MsgBox "NG" Exit Sub End If
End Sub
B.xlsmのThisworkbookモジュール
Private Sub Workbook_Open()
If Sheet1.Range("A1") = 1 Then MsgBox "OK" Else MsgBox "NG" Exit Sub End If
End Sub
このマクロだと、B.xlsmのExit SubもしくはEnd Subの部分で実行時エラー438
「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
とエラーが出ます。
もし、Private Sub Workbook_Open()がBoolean形式で返り値としてFalseを返せるのであればうまくいくかもしれませんが・・・。そんなことはできるのでしょうか・・・。
すいませんが何か良いアドバイスがございましたら、ご教授のほどをよろしくお願い申し上げます。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
B.xlsm の Workbook_Open がエラーの場合、B.xlsm が閉じるようになっていれば
A.xlsm で、B.xlsm が開いているかどうかチェックすればいいのでは?
(ウッシ) 2014/11/18(火) 16:24
コメントありがとうございます。
すぐに、「なるほど」と理解できるスキルがありませんので、その方向でためしのマクロを組んでます。
また、上手くいきませんでしたら、再度アドバイスのほどをお願い申し上げます。
(ろでます) 2014/11/18(火) 16:28
私のスキル不足だとは思いますが、b.xlsmを以下のように変更してみました。
Private Sub Workbook_Open()
If Sheet1.Range("A1") = 1 Then MsgBox "OK" Else MsgBox "NG" Thisworkbook.Close End If End Sub
こうしてしまうと、問題がありました。
問題は、b.xlsmを直接開いたときに、Range("A1")の値が1以外の場合、もうb.xlsmを開けないということです。
すいません、私のスキルで解決できればよいのですが・・・。
申し訳ございません。
(ろでます) 2014/11/18(火) 16:59
'Aブック側(開く側)の標準モジュール Sub test() Dim WB As Workbook Set WB = Workbooks.Open("C:\エクセルの学校\ろでます\Bブック.xlsm") If WB.flg = False Then MsgBox "開いた先のブックでエラーが発生しました" End Sub
'Bブック(開かれる側)のThisWorkbookモジュール Public flg As Boolean Private Sub Workbook_Open() On Error Resume Next flg = True Err.Raise 1 If Err > 0 Then flg = False On Error GoTo 0 End Sub
これじゃだめなんですか? 結構前にろでますさんのスレッド(だと思った)でichinoseさんに教わった、 Application.Run以外で別のブックのプロシージャを呼出す方法をそのまま活用しました。 (稲葉) 2014/11/18(火) 19:03
案1 b.xlsmの開いた時に実行するマクロを ThisworkbookのWorkbook_Openイベントで行うのを止めて 標準モジュールの Auto_Openで行う Function auto_open() If Sheet1.Range("A1") = 1 Then auto_open = True MsgBox "OK" Else auto_open = False MsgBox "NG" End If End Function a.xlsmでは、 Sub test() Dim bk As Workbook Dim ret As Variant Set bk = Workbooks.Open(ThisWorkbook.Path & "\b.xlsm") ret = Application.Run(bk.Name & "!auto_open") If ret = False Then Exit Sub End If MsgBox "good" End Sub 案2 thisworkbookにWorkbook_Openの実行ステータスを表すプロパティを作成し、これを監視する 案1が簡単だと思いますよ
(ichinose) 2014/11/18(火) 19:25
稲葉さんの投稿(案2)で問題ないですね!!イベントのタイミングが心配だったので、試さずに に投稿しました。失礼しました。
(ichinose) 2014/11/19(水) 05:12
言いわけです。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=64189;id=excel
以前↑こんなスレッドに参加したことがありました。
ここでは、End Withが問題でしたが、 YU-TANGさんの投稿で意図しないタイミングでイベントが発生する場合もあるんだ
ということを体験しました。
これが頭のどこかにあったので プロシジャーで呼び出す方が確実かな という意味の投稿でした。
(ichinose) 2014/11/19(水) 06:09
ichinoseさんの案1の方が >問題は、b.xlsmを直接開いたときに、Range("A1")の値が1以外の場合、もうb.xlsmを開けないということです。 ろでますさんのこちらの疑問を解決するには最適ですね!
Withステートメントについてありがとうございます。 >End Withでオブジェクトを開放する場合としない場合が存在する いつも「何となく」ループの外側で置いているWithについて一度も検証したことが無かったので 大変勉強になりました。 (稲葉) 2014/11/19(水) 08:46
>ichinose様
>稲葉様
コメントありがとうございます。
昨日は一日別件で席を空けていましたので、コメントをすることができませんでした。
申し訳ございません。
本日朝から、いただいたコメントを参照にじっくりご検討・検証をさせていただきます。
ありがとうざいます!
(ろでます) 2014/11/20(木) 09:17
a,xlsm
Sub test()
Dim WB As Workbook Set WB = Workbooks.Open("C:\b.xlsm") If WB.flg = False Then MsgBox "開いた先のブックでエラーが発生しました" End Sub
b.xlsm
Public flg As Boolean
Private Sub Workbook_Open()
If Range("A1") = 1 Then flg = True Exit Sub Else flg = False End If End Sub
大変簡素なマクロなのですが、これでもうまく動作はしてくれました。
なので、ブック間で、flgという変数(プロパティ?)を渡せるのであれば、これでもいいのかなと思ってしまいました。
すいません、なぜエラー処理を入れているのかが私では理解できませんでした(ダメダメすぎる・・・)
初歩的過ぎて大変失礼かとは存じ上げますが、よろしければご教授いただけませんでしょうか。
(ろでます) 2014/11/20(木) 10:33
>Private Sub Workbook_Open() >内でエラーが出た場合、 って言ってたからエラーRaiseしただけなんだけど・・・ (稲葉) 2014/11/20(木) 10:44
すいません、確かにおっしゃる通りですね。
自分で自分の言葉の矛盾に気づきました。
どうも申し訳ございません。
(ろでます) 2014/11/20(木) 11:00
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.