システムで強制的に起こされるスリープを防止するマクロ(VBA)

スポンサーリンク

PCの環境によってはマクロ実行中に強制的にスリープになる

自分のPCなら設定でどうにでもできる問題ですが、会社のPCの場合セキュリティの問題がありスリープの条件設定が変更できない場合があります。
私の会社で配布されているPCの場合、マクロ(VBA)の処理中であっても一定時間キーボードやマウスなどの操作をしていないと、セキュリティソフトが自動的にPCをスリープ状態にしてしまうようです。

そこでVBAの処理中、わざと一定間隔でキーボードイベントのCtrlキーを押すコードを挟み込んで、スリープになるのを防ぐコードを考えました。
Ctrlキーは他の処理や操作をしているときに押しても影響が少ないので、キーボードイベントに挟み込むキーとしました。

今回はそのコードを紹介します。

キーボードイベントの使用方法

以前にVBA(マクロ)を使ってキーボード操作というタイトルで書いた記事と内容がカブリますが、キーボードイベントの使用方法についてもう一度記載します。

①宣言セクションへの記載

まず宣言セクションに以下の内容を記載します。

Declare Sub keybd_event Lib “user32” (ByVal bVk As Byte, ByVal bScan As Byte, _
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キーをキーボードイベントで使用できるようにします。

Private Const VK_CONTROL = &H11

他のキーを使用したい場合は前の記事を参考にして使ってください。

②処理するVBAコード本文でのキーボードイベントの記載内容

Ctrlキーをクリックするコードは以下のようになります。

keybd_event VK_CONTROL, 0, fKEYDOWN, 0’Controlを押す
keybd_event VK_CONTROL, 0, fKEYUP, 0’Controlを離す

実際のVBAコードの例

何回もCtrlキーを押すコードを記述するのが面倒なので、繰り返し処理の中に入れてしまえれば一番作るのが楽だと思います。

私の書いたVBAコードはFor~Nextの処理が二重にネストしているものだったので、その中にこのCtrlキーを押すキーボードイベントを記載しました。
おおよその形としては以下のようになります。

Declare Sub keybd_event Lib “user32” (ByVal bVk As Byte, ByVal bScan As Byte, _
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の値によって条件分岐を入れて処理を加える方法もあります。
こういう細かい操作に関しては自身の環境で検証して使いやすいようにしてみてください。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする