- PR -

Excel2000でRTD関数のようなことできますか?

1
投稿者投稿内容
Take-C
常連さん
会議室デビュー日: 2002/05/09
投稿数: 23
投稿日時: 2008-07-13 14:19
件名の件で悩んでます。

現在求められていることは

  • Excel 2000のセル上に値を表示する
  • 表示する値は他のアプリケーション(ここではデータサーバと呼ぶことにします)で更新される値を反映する
  • 値を反映するタイミングはリアルタイム(「定期的に値の更新状況を見て反映」という方法は禁止)
  • DDEやOLEは使用しない

という非常に厳しいものです。

とりあえず以下のような仕組みでやろうと考えています。

  • COM Addinを作成してExcelにAddinを追加する
  • COM Addinの内部でスレッドを作成し、データサーバからデータの更新状況を受信する
  • スレッドはデータを受信したらExcelのセルに値を反映させる


Excelのセルに反映させる方法はいくつかあるかと思いますが、そもそも「Excel自身のスレッドとは別のスレッドからExcelに対して値を更新する」というのが安全かどうかが非常に疑問なのです。

どなたかこの辺のことに対して白黒ハッキリできるような資料をご存じないでしょうか?

どれもこれもExcel2002から導入されたRTD関数の使用を認めてもらえれば一発で解決できるのですが・・・
(この場合RTDサーバを作成する必要がありますが、この辺の資料はたくさん見つけることができました。)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-13 15:54
引用:

Take-Cさんの書き込み (2008-07-13 14:19) より:
Excelのセルに反映させる方法はいくつかあるかと思いますが、そもそも「Excel自身のスレッドとは別のスレッドからExcelに対して値を更新する」というのが安全かどうかが非常に疑問なのです。


私は VB(6以下) で ActiveX Control を作って、それを Excel のワークシートに貼り付けています。ActiveX Control がその中で (VB の) RaiseEvent によりイベントを起こしたら、Excel の VBA で書かれたイベントハンドラーで処理して、セルを更新したりしています。
私はスレッドなどは良く知らないため、ActiveX Control の中で RaiseEvent する際は、念のため Timer コントロールを使い、Interval = 1 に設定して1ミリ秒後に発火するようにして、タイマーイベント(Timer イベントハンドラー)の中で RaiseEvent するようにしています。

この方法が安全か?と問われても自信はありませんが、一応なんとなく動いています。趣味のプログラムなのであまり検証はしていません。

[ メッセージ編集済み 編集者: unibon 編集日時 2008-07-13 15:55 ]
Take-C
常連さん
会議室デビュー日: 2002/05/09
投稿数: 23
投稿日時: 2008-07-14 00:02
unibonさん、早速のご返答ありがとうございます。

引用:

この方法が安全か?と問われても自信はありませんが、一応なんとなく動いています。



ここなんですよね、最大の問題は。
私もなんとなく動く方法はいくつか試してそれなりにうまくいっている「ように見える」のですが、マルチスレッド環境でExcelのセルに書き込む、またはセルに書かれている関数を再計算するのが安全かどうかがどうしてもわからないのです。

Excel 2003以降であれば「OfficeのスレッドモデルはSTA」という記述がいくつか見つかるので自作するスレッドもSTAなら問題はなさそうなのですが、Excel 2000となると極端に資料が少なくてモヤモヤしています。

# Excel 2002以降であればRTDが使えるのでそもそもこんなこと気にする必要がないですが・・・

Excel 2000はSTAなのでしょうか?
Excel 2000でマルチスレッドによるセルの更新は安全なのでしょうか?
「そんなの保障されていない!」ということが分かる公式ドキュメントがあればかえって楽になれるのですが
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-07-14 01:31
引用:

自作するスレッドもSTAなら問題はなさそうなのですが



無関係てことはありませんが、最も重要なのは、ワーカースレッドから Excel にアクセスする際にはマーシャリングが必要であるという点です。
Take-C
常連さん
会議室デビュー日: 2002/05/09
投稿数: 23
投稿日時: 2008-07-14 17:46
渋木宏明(ひどり)さん、追加情報をありがとうございます。

http://msdn.microsoft.com/ja-jp/library/8sesy69e(VS.80).aspx を見たところ、マーシャリングは自動的に行なわれそうですね。

しかし、この情報は一番最初に「このトピックでは、Microsoft Office 2003 オブジェクト モデルでスレッドをサポートする方法について説明します。」と書かれているため、相変わらずExcel 2000でも使えるかどうか不明です。
トホホ

引用:

渋木宏明(ひどり)さんの書き込み (2008-07-14 01:31) より:
引用:

自作するスレッドもSTAなら問題はなさそうなのですが



無関係てことはありませんが、最も重要なのは、ワーカースレッドから Excel にアクセスする際にはマーシャリングが必要であるという点です。


渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-07-15 01:12
引用:

http://msdn.microsoft.com/ja-jp/library/8sesy69e(VS.80).aspx を見たところ、マーシャリングは自動的に行なわれそうですね。



おお、これは知りませんでした。
頑張ってますね>Office

引用:

相変わらずExcel 2000でも使えるかどうか不明です。



ですね。

たぶん、COM AddIn をサポートしているバージョンになら当てはまるような気がしますし、それより前のバージョンでも対応している可能性はあります。

これに関しては、実地で Excel 2000 の TLB を調べて IMessageFilter が実装されているかどうか確認してみる、てのでもいいんじゃないでしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)