
こんにちは。
エクセルVBAにて次のようなプログラムを作成しておりますが思考のループに入ってしまった為御助力をお願いします。
メインルーチンをキーボード「↑」が押されるまでループする。
その中で処理Aを1秒間隔、処理Bを5秒間隔、処理Cを30秒間隔に実行させる。
※今回はサンプルコードの為DEBUG.PRINTを実行させる。
現状ループの中にApiSleepを入れ1/1000で制御しています。
処理を実行させると若干もたつきが感じられます。
正確な時間計測は必要としていませんのでシステム日付程度の精度を求めています。
方法は幾つかあると思いますがご協力をお願いします。
以下サンプルコード
Public Type TestType
XTime As Integer
XBack As Integer
End Type
Sub Sample()
Dim KeyChk As Integer
'Dim ThisTime As Integer
Dim Ret1 As TestType
Dim Ret2 As TestType
Dim Ret3 As TestType
KeyChk = 0
With Ret1
.XTime = 1
.XBack = .XTime
End With
With Ret2
.XTime = 5
.XBack = .XTime
End With
With Ret3
.XTime = 30
.XBack = .XTime
End With
Do
KeyChk = GetAsyncKeyState(VK_UP)
Sleep (1000)
'ThisTime = ((Hour(Time) * 60) + Minute(Time) * 60) + Second(Time)
With Ret1
If .XTime = 0 Then
Debug.Print "処理A実行"
.XTime = .XBack
Else
.XTime = .XTime - 1
End If
End With
With Ret2
If .XTime = 0 Then
Debug.Print "処理B実行"
.XTime = .XBack
Else
.XTime = .XTime - 1
End If
End With
With Ret3
If .XTime = 0 Then
Debug.Print "処理C実行"
.XTime = .XBack
Else
.XTime = .XTime - 1
End If
End With
Loop While KeyChk = 0
MsgBox ("終了")
End Sub
API宣言及び仮想キー宣言は省略
No.1ベストアンサー
- 回答日時:
sleepの代わりにこんなのを見つけましたがいかがでしょうか
http://support.microsoft.com/kb/231298/ja
hTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer")
のところを、
hTimer = CreateWaitableTimer(0, True, Application.Name & "Timer")
に変更したら、ご提示のコードのsleep(1000)のところを、wait(1)にして、動作いたしました。
実行中にワークシートを操作した感じでは、sleep(1000)と、DoEventsの組合せよりセル操作が軽快な気がします。但し、↑キーへの反応は鈍くなります。
先のコードでは処理実行の判断としてカウントダウンを使用していましたが逆に実行時間を設定させインターバルを速くして精度を上げて見ました。
インターバルが速くなったことによりキー待ちの反応がかなり改善されました。
処理AからCを実際のコードに置き換え実行しましたがボチボチの反応でしたので現状で行きます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA ステータスバー DoEvents
-
デザイン時のVisible=Falseは実...
-
C#でボタン名を変更しても動く
-
以下のコードを実行しても、オ...
-
JavaScriptでショートカットキ...
-
リクエスト結果が一瞬しか表示...
-
if(1){...}とはどういうことで...
-
JSPの処理の途中で、JavaScript...
-
setTimeoutあるいはsetInterval...
-
〔Excel:VBA〕マクロの実行が異...
-
VB.netでタイマーがスタートし...
-
C# showdialogの戻り値について
-
resizeToメソッドが動作しません
-
VB.netの重複データ数カウント...
-
2回目のSortメソッドが失敗~20...
-
JavaScript(ライブラリ)のキ...
-
VB.NET2003 テキストボックスに...
-
正整数の半角数字かどうか判定する
-
VC#でテキストボックスに変数の...
-
javascript で外部サイトにデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
if(1){...}とはどういうことで...
-
JSPの処理の途中で、JavaScript...
-
JavaScriptでショートカットキ...
-
以下のコードを実行しても、オ...
-
デザイン時のVisible=Falseは実...
-
C#でボタン名を変更しても動く
-
〔Excel:VBA〕マクロの実行が異...
-
VBA ステータスバー DoEvents
-
リクエスト結果が一瞬しか表示...
-
ラベルの色がかわってくれない
-
1つのVBAコードをすべてのコア...
-
VBA SORT Applyでエラー
-
初心者です。gulpでコンパイル...
-
eval()の危険性の具体例を教え...
-
列を非表示にするマクロが実行...
-
PowerPointで時計表示
-
innerHTMLなどの反映タイミング
-
JavaScriptで、実行するたび値...
-
VB.netでタイマーがスタートし...
-
alert()が実行できない
おすすめ情報