前回、実施した「Application.ScreenUpdating」と「Application.Calculation」の設定を行うとマクロの実行を行うと約半分くらいの時間(検証結果)でできるようになりました。
今回は残りの2つのコードを記載していきたいとおもいます。
前回と同様に検証をしながら実施していけたらいいなと思っています。
今回は高速化を行うというよりは、ポップアップが出ないようにするコードなので、時間が半分になるというより、マクロを実行しても止まらないようにするという感じになります。
【Excel VBAマクロを実行するための初期設定】(5回目)
1. 「Application.EnableEvents」の説明と事前準備
「Application.EnableEvents」の説明を行いたいと思います。
「Application.EnableEvents」は、イベント画面を制御するためのマクロになります。
まずは「Application.EnableEvents」を実行していないときの画面を止めない動きを試していきたいと思います。
読んでいる方にも、実行していただけるようにコードも合わせて記載させていただきます。
1-1. ①マクロを任意の場所に保存
今作っているマクロを任意の場所に保存します。
(これからテストで使用するためのものなので場所はどこでも大丈夫です)
保存するときは拡張子「xlsm」としてください。
拡張子を「xlsm」にしないと、今まで書いていたコードがすべて消えてしまうので注意です。
1-10. ⑩マクロの編集画面が出力されます。
マクロの編集画面が出力されます。
[補足]マクロの実行が終わり、マクロを知らない人がこの画面になると困ってしまいますので、このイベント画面を出力しないように、今から実施していきたいとおもいます。
また、今回はわかりやすくするため例としてあげていますが、これ以外にもシートを移動した時やセルに追記等する時など場面は色々あります。
1-2. ②ファイルをコピーして同じ場所に格納
①で作成したファイルをコピーして同じ場所に格納します。
1-3. ③ファイルを開く
「新規 Microsoft Excel ワークシート.xlsm」を開いてください。
1-4. ④マクロボタンを作成
前回実施したマクロボタンを作成します。
(ファイルを開いたときにマクロが無効にされました。
「コンテンツの有効化」ボタンが出力されていたら、「コンテンツの有効化」をクリックしてください)
テストを実施するだけなので、ボタンはそのままにしています。
右クリックし、「マクロの登録」-「編集」をクリックします。
1-5. ⑤選択した部分をクリア
「Dim」から「Next」までの選択した部分をクリアします。
1-6. ⑥コメントにする
「Application.Calculation = xlCalculationManual」と「Application.Calculation = xlCalculationAutomatic」は、コメントにしてください。
1-7. ⑦コードを入力
Workbooks.Open Filename:="フルパス¥新規 Microsoft Excel ワークシート - コピー.xlsm"
フルパスはファイルを右クリックし、「パスのコピー」で取得できます。
パスコピーがない場合は「赤枠」を右クリックし、「アドレスのコピー」にてパスをコピーできます。
1-8. ⑧マクロ画面を閉じて、「ボタン1」をクリック
書き終わったら、マクロ画面は「×」で閉じて、「ボタン1」をクリックします。
(マクロの画面は必ず閉じてください)
1-9. ⑨ボタンをクリック
いつものように実行時間が出力されますので、「OK」ボタンをクリックしてください。
2. 「Application.EnableEvents」の作成
次に「Application.EnableEvents」を書いていきます。
2-1. ①コードを書く
次に「Application.Calculation = xlCalculationAutomatic」のすぐ下に「Application.EnableEvents = True」のコードを書きます。
「Application.EnableEvents = False」は、イベント停止です。
「Application.EnableEvents = True」は、イベント開始です。
先ほどのコードに書いていきます。
(書き終わったら、先ほど同様、「×」ボタンでマクロの画面は閉じてください)
Option Explicit
Sub ボタン1_Click()
Dim st As Double, et As Double
st = Timer
'Application.ScreenUpdating = False
'Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Workbooks.Open Filename:="フルパス¥\新規 Microsoft Excel ワークシート - コピー.xlsm"
et = Timer - st
MsgBox et
'Application.ScreenUpdating = True
'Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
2-2. ②「ボタン1」をクリックします
書き終わったら、「ボタン1」をクリックします。
2-3. ③実行時間が出力される
先ほど同様に実行時間が出力されますので、「OK」ボタンをクリックしてください。
2-4. ④コピーしたファイルが出力される
「OK」後は、先ほどと違いコピーしたファイルが画面に出力されます。
(マクロ画面が出力されていないことを確認してください)
3. 【最後に】
本来はTrueにすれば何度も同じ動きになるはずなのに、2回目以降マクロの画面さえ出力されなかったです。
このポップアップはExcelファイルのみ普通に開いた後に出力されてたので、マクロの実行中はポップアップが出力されないことから(普通にExcel画面)イベントの制御は出来ています。
ただ、マクロ画面を起動するコードを入れても起動できないことから、うまく動いていないことがわかりました。ですので、その場合は今回のコードが必要になると思います。
調べていて、bookに直接コードを書いてその後セルに変更があった場合に何かするというマクロのコードを書くときは「Application.EnableEvents」を「False」にしないとずっとループになってしまうみたいです。
「Application.EnableEvents」のイベント制御は理解しづらいです。
うまくいかないので、「This Work Book」に直接コード書いて実施してみました。
直接書いたコードは以下の通りです。
Option Explicit
Private Sub Workbook_Open()
Cells(1, "A").Value = "1"
End Sub
このコードをコピーしたファイルの方に書きます。
標準モジュールではなく「This Work Book」に直接書きます。
実行していたマクロに戻り、以下のテストを行っていきます。
「’Application.EnableEvents = False」をコメントにしてマクロを実行すると、A1に「1」が入ります。
「Application.EnableEvents = False」のまま実行すると、A1に「1」が入らなくなりました。
bookを開いたら、A1に「1」が入るマクロなのですが、Bookを開いたらマクロを実行するというイベントを停止していると思います。
その辺りを含めて、理解がなんとなく出来たと思いました。
検証しながら進めているため、本日2つ目の書かないといけない停止するコードが書けませんでしたので、次回はそちらを実施していきたいと思います。