[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Auto_Openで複数ブックの右クリックメニューに増えない、Auto_Closeで消えない』(はるき)
みなさんよろしくお願いします。
任意のブック(Book1.xlsx)を開いた状態でマクロ入りブック(MBook1.xlsm)を開くことで
フォームだけが前面に出てブック本体は最小化し、フォームからの入力をBook1.xlsxに反映させられるものを作成中です。
現在Book1.xlsxのみ開いた状態ではそれが実現できていますが、複数のブックが開いた状態では問題が発生してしまいます。
今のところ主な問題は2つです。
1.複数ブックを開いた状態でMBook1.xlsmを開くと、アクティブなブックにだけしか右クリックメニューに追加されない
MBook1.xlsmを起動すると、Auto_Openマクロで右クリックメニューにフォームを起動するメニューを
追加するように設定していますが、複数ブックを開いた状態でMBook1.xlsmを起動すると
そのときアクティブだったブックの右クリックメニューにしかメニューが追加されません。
これをすべてのブックに追加するようにしたいです。
2.MBook1.xlsmを閉じても右クリックメニューにフォーム起動メニューが残っている
MBook1.xlsmを閉じるときにAuto_Closeで右クリックメニューからフォーム起動メニューを削除するようにしていますが
MBook1.xlsm起動後に新たなブックを開くと(ここにはフォーム起動メニューが追加されています)
新たに開いたブックからはフォーム起動メニューが消えてくれません。
また、MBook1.xlsmを閉じたはずなのに右クリックメニューからフォーム起動メニューを選択すると
フォームが起動し正常動作します(MBook1.xlsmが再び起動します)。
MBook1.xlsmを閉じたら開いているすべてのブックの右クリックメニューからフォーム起動メニューを消したいです。
実は他にも問題が発生中なのですが、再現性があるのがこの2つです。
(右クリックメニューからフォーム起動メニューが消えてしまったり、
閉じたはずのMBook1.xlsmが見た目では消えているのに残っていて再び起動しようとしたときにActivate扱いになりAuto_Openが働かない、など)
他にもお気づきの点がありましたらご指摘お願いします。
ちなみに右クリックメニューから起動にしているのは、
こうすることでアクティブウィンドウの下に隠れてしまうことを防げたからです。
起動時と終了時のマクロは以下の通りです。
(MBook1.xlsmのThisWorkbook)
Private Sub Workbook_WindowActivate(ByVal Wn As Window) If Workbooks.Count = 1 Then Application.Quit Else Windows(ThisWorkbook.Name).WindowState = xlMinimized End If End Sub
(MBook1.xlsmのModule1(抜粋))
Sub フォーム表示() DrawingForm.Show (vbModeless) Windows(ThisWorkbook.Name).WindowState = xlMinimized End Sub
Sub Auto_Open() Windows(ThisWorkbook.Name).WindowState = xlMinimized Call AddMenu If Workbooks.Count = 1 Then MsgBox "「罫線ユーティリティ」だけを開くことはできません" & vbCrLf & "他のブックを開いてから起動させてください", vbInformation, "罫線ユーティリティ 起動エラー" Else MsgBox "右クリックメニューから「罫線ユーティリティ」を起動させてください", , "罫線ユーティリティ" End If End Sub
Sub Auto_Close() Dim cmdb_ctrl As CommandBarControl For Each cmdb_ctrl In Application.CommandBars("Cell").Controls With cmdb_ctrl If .Caption = "罫線ユーティリティ" Then .Delete End With Next cmdb_ctrl End Sub
Sub AddMenu() Dim cmdb_ctrl As CommandBarControl For Each cmdb_ctrl In Application.CommandBars("Cell").Controls With cmdb_ctrl If .Caption = "罫線ユーティリティ" Then Exit Sub End With Next cmdb_ctrl With Application.CommandBars("Cell").Controls.Add(before:=1) .Caption = "罫線ユーティリティ" .OnAction = "フォーム表示" End With End Sub
どうぞよろしくお願いします。
※この内容を記したあと、AddMenuマクロをFor each wb in workbooksで各ブックの右クリックメニューを指定するとどうなるか調べてみました。
Sub AddMenu() Dim cmdb_ctrl As CommandBarControl, wb As Workbook, a As Boolean For Each wb In Workbooks For Each cmdb_ctrl In wb.Application.CommandBars("Cell").Controls With cmdb_ctrl If .Caption = "罫線ユーティリティ" Then a = True End With Next cmdb_ctrl Debug.Print wb.Name; a If a <> True Then With wb.Application.CommandBars("Cell").Controls.Add(before:=1) .Caption = "罫線ユーティリティ" .OnAction = "フォーム表示" End With End If a = False Next wb End Sub
の結果(イミディエイトウィンドウ)
Book1 False Book2 True Book3 True
という処理になっていましたが、実際右クリックメニューを見るとBook3のみメニューが追加されていました。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
回答ではありませんが
コマンドバーのメニューは 状況依存で、コロコロ変わります 試しにこんなコードを走らせてみてください いろいろわかるかもです
Sub test() Dim cmdb_ctrl As CommandBarControl For Each cmdb_ctrl In Application.CommandBars("Cell").Controls With cmdb_ctrl Debug.Print .Index, .Caption, .Visible, .Enabled, .BuiltIn End With Next cmdb_ctrl End Sub
(渡辺ひかる) 2019/10/03(木) 12:16
さっそくやってみたところ、Book3だけこれが追加されていました。
(余分なスペースは省きました)
1 罫線ユーティリティ True True False
Book1とBook2にはありませんでした。
また、もう一つわかったことがあるので報告します。
「罫線ユーティリティ」が追加されるのは、MBook1.xlsmを実行したときにアクティブだったブックだけでした。
Book1がアクティブの時はBook1のみ
Book2がアクティブの時はBook2のみ
Book3がアクティブの時はBook3のみ
です。
いずれの場合も
1 罫線ユーティリティ True True False はメニューに追加されたブックのみ加わります。
ただ、どの場合でもイミディエイトウィンドウは
Book1 False Book2 True Book3 True です。 (はるき) 2019/10/03(木) 13:22
結果だけで評価しないで、私ならF8ステップ実行で地道にチェックしてるけど、 なんで、こういうことをしないんですかね?
あてずっぽうだけれど、CommandBars("Cell")って2つあるのご存知ですか? (2007以降は調べた事がないけど、2003以前と同じだと思う。) また、条件付き書式の使用は? 全て記憶だけで書いてますので、外れてたらすみません。 (BJ) 2019/10/03(木) 14:06
一部BJさんと被りましたが・・
私の予想では、メニューは追加されていて非表示になっているだけではないかなと思ったのですが そうでもなさそうですね。
>「罫線ユーティリティ」が追加されるのは、MBook1.xlsmを実行したときにアクティブだったブックだけでした。
試してみていただきたいのですが メニューを追加するときに そのブックをActivate してから 追加したらどうなるでしょう?
話は飛びますがこんなコードを実行すると
Sub test2() Dim mycb As CommandBar
For Each mycb In Application.CommandBars With mycb If .Name = "Cell" Then Debug.Print .Index, .Name End If End With Next
End Sub
下記のように2つ表示されます
35 Cell 38 Cell
また 理由がよくわかりませんが オブジェクトを比較すると 理解困難な結果になります 複数のブックを開いておいて
Sub test3()
Debug.Print Workbooks(1) Is Workbooks(1) 'True
Debug.Print Workbooks(1).Application Is Workbooks(2).Application 'True
Debug.Print Workbooks(1).Application.CommandBars("Cell") Is _ Workbooks(1).Application.CommandBars("Cell") 'False
Debug.Print Workbooks(1).Application.CommandBars("Cell") Is _ Workbooks(2).Application.CommandBars("Cell") 'False
Debug.Print Application.CommandBars("Cell") Is _ Application.CommandBars("Cell") 'False End Sub
3番目以降もTrueになりそうなものですが、Falseになります。 indexを直接指定しても同様な結果です リボンになってから、コマンドバーはほとんどいじっていませんが、 メニューを追加するにはxmlファイルを使用するのが推奨されているようです。
(渡辺ひかる) 2019/10/03(木) 14:22
渡辺ひかるさんのアドバイスのとおり、それぞれのシートをその都度アクティブにすることで
すべてのシートの右クリックメニューに追加、抹消が実現できました。
本当に助かりました。ありがとうございました!
また壁に当たってしまったら相談しに来たいと思いますので、そのときはまたよろしくお願いします。
(はるき) 2019/10/03(木) 15:17
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.