アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めまして。
是非教えていただきたいのですが、Excel2010のVBAからWindowsAPIのSetTimer関数を
使用して、500msec程度のインターバルタイマを用意し、決められたVBAのプロシジャ(以
降、Proc1)を呼び出したいと思います。
Proc1では外部I/Oのビットチェックを行い、特定のビットがONの時にプリンタを駆動しま
す。

上記のような使い方では、外部I/Oのビットチェックはインターバル周期内に処理が終わり
ますが、プリンタ駆動の方は印刷結果の取得も行うためインターバル周期内では処理が終わ
りません。

簡単なテストプログラムを用意して動作させてみたのですが、プリンタの駆動を行う時は
Proc1の処理が完了していなくても、インターバル周期でProc1が呼び出されているようで
す。

Proc1の先頭で一旦インターバルタイマを停止させ、Proc1の処理を抜ける時に再びインター
バルタイマを作動させればうまくいくように思うのですが、そのようなことができるので
しょうか?

詳しい方がおられましたら、ご教授お願いいたします

A 回答 (1件)

SetTimer関数は知らなかったので調べてみました。

。。
http://note.phyllo.net/?eid=1106267
コードが不明なので・・・どこかでKillTimer SetTimerを繰り返す必要がありそうです。
となるとPrinterのQueやStatusを検出する必要も出てきそうな気がします。
なので別案
Declare Function timeGetTime Lib "winmm.dll" () As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

t1=timegettime
call proc1
t2=timegettime
if t2-t1 <500 then
sleep 500-(t2-t1)
end if
みたいな感じで余った分だけSleepではダメ?
でこれをループ処理。
http://homepage2.nifty.com/DreamyCat/APIpage1.htm
    • good
    • 0
この回答へのお礼

nicotinism 様

こんにちは。hsaikiです。
早速の回答ありがとうございます。
まず紹介していただいたURL、大変参考になりました。
WindowsAPIについては日本語のわかりやすい資料が
なかなかないのでネット上の情報が頼りです。

教えていただいたことを元に、取りあえず周期的に
呼ばれるプロシジャの先頭で、一旦「killtimer」を実行
して、プロシジャの末尾で再度「settimer」を実行する
ようにして動作を確認してみようと思います。

ご指摘いただいたプリンタのキューやステータスについ
ては、「命令を投げて結果を待たずに次の処理へ進み
次回以降のプロシジャ実行でフォロー」のような真っ当
な処理(笑)は行っていないので、多分大丈夫なのではな
いかと思っています。
問題あるようでしたら提案いただいた処理も試してみます。

最後にコードを書いておきます。

ありがとうございました。

(宣言部)
Public Declare Function SetTimer Lib "USER32"
       (ByVal hWnd As Long,
        ByVal nIDEvent As Long,
        ByVal uElapse As Long,
        ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "USER32"
(ByVal hWnd As Long,
ByVal nIDEvent As Long) As Long

(Workbook_Openモジュール)
 ・
 ・
 TimerID = SetTimer(0&, 31000&, 500&, AddressOf TimerProc)
 ・
 ・

(標準モジュール)

Public Sub TimerProc()
KillTimer 0&, TimerID
 ・
 ・
(処理)
 ・
 ・
TimerID = SetTimer(0&, 31000&, 500&, AddressOf TimerProc)
End Sub

お礼日時:2015/11/27 09:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A