質問: excelvbaのdoeventsによるエラー? excel2010(windows7 64bit)のvbaであるプログラムを作っていたのですが、以下の様な原因不明のエラーが生じてしまいます。 1. 自分では同じ操作をしているつもりなのですが、エラーが出る場合と出ない場合があり、エラーの原因を特定できません。 2. errオブジェクトを調べたところ、エラー番号が「-2147417848」です。 3. エラー発生後にexcelがフリーズして数分待っても終了しません。仕方がないのでwindowsを再起動しています。 4. エラーが発生する様になる前は、プログラムは問題なく動いてしました。動かなくなった日に行った変更は、時間がかかるループ内にdoeventsを入れたことと、モーダレスダイアログを表示するようにしたことです。ただ、その他にも細かい変更をしましたし、エラーが発生するタイミングが解らないので、これが原因かはわかりません。 以上です。もし、エラーの原因や解決方法等、何かご存じの方がいらっしゃいましたらご教授くださいますようにお願いいたします。
回答: おはようございます。 モーダレスフォームが応答なしになるの対策ですが 処理の進歩を示すフォームなら、doeventsでosに処理を一旦渡さなくても userform1.repaintで出来ます。 もし label1.caption = s & "% 処理中・・・" doevnets みたくなっているのでしたら label1.caption = s & "% 処理中・・・" userform1.repaint に置き換えてみるとどうでしょう? このrepaintも頻繁に呼び出すと画面がちらつきますので呼び出す回数は工夫が必要 です。(例えば、10%毎に呼び出すとか) vbaは処理速度が遅いので、winapiのsleepを適度にはさんでやるのもいいのかも しれません。 複数の環境で使われているみたいですから、条件付コンパイルを使ってsleepを宣言します。 #if vba7 and win64 then '64ビット版 public ptrsafe declare sub sleep lib "kernel32" (byval dwmilliseconds as long) #else '32ビット版 public declare sub sleep lib "kernel32" (byval dwmilliseconds as long) #end if この様に標準モジュールに宣言をして do sleep 100 処理 loop とすると応答なしにならなくなります。cpuも100%使い切る事もなくなります。 このsleepは指定時間だけ処理を止めるものですから、コツは短い時間(ミリ秒) を何度も挟むことです。長い時間はさむと処理もexcelの操作も一切出来ません ので注意が必要です。 根本的な解決に繋がるか自信がありませんが、何かの参考になりましたら。