『新規シートにマクロをマクロで記述(ユーザーフォームを含む)』(TKG) 初めて質問させて頂きます. こちらには幾度か訪問させて頂き,大変ありがたく思っています. この度,どうしても解決の糸口がつかめない問題が生じましたので,ご助力頂ければと思います. 現在,あるマクロ(仮にマクロAとします)の中にユーザーフォームが2つあります.1つはそのマクロAの中で役目を果たし,unloadされています.もう1つのユーザーフォームですが,このマクロAによって作成されたシート内にあるグラフを操作するもので,そのシートに常駐させておきたいです.(マクロAによって各シートにグラフは1つ作成されています.) ここで問題なのが,シートを移動した時,そのシートにあるユーザーフォームをHideさせ,移動先のシートで別のユーザーフォーム(この場合オブジェクト名などが異なるだけで実行内容は同じですが)をShowさせるということが可能なのは調べて分かったのですが,それは既存のシートに対してイベントプロシージャを設定しなければなりません. 今回,新規で作成したシートにユーザーフォーム,その実行内容のマクロ,そのシートにactivateプロシージャ及びdeactivateプロシージャ(ユーザーフォームをshow/hideするための),移動元シートにactivate/deactivateプロシージャをマクロAによって作成したいです.(新規シートはマクロAによって作成されているため,一括にしたいのです...) マクロをマクロで記述することが可能なのは調べていてなんとなくわかったのですが,まだ理解不足なのでこちらも併せて,マクロによって新規で作成されるシートに対してユーザーフォームとマクロを設定する方法をご教授頂ければ幸いです. < 使用 Excel:Excel2016、使用 OS:Windows10 > ---- 何をしたいか全然理解せずにコメントします。 新規シートを追加ではなく、既存のシートを複製ではだめなのでしょうか。 (マナ) 2019/11/21(木) 18:56 ---- シートの複製では,複製シート用のユーザーフォームが作成されないと思うのですが... (TKG) 2019/11/22(金) 03:47 ---- >あるマクロ(仮にマクロAとします)の中にユーザーフォームが2つあります ここで言っているマクロというのは、プロシージャのことですか? モジュールのことですか? VBAProjectであれば「ユーザーフォームが中にある」というのは理解できるのですが・・ (渡辺ひかる) 2019/11/22(金) 09:46 ---- 混乱を招いて申し訳ありません. プロシージャのことを指して言っていました. プロシージャ(=マクロA)が今回作成している主体のもので,ユーザーが実行するのはこれ一つになります.このプロシージャ(Public sub)の中で同じモジュール内にある他のプロシージャ(Private sub)をCallし,同様に,同じVBAProject内にあるユーザーフォーム2つをShowしています. このプロシージャが完全に主体のため「中にある」という表現をしてしまいました. (TKG) 2019/11/22(金) 14:16 ---- 了解しました 質問者さんがやりたいことをまとめると 最初に以下がある マクロA(プロシージャ) UserForm1 UserForm2 ・UserForm1はマクロAから呼び出されUnload される ・マクロAは新規シート(シートBとします)を作成する ・マクロAはシートBにグラフを作成する ・UserForm2はシートBのグラフを操作する ・同様に作成される予定のシートC,D,E・・・がある ・シートBでグラフ操作のためにUserForm2を表示している状態で ・シートCに移動したとき、UserForm2をHideさせ、シートC用のUserForm2を表示させたい そのトリガーとして シートCにシートイベントプロシージャを書かなければならない ただしシートCもマクロAで作成されたものなので、マクロAでシートCにシートイベントプロシージャを書きたい しかも シートCの追加と同時にシートC用のUserForm2が必要となる ということでしょうかね まずはシート毎のユーザーフォームというのは非効率だと思いますので 一つのユーザーフォームを使いまわすほうが良いと思います。 シート移動のイベントですが シートモジュールに書かずとも Thisworkbookモジュールに こんなイベントプロシージャを書けばイベントを捕まえられますよ Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox Sh.Name & "がアクティブになりました" End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) MsgBox Sh.Name & "がアクティブでなくなりました" End Sub (渡辺ひかる) 2019/11/22(金) 15:24 ---- まさしくその通りです. >一つのユーザーフォームを使いまわすほうが良いと思います。 たしかにそうですね. >シート移動のイベントですが シートモジュールに書かずともThisworkbookモジュールに こちらの方法で捕まえてそのシートにあるグラフの状態を変数に入れてやればいけそうな気がしてきました. 時間を取れ次第トライしてみます! (TKG) 2019/11/23(土) 20:21