エンデュランスの計測システム
エクセルでエンデュランス用の記録システムを作成しています。
プラットフォームをエクセルとしたのは、もともとあったプログラムがVB6+エクセルで作成してあり、データはエクセル上にあるため、再利用がしやすいぐらいのことからだったのですが、これは結果的には大正解でした。
開発期間が大幅に縮小されました。
最もシンプルに、パソコン上で選手番号を押せば、時間を記録し、選手用とスタッフ、獣医用のカードを出力するまでは2,3日もあれば十分にできました。
細かい使い勝手の向上や、獣医カード・賞状出力など、今までは手作業でやっていたものもエクセルの簡単なプログラムで差し込み印刷が可能なので、これまた非常に省力化がすすみました。
プラットフォームをエクセルにすることの一番の心配事は処理速度です。
下手なプログラムを書くと考えられないような遅さのシステムが出来上がります。
計時システムなのでリアルタイム性が問われます。
実際、昨秋にテスト運用してみたのですが、処理速度の早いパソコンでのテストでは特に問題なかったのですが、
本番で使用したノートパソコンでは、数頭が一斉にゴールラインを通過したときに、ボタンを押してもうまく反応しない問題がありました。
そのときは、一件づつ処理をするようにしていて、印刷などの時間のかかる処理のためにボタンクリックの取りこぼしが発生するようでした。
そして、ここからが、話の本題です。
それではどのようにしたらこれが解決できるでしょうか?
問題の原因ははっきりしています。印刷などの重たい処理をしている間はボタンクリックのイベントが発生しないことです。
普通なら印刷処理を別のスレッドでやることなるのですが、エクセルVBAには複数スレッドはありません。
同一ブック内のVBAは常に1つのことしかやってくれないのです。
と、ここまで書けば解決方法は見つかったも同然ですね。
印刷に必要なデータだけを別のブックに書き出して、そのブック内に印刷用のマクロ(関数)を作成して、それを呼び出せばいいだけですよね。
で、めでたしめでたし、とはいかないところが面白いところです。
別のブック内にあるマクロをコールしてもやはり処理が終わるまで待っています。
非同期呼び出しなんてものは存在しないのです。
で、どうするのか?
実はontimeという助っ人がいました。
これは、ある時間になったら、指定したマクロが呼び出されるという仕様なのですが、これを0秒後に印刷マクロを実行するように、セットすると呼び出し側にはすぐさま返ってきます。非同期呼び出しのように振る舞ってくれます。
そして、ゆっくりと印刷処理をすればいいのです。
ということで、解決です。
プラットフォームをエクセルとしたのは、もともとあったプログラムがVB6+エクセルで作成してあり、データはエクセル上にあるため、再利用がしやすいぐらいのことからだったのですが、これは結果的には大正解でした。
開発期間が大幅に縮小されました。
最もシンプルに、パソコン上で選手番号を押せば、時間を記録し、選手用とスタッフ、獣医用のカードを出力するまでは2,3日もあれば十分にできました。
細かい使い勝手の向上や、獣医カード・賞状出力など、今までは手作業でやっていたものもエクセルの簡単なプログラムで差し込み印刷が可能なので、これまた非常に省力化がすすみました。
プラットフォームをエクセルにすることの一番の心配事は処理速度です。
下手なプログラムを書くと考えられないような遅さのシステムが出来上がります。
計時システムなのでリアルタイム性が問われます。
実際、昨秋にテスト運用してみたのですが、処理速度の早いパソコンでのテストでは特に問題なかったのですが、
本番で使用したノートパソコンでは、数頭が一斉にゴールラインを通過したときに、ボタンを押してもうまく反応しない問題がありました。
そのときは、一件づつ処理をするようにしていて、印刷などの時間のかかる処理のためにボタンクリックの取りこぼしが発生するようでした。
そして、ここからが、話の本題です。
それではどのようにしたらこれが解決できるでしょうか?
問題の原因ははっきりしています。印刷などの重たい処理をしている間はボタンクリックのイベントが発生しないことです。
普通なら印刷処理を別のスレッドでやることなるのですが、エクセルVBAには複数スレッドはありません。
同一ブック内のVBAは常に1つのことしかやってくれないのです。
と、ここまで書けば解決方法は見つかったも同然ですね。
印刷に必要なデータだけを別のブックに書き出して、そのブック内に印刷用のマクロ(関数)を作成して、それを呼び出せばいいだけですよね。
で、めでたしめでたし、とはいかないところが面白いところです。
別のブック内にあるマクロをコールしてもやはり処理が終わるまで待っています。
非同期呼び出しなんてものは存在しないのです。
で、どうするのか?
実はontimeという助っ人がいました。
これは、ある時間になったら、指定したマクロが呼び出されるという仕様なのですが、これを0秒後に印刷マクロを実行するように、セットすると呼び出し側にはすぐさま返ってきます。非同期呼び出しのように振る舞ってくれます。
そして、ゆっくりと印刷処理をすればいいのです。
ということで、解決です。