- PR -

Excelマクロを渡した場合のreturnの方法

投稿者投稿内容
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-05-18 11:01
初心者のstoneです。
excelを操作する場合は、COMの関係でマクロを実行した方がよいと、じゃんぬねっと様がよく書かれています。

作ったプログラムが、繰返しが多いため極端に時間がかかるので、マクロを渡してみました(Microsoftの「Visual C# .NET でオートメーションを使用して Excel マクロを作成する方法」をパクってます)。
Excelは、最後まで動いて(1時間ほど)くれて結果はOKですが、その間に吐き出すコメントをc#側で受取りたいのです。方法はあるのでしょうか? 
あちこち見てはいるのですが見つかりません。ご教授願えませんか?
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-05-18 11:44
Excel にやらせる仕事と C#(.NET) にやらせる仕事はきっちり把握できていますか?
また両者の関係はどうなっていますか?(どっちが親でどっちが子供?)

本当にマクロにやらせる必要がありますか?
マクロだと1時間放置されると使う側はつらい気がする。

「吐き出すコメント」はどこにどのように吐き出されるんですか?
_________________
かるあ のメモスニペット
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-18 11:53
引用:

stoneさんの書き込み (2007-05-18 11:01) より:

excelを操作する場合は、COMの関係でマクロを実行した方がよいと、じゃんぬねっと様がよく書かれています。


餅は餅屋、COM を扱うなら COM ベースの言語ということですね。
たとえば、Excel 側のマクロや Script でも良いでしょう。

引用:

Excelは、最後まで動いて(1時間ほど)くれて結果はOKですが、その間に吐き出すコメントをc#側で受取りたいのです。方法はあるのでしょうか?
あちこち見てはいるのですが見つかりません。ご教授願えませんか?


件名にある "return" に沿った形で考えますと、
Application インターフェイスの Run メソッドの戻り値になるのでしょう。
しかし、処理を細かく分ける必要があり途中経過を知るという意味では現実的ではありません。

最も安易に思いつくのが 「外部ファイル」 を介する方法ですが、
これも C# 側で監視する必要が生じるため好ましいとは言えないでしょう。
どうも Excel マクロ側に移譲してしまうと自由度が効かなくなります。

マクロではなくて Script という方法も視野に入れるのであれば、
ScriptControl を使って C# 側から 1 ステートメント単位で実行するという方法があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-05-18 11:58
 EXCEL占有時間が1時間もあるならこちらもチェック。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36735&forum=7
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-05-18 15:52
かるあ様、じゃんぬねっと様、ラフィン様 ありがとうございます。
何につけ書込んでいただけると心強いです。

引用:

かるあさんの書き込み
両者の関係はどうなっていますか?(どっちが親でどっちが子供?)
「吐き出すコメント」はどこにどのように吐き出されるんですか?



C#が親でして、フォームで複数の任意のExcelファイルから選択し処理します。
その処理の過程をc#のフォームに表示し最終的にはテキストファイルに保存します。
結果に疑問がある場合に後追いできるようにしたいと思っています。

引用:

じゃんぬねっとさんの書き込み
件名にある "return" に沿った形で考えますと、
Application インターフェイスの Run メソッドの戻り値になるのでしょう。
しかし、処理を細かく分ける必要があり途中経過を知るという意味では現実的ではありません



Run メソッドを使うということで可能なのですね。ただ、現実的でないと、、、、


引用:

最も安易に思いつくのが 「外部ファイル」 を介する方法ですが、
これも C# 側で監視する必要が生じるため好ましいとは言えないでしょう。



c#が外部ファイルをあるタイミングで見に行くと考えたらいいのでしょか。
その場合、かなりのリソースを使うのでしょうか。

引用:

マクロではなくて Script という方法も視野に入れるのであれば、
ScriptControl を使って C# 側から 1 ステートメント単位で実行するという方法があります。



Scriptについては、今はさっぱりわかりませんが、方法論として1番であるとするなら勉強してみたいと思います。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 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 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-05-18 21:53
引用:

stoneさんの書き込み (2007-05-18 15:52) より:

引用:

かるあさんの書き込み
両者の関係はどうなっていますか?(どっちが親でどっちが子供?)
「吐き出すコメント」はどこにどのように吐き出されるんですか?



C#が親でして、フォームで複数の任意のExcelファイルから選択し処理します。
その処理の過程をc#のフォームに表示し最終的にはテキストファイルに保存します。
結果に疑問がある場合に後追いできるようにしたいと思っています。


たぶんいちばん簡単なのは じゃんぬねっとさん もあげている吐き出したテキストファイルを監視してそこからメッセージを取り出す方法。

やっぱりマクロ側の処理を減らすことはできないですか?
個人的には計算などの処理は .NET 側で出来るだけ行って、Excelのマクロではできるだけ簡単にしてあげたい気分はあります。
そうすれば進捗メッセージの表示も、もう少し簡単にできる気がする。

また、todo さんの挙げている ExcelCreator っていう選択肢も悪くないですね。

#メッセージ通信をしてもいいのかな。
_________________
かるあ のメモスニペット
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-19 00:13
引用:

stoneさんの書き込み (2007-05-18 15:52) より:

Run メソッドを使うということで可能なのですね。ただ、現実的でないと、、、、


マクロ内の関数を実行する時、今の実装で Run メソッドを使っていますよね。(たぶん)
このメソッドの戻り値は System.Object 型なのでだいたい何でも返すことはできます。

ただし、あくまで関数の戻り値なので途中経過を返すという使い方には向いていない、ということです。

引用:

c#が外部ファイルをあるタイミングで見に行くと考えたらいいのでしょか。
その場合、かなりのリソースを使うのでしょうか。


外部ファイルを読みに行くわけですから、リソースの量よりか安定性が心配ですね。

引用:

Scriptについては、今はさっぱりわかりませんが、方法論として1番であるとするなら勉強してみたいと思います。


C# 側から動的のソースコードを生成し、ステートメント単位で実行できるものとお考えください。
ScriptControl については、リファレンスをご覧ください。

ところで、優秀な皆さまと違って私は本題しか触れていませんでしたが、
1 時間もマクロ側で何を処理しているのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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