Page 566 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼一定時間(10ms)毎に適当な処理をしたい とし 03/1/18(土) 14:50 ┗Re:一定時間(10ms)毎に適当な処理をしたい JuJu 03/1/18(土) 19:09 ─────────────────────────────────────── ■題名 : 一定時間(10ms)毎に適当な処理をしたい ■名前 : とし ■日付 : 03/1/18(土) 14:50 -------------------------------------------------------------------------
はじめまして、としといいます。 OfficeXPのExcelでVBAからWIN32APIを呼び出していてわからないことがあるので 教えてください。 ある一定時間(10ms)ごとに適当な処理をしたいということSetTimerを使ってみました 標準モジュールで '<WIN32APIの宣言> Public Declare Function SetTimer Lib "user32" ( _ ByVal wndHandle As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimerFunc As Long _ ) As Long '<コールバック関数> Public Sub TimerProc(ByVal wndHandle As Long, ByVal uMsg As Long, ByVal idEventg As Long, ByVal dwTime As Long) Sheet1.Range("A4").Value = 1000 '特に意味はありません End Sub としています。 呼び出し側は Private Sub CommandButton1_Click() wndExcel = FindWindow("XLMAIN", Application.Caption) idTimer = SetTimer(wndExcel, 32767, 10, AddressOf TimerProc) End Sub です。 これで一応10ms毎にWM_TIMERは飛んできているようです。SPY++で確認しました。 が、適当なセルをクリックすると必ずEXCELがクラッシュします。 コールバック関数のなかの Sheet1.Range("A4").Value = 1000 をコメントにすると問題ないので、コールバック関数の中からEXCELを参照するのは NGなのかな?と思っています。 何がいけないのかお分かりになる方是非ご意見ください |
としさん、こんにちはぁ >はじめまして、としといいます。 >OfficeXPのExcelでVBAからWIN32APIを呼び出していてわからないことがあるので >教えてください。 >ある一定時間(10ms)ごとに適当な処理をしたいということSetTimerを使ってみました Excel(VBA)は非同期で呼び出されるコールバック関数は使用することができません。 (VBをIDE環境で実行していても同じですね) AddressOfは同期実行されるAPI(Enum系等)用に用意されています。 VBであればネイティブにコンパイルされている状態でしたら、特定の条件化であれば非同期で呼び出されるもの(SetTimer, CreateThread等)も使えることがありますが、エクセルを含むVBA環境ではまず使えません。 エクセルでタイマでしたら、ActiveXコントロールかActiveXDLL等を使ったほうが良いのかな。 ではではぁ |