PCの環境によってはマクロ実行中に強制的にスリープになる
自分のPCなら設定でどうにでもできる問題ですが、会社のPCの場合セキュリティの問題がありスリープの条件設定が変更できない場合があります。
私の会社で配布されているPCの場合、マクロ(VBA)の処理中であっても一定時間キーボードやマウスなどの操作をしていないと、セキュリティソフトが自動的にPCをスリープ状態にしてしまうようです。
そこでVBAの処理中、わざと一定間隔でキーボードイベントのCtrlキーを押すコードを挟み込んで、スリープになるのを防ぐコードを考えました。
Ctrlキーは他の処理や操作をしているときに押しても影響が少ないので、キーボードイベントに挟み込むキーとしました。
今回はそのコードを紹介します。
キーボードイベントの使用方法
以前にVBA(マクロ)を使ってキーボード操作というタイトルで書いた記事と内容がカブリますが、キーボードイベントの使用方法についてもう一度記載します。
①宣言セクションへの記載
まず宣言セクションに以下の内容を記載します。
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Private Const fKEYDOWN = KEYEVENTF_EXTENDEDKEY
Private Const fKEYUP = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
また実際に使用するコードも宣言セクションに記載します。今回はCtrlキーを使用するので、Ctrlキーをキーボードイベントで使用できるようにします。
他のキーを使用したい場合は前の記事を参考にして使ってください。
②処理するVBAコード本文でのキーボードイベントの記載内容
Ctrlキーをクリックするコードは以下のようになります。
keybd_event VK_CONTROL, 0, fKEYUP, 0’Controlを離す
スポンサーリンク
実際のVBAコードの例
何回もCtrlキーを押すコードを記述するのが面倒なので、繰り返し処理の中に入れてしまえれば一番作るのが楽だと思います。
私の書いたVBAコードはFor~Nextの処理が二重にネストしているものだったので、その中にこのCtrlキーを押すキーボードイベントを記載しました。
おおよその形としては以下のようになります。
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Private Const fKEYDOWN = KEYEVENTF_EXTENDEDKEY
Private Const fKEYUP = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
Sub 繰り返し処理の中にキーボードイベントを挟む処理
Dim i as Integer , k as Integer
For i = 1 to 100
For k = 1 to 100
処理①
処理②
keybd_event VK_CONTROL, 0, fKEYDOWN, 0’Controlを押す
keybd_event VK_CONTROL, 0, fKEYUP, 0’Controlを離す
Next k
Next i
End Sub
こんな感じで書けばスリープするのを防ぎつつ処理が進みます。
ただし、これだと処理が終了するまでに100×100で1万回Ctrlキーが押されることになるので、他に処理を途中でしたい場合、影響が出ることが予想されます。
一回の処理がそこまで時間がかからないなら「Next k」と「Next i」の間にキーボードイベントの処理を入れても良いかもしれません。
そうするとCtrlキーを押す回数は100回に減ります。
後はiの値によって条件分岐を入れて処理を加える方法もあります。
こういう細かい操作に関しては自身の環境で検証して使いやすいようにしてみてください。
コメント