- PR -

excelメニュー

1
投稿者投稿内容
スンパ
ベテラン
会議室デビュー日: 2005/05/23
投稿数: 85
投稿日時: 2006-04-24 19:43
質問させていただきます。


A.xls、B.xlsファイルがあります。

A.xlsには

Private Sub Workbook_Open()

With Application.CommandBars("worksheet menu bar")
On Error Resume Next
.Controls("メニュー(&T)").Delete

With .Controls.Add(Type:=msoControlPopup, Temporary:=True)
.FaceId = 59
.BeginGroup = True
.Caption = "メニュー(&T)"


With .Controls.Add(Type:=msoControlButton, Temporary:=True)
.Caption = "テスト用"
.OnAction = "SubTest"
End With

End With

End With

Exit Sub

End Sub



Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.CommandBars("Worksheet Menu Bar").Controls("メニュー(&L)").Delete
End Sub

のマクロを書いてます。

A.xlsをOPEN時、メニューを作って、Closeするとき、メニューをクリアする処理です。
B.xlsにはなんにも書いていません。(マクロありません)

たとえば、A.xlsとB.xlsをひとつのExcelアプリケーションで両方開いている際、
(当然Excelアプリケージョンにはメニューが作られている状態)
Excelアプリケージョンを閉じよう「x」をクリックすると、変更確認(はい、いいえ、キャンセル)ダイアログボックスが出てくる前に、上記のWorkbook_BeforeCloseが実行されてしまい、メニューがクリアされてしまいます。
変更確認画面でキャンセルを選択することも考えられるので、この動きではまずいです。


宜しくお願い致します
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-24 20:07
引用:

スンちゃんパパさんの書き込み (2006-04-24 19:43) より:

Excelアプリケージョンを閉じよう「x」をクリックすると、変更確認(はい、いいえ、キャンセル)ダイアログボックスが出てくる前に、上記のWorkbook_BeforeCloseが実行されてしまい、メニューがクリアされてしまいます。
変更確認画面でキャンセルを選択することも考えられるので、この動きではまずいです。


自前のメッセージを BeforeClose イベントに書き、
[はい] の場合のみ BeforeClose イベントを続行。
それ以外の場合は、Cancel = True。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
スンパ
ベテラン
会議室デビュー日: 2005/05/23
投稿数: 85
投稿日時: 2006-04-24 22:48
じゃんぬねっと様

ご返答ありがとうございます。

すみません。
説明が不十分だったようです。

引用:
-------------------------------------------------------------------------------

Excelアプリケージョンを閉じよう「x」をクリックすると、変更確認(はい、いいえ、キャンセル)ダイアログボックスが出てくる前に、上記のWorkbook_BeforeCloseが実行されてしまい、メニューがクリアされてしまいます。
変更確認画面でキャンセルを選択することも考えられるので、この動きではまずいです。
-------------------------------------------------------------------------------

ここで言う変更確認ダイアログボックスは、A.xls または B.xlsに何らかの編集をしたあと、閉じようとして出てくるもので、Excelアプリケーションが出しているものです。

私が書いたコードではありません。
この場合でも、はい、いいえ、キャンセルのRETURN値を拾えるんでしょうか?

拾えるなら、こんな感じになると思いますが、、

Private Sub Workbook_BeforeClose(Cancel As Boolean)

if (???=vbyes) or (???=vbno) then
Application.CommandBars("Worksheet Menu Bar").Controls("メニュー(&L)").Delete
else
cancel =true
endif
End Sub

if行の部分、どうなりますか?
もう一度お願いいたします。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-04-25 00:55
引用:
コード:
if (???=vbyes) or (???=vbno) then
Application.CommandBars("Worksheet Menu Bar").Controls("メニュー(&L)").Delete
else
cancel =true
endif
End Sub




この前に、自分で Msgbox 出せばいいだけでしょう。
ちなみに、Excel が出す変更確認 dialog は、BeforeClose event が発生した後に
実行されるので、戻り値が取得できるわけがありません。
# だから、BeforeClose なんですが・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-25 07:59
引用:

スンちゃんパパさんの書き込み (2006-04-24 22:48) より:

すみません。
説明が不十分だったようです。


大丈夫です、説明は十分だったと思います。

引用:

ここで言う変更確認ダイアログボックスは、A.xls または B.xlsに何らかの編集をしたあと、閉じようとして出てくるもので、Excelアプリケーションが出しているものです。
私が書いたコードではありません。


これは、最初のご投稿で把握しております。

引用:

この場合でも、はい、いいえ、キャンセルのRETURN値を拾えるんでしょうか?
拾えるなら、こんな感じになると思いますが、、


私は Excel から出されるダイアログ ボックスではなく、

> > 自前のメッセージを BeforeClose イベントに書き

と言っていますので、下記のようになります。(下記のような意味です)

コード:

    Private Sub Workbook_BeforeClose(ByRef Cancel As Boolean)
        If MsgBox("ここで確認すれば良いことは、わかりましたか?", vbYesNo Or vbQuestion) = vbNo Then
            Cancel = True
            Exit Sub
        End If

        Application.CommandBars("Worksheet Menu Bar").Controls("メニュー(&L)").Delete

        ' TODO : ここで DisplayAlert を False にするか、
        '        自前で保存する内容を書くことで既定のダイアログを回避する
    End Sub


すみません。
どちらかと言えば、私の説明が不十分だったようです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
スンパ
ベテラン
会議室デビュー日: 2005/05/23
投稿数: 85
投稿日時: 2006-04-25 10:36
じゃんぬねっと様

いつも親切なご返事感謝しております。

引用:
------------------------------------------------------------------------------
すみません。
どちらかと言えば、私の説明が不十分だったようです。
-------------------------------------------------------------------------------

いいえ、こちらがちゃんと読んでいないし、理解が足りなかったです。

有り難うございます。
1

スキルアップ/キャリアアップ(JOB@IT)