• 締切済み

エクセルのセルからVB等で作成したアプリの変数を参照するには

エクセルのセルからVB等で作成したアプリの変数を参照する方法がわかりません。 また、そのアプリで変数が更新された際に自動的にセルの内容が変わるといった仕組みは無いでしょうか。 楽天証券のリアルタイムスプレッドシートは、セルで"=app|code!field"のような形で情報を参照できるので、何らかの方法があると思っています。 また、上記の式をエクセルに入力すると、「APP.EXEを起動しますか」といったメッセージが出ますので、参照はできるのだと思います。 VBのアプリからセルをいじると、パフォーマンスが悪く困っています。 アプリはVBにはこだわっておりません。 また、ヒントとなるような情報だけでもかまいません。 よろしくお願いします。

みんなの回答

回答No.6

同じような事でお悩みの方がいらっしゃるのだなと思って回答させて頂きます。結局私の場合も、散々悩みましたが、VBではないですが別のアプリケーションとの通信を、EXCEL側のセルの変化をイベントとして捉えて、アプリに渡したかったのですが、スキル不足の為諦めました。  結局、別のアプリから強引に取得しに行く、書き込みに行くという手段で行っております。  通信には、DDEを使いました。1秒間に約500項目をEXCELから読み出し、同様の数のデータを書き込みに行っています。  パフォーマンスは、マシンのスペック頼りです。ただ、取敢えずで使ってみた、P2、128MB、WIN2000SVで、上記のパフォーマンスが出ましたから結構これでいいっか・・と思っています。  P4 WIN-XPのマシンを新たに購入しましたが、このマシンの環境と考えられる他の要因で通信がうまくいかなかったので、原因究明している時間もないので、ほったらかしにしています。ご参考まで・・

すると、全ての回答が全文表示されます。
  • taseki
  • ベストアンサー率66% (155/233)
回答No.5

すみません、「セルから参照」という意味がちょっと解らなかったのですが、単純にExcelとアプリで情報交換するだけと解釈すれば、SendMessageでウィンドウメッセージを送るなどの次元とは違うのでしょうか。 たとえばアプリ側に「ウィンドウメッセージなどでリクエストが来たら変数値を返す」機能を付けておき、Excelのほうには「リクエストを送り、その戻り値を返す」関数を用意しておき、セルからその関数を呼び出す、というようなイメージです。 見当違いでしたらすみません。

すると、全ての回答が全文表示されます。
  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.4

