[[20141118153226]] 『他のワークブックを開いた際に、Private Sub Work』(ろでます) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『他のワークブックを開いた際に、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

こんにちわ、ろでますです。
>>Private Sub Workbook_Open()
>>内でエラーが出た場合、
>って言ってたからエラーRaiseしただけなんだけど・・・

すいません、確かにおっしゃる通りですね。
自分で自分の言葉の矛盾に気づきました。

どうも申し訳ございません。
(ろでます) 2014/11/20(木) 11:00


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.