【Excel】kernel32からSleep関数を使えるように設定
自動化処理を毎回同じパソコンで行うなら、こんな心配はを無用!なのだが、
いつもはメインのパソコンで処理を行うが、
今日は旅行先やちょっと喫茶店でWIFI接続といったとき空き時間を使って自動化処理をやっておき、
帰宅後は出来上がったファイルをコピーする。という場面が出てきたとして、
マシンやネット環境によりSleepタイムが異なり上手く処理が進まず、
ExcelVBA上でエラーが出てしまうということがある。
そこでハード環境が異なってもSleepタイムを可変にすれば一度テスト運用することで、
Sleepタイムで止まるエラーは減少することができる。今日はこれに挑戦する。
Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal ms As Long)
VBAの一番上に書く(クリップボード以前やったので、これと一緒に書く)
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long)
Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
'APIのMessageBox利用指定
Declare PtrSafe Function MessageBox Lib "user32.dll" Alias "MessageBoxA" (ByVal hWnd As Long, ByVal msgC As String, ByVal msgT As String, ByVal uType As Long) As Long
'OKボタンフラグ
Public Const MB_OK = &H0
'最前面フラグ
Public Const MB_TOPMOST = &H40000
※2022.5.9更新
これでExcelVBAでもSleepが使えるがSleep(1)の1の部分を可変に使うことはExcelではできないので、簡単なFunction関数を作っておく。
Function setTimer(r)
Function setTimer(r)
Dim i As Integer
If Not IsNumeric(r) Then Exit Function
For i = 1 To r
Sleep (1)
Next i
End Function
こうすると待ち時間を変数として指定できるので、Sleep(n*2)といった式を代入することがsetTimer(n*2)で実現できるので便利な関数となる。
次に、UWSCでマシン名を取得してSleep(待ち時間)を可変にする!という課題にチャレンジする。
【UWSC】マシン名を取得してSleep時間を可変にする
マシン名を取得
ググれば必ず出てくるとは思うが、
マシン名を表示してくれるUWSCモジュール
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
comname= trim(WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%"))
print "COMPUTERNAME:" + comname
※私はマシン名で待ち時間を可変にして1つのプログラムを2台以上のマシンで動作可能にしているが、ユーザー名やインターフェース情報などWindows環境変数で分岐させることも可能となる。
マシン名でデフォルトのSleep時間を設定する
//コンピュータ名を取得する
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
comname= trim(WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%"))
//print "COMPUTERNAME:" + comname
//DESKTOP01を自分のマシンIDに変更する
ifb comname="DESKTOP01" then
Timer=0.5
else
Timer=1.5
endif
更にサンプルとして「JRA サイトマップ」を立ち上げて1秒後最大化表示し5秒後閉じる。
UWSCモジュールを下記に記す。マシン名:DESKTOP01以外のマシンは待ち時間は3倍になる。
マシン名を取得し「JRAホームページ」を立ち上げて消すUWSCサンプル
//コンピュータ名を取得する
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
comname= trim(WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%"))
//print "COMPUTERNAME:" + comname
//DESKTOP01を自分のマシンIDに変更する
ifb comname="DESKTOP01" then
Timer=0.5
else
Timer=1.5
endif
//jraのホームページを立ち上げる
CTRLWIN(GETID("chrome"),close)
exec("cmd /c start=http://www.jra.go.jp/sitemap/")
sleep(Timer*2)
CTRLWIN(GETID("chrome"),MAX)
sleep(Timer*2*5)
CTRLWIN(GETID("chrome"),close)
今日は簡単にSleepの使い方を練習してみた。
簡単だがコピペでは重要な関数なのでデバッグの際ただ待ち時間のタイム差だけの問題なのに、
処理に問題があると勘違いしてバグとりに必死になり時間を大きくロスすることがある。
先ずは時間調整[Sleep]でちゃんと動作するか確認する必要がある。

編集後記
- UWSC HELP
- Windowsを自動化!UWSC逆引き本
- UWSCのダウンロードはググれば一番上に出てくるさぁ
- https://www.vector.co.jp/soft/winnt/util/se115105.html
それでは、またね~😎