【Excel】VBAでSleep関数を使う方法とUWSCでSleep時間を可変にする方法

目次

【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]でちゃんと動作するか確認する必要がある。

Windowsマクロテクニック: 超速!!(UWSCの使い方)

Windowsマクロテクニック: 超速!!

  1. マクロの基礎知識
  2. 実践!サンプルマクロ集
  3. UWSCで使える関数や制御文
  4. 他のアプリケーションの高度な制御方法
  5. マクロをもっと使いこなそう
  • あとがき
  • 付録
  • 索引

※UWSCの書籍として今も購入可能なモノは2種のみなので、その点を考慮すると★5になるが運よく中古があれば500円以下で購入可能!
Amazonレビューは★3.9

私のKindle-Unlimited評価は★3

Windowsを自動化!UWSC逆引き本 Kindle版

Windowsを自動化!UWSC逆引き本 Kindle版

  1. はじめに
  2. UWSCについて
  3. UWSCスクリプトをつくる
  4. 文字を操作する
  5. 配列を操作する
  6. ファイルを操作する
  7. ウィンドウを操作する
  8. システムを制御する
  9. ブラウザを操作する
  10. Officeスイートを操作する
  11. 高度な操作

Kindle販売なので在庫がなくなることはない?
UWSCの読み物として暇なときに見るようにしている
Amazonレビューは★3.9

私のKindle-Unlimited評価は★3

編集後記

2024.1.24時点でもWin11上でUWSCは使えているが、今後AIの進化!さしずめ ChatGPT , Microsoft365 Copilot , Power Automate が、2024年は更に加速度的に相乗効果でMicrosoft一強へ動き出すかもしれない🦆

それでは、またね~😎

目次