>楽天証券のリアルタイムスプレッドシートでは >セルで"=app|code!field"のような形で情報を参照できるので これはExcelの「作業中のコンピュータにないアプリケーションのデータとのリンクを設定する数式について」というヘルプトピックを読んでもらえると分かると思いますが、DDE(Dynamic Data Exchange)を使った仕組みですね。 この場合RSS.EXE(リアルタイムスプレッドシート)がDDEサーバとして動作していますが、これと同じことをしたいなら、作成するアプリケーションにDDEサーバの機能を持たせてやれば良いだけです。 詳しくは「DDE」「DDEサーバ」などでWeb検索してみましょう。VC++が多いですがDDEサーバのサンプルが見つかるはずです。 >VBのアプリからセルをいじると、パフォーマンスが悪く困っています。 それはやり方(ロジック)が悪いのでしょう(^^; 確かに、一つのセルに書き込むだけであれば時間はあまり掛かりませんが、数が増えると(それを繰り返すだけだと)遅くなってしまうこともありますからね。 ブロックで書き込むときはタブ区切り&改行区切りにするとか、後述するExcelアドインを利用するなどパフォーマンスアップの方法は幾らでも考えられます。 #3さんがおっしゃっているように、こっちのほうが王道というか普通の方法ですね。 (ソースを見たわけではないので憶測ですが)RSSではExcelアドインを登録する必要がありますが、このアドインが定期的に対象となるフィールドの更新をチェックしているだけだと思いますので、変数が更新されたタイミングで変更されるわけではないと思われます。 「アプリの変数を参照する」というのは#1さんがおっしゃっているように「そういう仕組み(インターフェイス)が(参照される側に)無いと無理」です。 前述されてるようにDDEやCOM、ファイルマッピングのようなプロセス間通信が有名ですね。 # DDEを使う人は殆どいませんが・・・(^^;

momonga_excel
質問者

お礼

ご回答ありがとうございます。 DDEサーバですね。ちょっと試してみます。 たしかにセルひとつであれば、それほど問題ないのでしょうが、できるだけたくさんの情報を渡したい(100個ぐらい)ので、そもそも無理があるのかも知れません。 それが1秒間に数回更新ですから。 データを絞ってみたり、DDEを調べてみたりします。 DDEサーバにするとして、重要な項目の更新時にエクセル側のファンクションを呼び出して、そのときだけエクセルからDDEで取りにこさせるといった感じでもいけるかもしれません。 うまく行ったらまたご報告します。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>そのアプリで変数が更新された際に自動的にセルの内容が変わるといった仕組み 変数が更新されたタイミングは、そのアプリ以外からではうまくとれない と思います。(イベントでメッセージ送信?) パフォーマンスが悪くても、アプリ側からエクセルのセルに書き出すのが簡単でいいかと思います。

momonga_excel
質問者

お礼

ご回答ありがとうございます。 と、ここまで書いて気づいたのですが、No1,No2へは「お礼を投稿する」ではなく、間違えて補足の方で書いてしまいました。 すみません。お礼のつもりです。 No.1にも書きましたが、リアルタイム性が結構重要なので、どうしてもパフォーマンスがでなければ、エクセルはあきらめます。 でも楽天証券のは出来ているようですので、もう少し頑張ってみます。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 WebのスプレッドシートとExcelは別物だと思いますね。ワークシートのサイズなどかなり違います。私は、Web のほうは、あまり詳しくありません。 通常、Excelの場合は、COMアドインにします。 EXE 型は、最近は、あまり流行らないようですが、OLEオートメーションにして、参照設定で呼び出すか、REGSVR32.EXE で、レジトスリに登録しておいて、CreatObject で呼び出します。 たぶん、以下のコーナーが参考になると思います。

参考URL:
http://www.moug.net/skillup/svbm/ya01-1.htm
momonga_excel
質問者

補足

ご回答ありがとうございます。 今は、Web上での動作は考えていません。 Webにも展開するつもりですが、その際はJavaアプリとする予定です。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.1

何か深遠な、スキルのいりそうなことをお望みのようですね。 失礼ですが、どの程度のことがお分かりになるのか匂わせていただければ、回答者のほうもそれに応じて、レベルにあった回答をしてくれるかも知れないと思ったわけです。 下記の言葉使いからちょっと感想を持ちました。 >アプリの変数を参照する 変数というのは、アプリとかOSでもプログラムを実行しているときの、ある瞬間のメモリの値であるはずです。アプリは実行中でないと変数は話になりません。 しかし一般にプログラムが動いているときに、その変数値を他のアプリから 覗けるようにには簡単に行きません。簡単にできたらむしろ危険な場合もあるでしょう。 一般のアプリとエクセルは実行単位・世界が別で、変数を共有するなどはできないと思います。エクセルからアプリを起動し(またはその逆)、実行中に変数を参照はできるとは思いますが、アプリの変数名(名だけわかってもダメですが)などは公表されていないはずです。 オフィスソフトはそういう仕掛けを苦労してMS社が作った結果、やさしいような片鱗を垣間見るものだから、できそうに思うのかもしれませんが、その辺の仕組みの理解とか、プログラムは、ごく上級者でないとできないでしょう。 エクセルはあくまで受け皿、記録ツールとして使われることがあります。 またポピュラーなソフトですし。 表形式で表現してくれるからです。なにもエクセルが特別な機能を持っているから使われるわけではないことが多い。 最近はクライアント側からWEB上のプログラムを動かせる仕組みを作っている場合が多々あるのでそれなら可能です。それはそのようにプロが仕組んであるのです。 一番やさしいのは、ディスク上のデータに記録して、そのデータを読みにいける仕組みを作ることです。 WEB上などのは全てそれで、プログラムが走っている途中の変数値を見ているのではないはずです。

momonga_excel
質問者

補足

ご回答ありがとうございます。 レベルといっても、VBからエクセルのセルはいじれても、その逆ができないといった感じです。 アプリはもちろん、ずっと動かします。 そのアプリはTCPでデータを受信し、それをエクセルでグラフなどで表示したいのです。 かなりリアルタイム性が求められますので、エクセルからのポーリングでは問題があります。 まずは、VB側でエクセルを更新したのですが、1秒に何度も更新があるので、ちょっと重過ぎるといった問題があります。 逆にしたら解消するという保証も無いのですが、ためせたらと思っています。

すると、全ての回答が全文表示されます。

関連するQ&A