スリープしない状態を必要な時だけ維持するマクロ(VBA)

スポンサーリンク

マクロ実行中以外の強制的なスリープ

私の勤めている会社のPCは情報漏洩防止のため、キーボードに触らないまま一定時間が過ぎるとセキュリティソフトが働いてPCをスリープ状態にします。

仕事で動画再生が必要な同僚から「PCで動画の再生中にスリープになって困る」との相談があったのでそれを解決するためのマクロ(VBA)を作成しました。
その作成したスリープを禁止するVBAコードについて紹介します。

作成するスリープ防止マクロの機能

強制的なスリープが困ると相談があった同僚の要望を解決するために必須の機能は以下の3点です。

①マクロやVBAに詳しくない人でも簡単に実行できること
②他のパソコン操作に関して影響を及ぼさず、きちんと動画が再生できること
③自由なタイミングで開始・終了できること

「①誰でも簡単に実行できること」はボタンを作成して実行したりストップしたりすることで解決できます。

「②の他の操作に影響を及ぼさないこと」はスリープを防止するためのキー操作をなるべく影響の少ないキーにして、回数もあまり頻繁にしないようにすれば問題ありません。これは前回のCtrlキーを押すコードをVBA中に挿入して、スリープを防止するというコードを応用して解決しています。

「③の自由なタイミングで開始・終了ができること」が今回最も苦戦した部分です。
通常VBAやマクロを実行したときはコードの最後まで実行されるか、決めたタイミングで中断するものなので、自由なタイミングで終了するのは難しいです。
Escapeキーで強制終了するのも難しいこともあります。

この問題は(1)フォームを作成して、ボタンを押しやすくしたことと、(2)「DoEvents」というコードを使用して、フォーム中のボタンをクリックできるようにしたことの2つのアイデアで解決しました。

スポンサーリンク

DoEventsについて

DoEventsはコードの処理中に操作をWindows側に戻すというコードです。
時間のかかる処理などでは通常では処理が終わるまで新たな操作を行うことができませんが、このコードをいれておくことにより、コードの実行中の時間にボタンを押したり何か別の操作ができるようになります。

作成したファイルの説明

①作成したフォーム

ボタンは2つで、一つはスリープ禁止を開始するボタン・もう一つはスリープ禁止コードを中断するボタンです。
VBAコードは以下の②のようになっています。

40-001

②フォームのコード

フォームのコードはスリープ禁止ボタンをクリックするとずっと無限ループで続きますが、停止ボタンを押すと「StopFlag」という変数がTrueになって無限ループから抜けてコードが終了するというものです。「終了前に終了しますか?」と質問されて「はい」を選択するとコードが終了します。

Dim StopFlag As Boolean
Private Sub スリープ禁止_Click()
Dim i As Long
StopFlag = False
Cells(1, 1) = “”
Do Until Cells(2, 1) <> “”
Cells(1, 1) = Cells(1, 1) + 1
If Cells(1, 1) = 1001 Then
Cells(1, 1) = 1
DoEvents
End If
If Cells(1, 1) = 1000 Then
キー入力’標準モジュールのコードを実行する
DoEvents
End If
待ち時間10分の1秒’標準モジュールのコードを実行する
DoEvents
If StopFlag = True Then
If MsgBox(“中断しますか?”, vbQuestion + vbYesNo) = vbYes Then
Exit Do
Else
StopFlag = False
End If
End If
Loop
End Sub

Private Sub 停止_Click()
StopFlag = True
End Sub

③ブックのイベントプロシージャ

ファイルのマクロを有効にした段階ですぐにフォームが立ち上がるように以下のコードを記載しています。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cells(1, 1).Value = “”
End Sub

Private Sub Workbook_Open()
操作.Show Modeless
End Sub

④標準モジュール

キーボードイベントのCtrlキーをクリックするVBAコード、待ち時間を入力するVBAコード、操作パネルを立ち上げるVBAコードの3つを記載しています。
キーボードイベントのための宣言セクションの記載事項がフォームには記載できないようなので、このように処理しています。
操作パネルを立ち上げるコードは誤って閉じてしまった場合に再び表示させられるようにボタンを作り、実行できるようにしています。

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
Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Private Const VK_CONTROL = &H11
Private Const VK_A = &H41

Sub キー入力()
keybd_event VK_CONTROL, 0, fKEYDOWN, 0 ‘Controlを押す
keybd_event VK_CONTROL, 0, fKEYUP, 0 ‘Controlを離す
End Sub

Sub 待ち時間10分の1秒()
Sleep 100
End Sub

Sub 操作パネル立ち上げ()
操作.Show Modeless
End Sub

40-002

今回のファイルの作成はステップがいくつかに分かれていて作るのが面倒なので、ファイル自体も載せておきます。
使用してみたい方はこちらからダウンロードしてください。

コメント