dポイントプレゼントキャンペーン実施中!

excelのユーザーフォームのイベントではそれぞれ

Initializeイベント(フォームが表示される前)と
Activateイベント(フォームがアクティブになったとき)
のイベントがあり、フォーム上のコントロールの設定値を初期化したい際によく
Initializeイベントを使用しています。

しかし、ワークシート上にアクティブコントロールを設置し、その初期設定をそのワークシートが開いたときに設定したい場合、ワークシートではInitializeイベントがなく、Activateイベントしかないため、他のシートから遷移した場合は、このActivateイベントが発生するのですが、もともとコントロールを設置しているワークシート上で保存、そのブックを起動した際、起動したときに表示されるワークシートでは起動時にはActivateイベントは発生しません。
とりあえず、解決策としてworkbook_openイベントでScreenUpdating = false(画面線画させず)後、activesheet.nameで開いたときのアクティブシート名を変数にセットし、一時的に非表示のワークシートにactiveさせ、その後変数でセットしたワークシート名のワークシートにactiveしその後、ScreenUpdating = trueとして起動時に強引にactiveイベントを発生させています。
これ以外の簡単な方法ってないんですかね。

A 回答 (2件)

抜けていたので補足します。


Call Module1.WsActivateEvent のようにしないといけませんね
例のWsActivateEventはパブリックにする必要があるので
引数を持たせて(ダミーでOK)、ユーザーから直接実行(表示しない)できないようにする必要もあるかと思います。
すみません。
    • good
    • 0
この回答へのお礼

ありがとうございます。結局どうやってもステップ数(行数)はふえてしまいますね。
実は実際にやりたかったことといえば、各シート(複数同じシートがあるとおもってもらえば結構です。)にシートで設定した表の集計をするコマンドボタンを作って各シートほとんど同じ処理(途中一部のみシートの設定の関係上違う処理が入ります。)をしようとしました。
各シートにコマンドボタンを配置してクリック時のイベントプロシジャーを設定し、Callで流そうとしたんですが、シートによって一部処理が異なる箇所があったため、Callステートメントではやりにくいと思い、ユーザークラスモジュールを作成し、Property Set でコマンドボタンのプロパティを作成、その対応する変数にWithEventsを設定し、コマンドボタンのイベントをユーザークラスモジュールでイベントを発生させ、シートごとに違う処理をRaiseEventにてシートモジュールに記述する方式を使用しました。
この場合、シートを読み込む際、作成したクラスモジュールを使用するためNewステートメントでインスタンスを作成し、当該クラスモジュールでのプロパティにコマンドボタンをSetしなければなりません。しかし、このインスタンス作成等をActiveイベントにて設定をしたら、起動時のみこのActiveイベントが発生しなかったので強制的にActiveイベントを起こしたのですが・・・
シートクラスモジュールではシートに設定してあるコマンドボタンはMe.コマンドボタン名で設定しやすいですしね・・
教えていただいたやり方はActiveイベント内処理をCallにてジェネラルプロシジャーに実行させ、同様にWorkBooks_Open時にCallにて同じ処理をするということですね・・・
まあ、どっちもありかな?と思います。しかし、ユーザーフォームと同様なんでシート読み込み時にInitializeイベントないんだろ。

お礼日時:2020/07/23 17:25

こんばんは、


ブックを開いた時のWorksheet_Activateを使いたいと言う事でしょうか?

的外れの回答かも知れませんが、Worksheet_Activateは引数を持っていないと思いますので、(引数を持っていても同じ)
イベントに書かれているコードを標準モジュールに書きます。
例えば
Sub WsActivateEvent()
hogehoge
End sub

Private Sub Workbook_Open()
Call WsActivateEvent
End Sub

Private Sub Worksheet_Activate()
Call WsActivateEvent
End Sub

この様にすれば処理は、Workbook_Open実行時に直接WsActivateEventを実行出来ると思います。(Worksheet_Activateからも)
ただし、WsActivateEvent 内のコードでActive~の使用は出来るだけ止め各オブジェクトを明示した方が良いかも知れません。
WsActivateEventに引数を持たせればOpenから呼んだ時とWorksheet_Activateから呼んだ時の実行を分ける事も出来るかと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A