- - PR -
Excelマクロを渡した場合のreturnの方法
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-18 11:01
初心者のstoneです。
excelを操作する場合は、COMの関係でマクロを実行した方がよいと、じゃんぬねっと様がよく書かれています。 作ったプログラムが、繰返しが多いため極端に時間がかかるので、マクロを渡してみました(Microsoftの「Visual C# .NET でオートメーションを使用して Excel マクロを作成する方法」をパクってます)。 Excelは、最後まで動いて(1時間ほど)くれて結果はOKですが、その間に吐き出すコメントをc#側で受取りたいのです。方法はあるのでしょうか? あちこち見てはいるのですが見つかりません。ご教授願えませんか? | ||||||||||||||||
|
投稿日時: 2007-05-18 11:44
Excel にやらせる仕事と C#(.NET) にやらせる仕事はきっちり把握できていますか?
また両者の関係はどうなっていますか?(どっちが親でどっちが子供?) 本当にマクロにやらせる必要がありますか? マクロだと1時間放置されると使う側はつらい気がする。 「吐き出すコメント」はどこにどのように吐き出されるんですか? _________________ かるあ のメモ と スニペット | ||||||||||||||||
|
投稿日時: 2007-05-18 11:53
餅は餅屋、COM を扱うなら COM ベースの言語ということですね。 たとえば、Excel 側のマクロや Script でも良いでしょう。
件名にある "return" に沿った形で考えますと、 Application インターフェイスの Run メソッドの戻り値になるのでしょう。 しかし、処理を細かく分ける必要があり途中経過を知るという意味では現実的ではありません。 最も安易に思いつくのが 「外部ファイル」 を介する方法ですが、 これも C# 側で監視する必要が生じるため好ましいとは言えないでしょう。 どうも Excel マクロ側に移譲してしまうと自由度が効かなくなります。 マクロではなくて Script という方法も視野に入れるのであれば、 ScriptControl を使って C# 側から 1 ステートメント単位で実行するという方法があります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2007-05-18 11:58
EXCEL占有時間が1時間もあるならこちらもチェック。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36735&forum=7 | ||||||||||||||||
|
投稿日時: 2007-05-18 15:52
かるあ様、じゃんぬねっと様、ラフィン様 ありがとうございます。
何につけ書込んでいただけると心強いです。
C#が親でして、フォームで複数の任意のExcelファイルから選択し処理します。 その処理の過程をc#のフォームに表示し最終的にはテキストファイルに保存します。 結果に疑問がある場合に後追いできるようにしたいと思っています。
Run メソッドを使うということで可能なのですね。ただ、現実的でないと、、、、
c#が外部ファイルをあるタイミングで見に行くと考えたらいいのでしょか。 その場合、かなりのリソースを使うのでしょうか。
Scriptについては、今はさっぱりわかりませんが、方法論として1番であるとするなら勉強してみたいと思います。 | ||||||||||||||||
|
投稿日時: 2007-05-18 21:34
本題とは外れますが、Excelのマクロで1時間もかかっているところに問題はないのでしょうか?
ちょっとしたテクで飛躍的に改善する場合もあります。 http://officetanaka.net/excel/vba/speed/s11.htm また、ExcelCreatorを使うと、C#からxlsファイルを編集できます。 メーカーの情報を見ると、かなり速そうです。 http://www.adv.co.jp/products/product_ExcelCreator5_feature2.htm [ メッセージ編集済み 編集者: todo 編集日時 2007-05-18 21:35 ] | ||||||||||||||||
|
投稿日時: 2007-05-18 21:53
たぶんいちばん簡単なのは じゃんぬねっとさん もあげている吐き出したテキストファイルを監視してそこからメッセージを取り出す方法。 やっぱりマクロ側の処理を減らすことはできないですか? 個人的には計算などの処理は .NET 側で出来るだけ行って、Excelのマクロではできるだけ簡単にしてあげたい気分はあります。 そうすれば進捗メッセージの表示も、もう少し簡単にできる気がする。 また、todo さんの挙げている ExcelCreator っていう選択肢も悪くないですね。 #メッセージ通信をしてもいいのかな。 _________________ かるあ のメモ と スニペット | ||||||||||||||||
|
投稿日時: 2007-05-19 00:13
マクロ内の関数を実行する時、今の実装で Run メソッドを使っていますよね。(たぶん) このメソッドの戻り値は System.Object 型なのでだいたい何でも返すことはできます。 ただし、あくまで関数の戻り値なので途中経過を返すという使い方には向いていない、ということです。
外部ファイルを読みに行くわけですから、リソースの量よりか安定性が心配ですね。
C# 側から動的のソースコードを生成し、ステートメント単位で実行できるものとお考えください。 ScriptControl については、リファレンスをご覧ください。 ところで、優秀な皆さまと違って私は本題しか触れていませんでしたが、 1 時間もマクロ側で何を処理しているのでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |