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

EXCELのマクロを用いてルーレットの様なプログラムを作っています。
ミリ秒間隔で処理を呼び出したいので、SetTimerを用いることにしました。

STARTボタンとSTOPボタンを用意し、
STARTボタンをクリックすると、
タイマーをセットし、
100ミリ秒間隔で 処理(nextCell)を呼び出すようにしています。
そしてこの処理(ルーレットのように複数のセルが順番に点滅する)は上手くいきます

STOPボタンをクリックしたときは、TimerStopを呼び出し、KillTimerしています。

ここで、STOPボタンをクリックするたびに、EXCELが実行時エラー50290で異常終了します。
ネットで調べてみたのですが、リンク先のページが見つからなかったりで、よくわかりません。

ちなみに、100ミリ秒間隔を 300ミリ秒間隔にすると、10回中9回くらいは上手くいくのですが、
1回程度はEXCELが実行時エラー50290で異常終了します。


EXCELのバージョンは2013
OSはWindows7 Pro(64ビット)
を使用しています。

ソースコードは以下の通りです。


Option Explicit

Private Declare Function SetTimer Lib "user32" (ByVal Hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Sub KillTimer Lib "user32" (ByVal Hwnd As Long, ByVal nIDEvent As Long)

Private myTimerId As Long
Sub TimerCall()
'STARTボタンで呼ばれる
myTimerId = SetTimer(0&, 0&, 100, AddressOf TimerCount)
End Sub

Sub TimerCount(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
nextCell 'ここでルーレットの処理を行う
End Sub

Sub TimerStop()
'STOPボタンで呼ばれる。ここで必ず異常終了
KillTimer 0&, myTimerId
End Sub

KillTimerにブレイクポイントを設定しても、そこでSTOPせずEXCELが実行時エラー50290で異常終了します。
(←ブレイクポイントで止まらないということは、メモリ破壊なのかと考え、
nextCellを以下のような簡単なプログラムに変更しましたが、結果は同じでした。
Sub nextCell()
'同じセルを点滅させるだけ
Cells(1, 1).Interior.Color = RGB(255, 255, 255)
Cells(1, 1).Interior.Color = RGB(255, 0, 0)
End Sub

また、TimerCountからnextCellを呼び出さなければ、異常終了はしません)

原因や調査方法、別のやり方など、なんでもけっこうですのでアドバイスをお願い致します。

A 回答 (1件)

Excel と コールバック関数は非常に相性が悪いです。


コールバックの中でエクセルオブジェクトを弄るとエラーになります。
また、コールバック中にブレイクポイントを設定してはいけません。
SetTimer の代わりに GetTickCount で休み休みルーレットを回すよう提案します。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
GetTickCount調べてみます。

お礼日時:2018/09/06 08:34

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

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


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