- PR -

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

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-19 00:18
引用:

かるあさんの書き込み (2007-05-18 21:53) より:

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


うーん、作り込み的には 1 番面倒だと思いますよ。
FileSystemWatcher あたりを使ったとしても、面倒は面倒ですね。

ScriptControl を通じての実行であれば、タイミングは C# 側が知っています。

# 私のサイト、こういう大事なところが全く書かれていないですね... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-05-19 11:05
引用:

じゃんぬねっとさんの書き込み (2007-05-19 00:18) より:

うーん、作り込み的には 1 番面倒だと思いますよ。
FileSystemWatcher あたりを使ったとしても、面倒は面倒ですね。

ScriptControl を通じての実行であれば、タイミングは C# 側が知っています。

# 私のサイト、こういう大事なところが全く書かれていないですね... orz


ありゃ、 FileSystemWatcher で面倒だといわれると確かに面倒ですね。。。
まぁあれもタイミングの問題もあるし。

ScriptControl って全然知らなかったんですが、意外と使えそう。
調べたら NyaRuRu さんのところ経由で じゃんぬねっとさん に行き着いたw
_________________
かるあ のメモスニペット
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-05-21 22:11
todo様、かるあ様、じゃんぬねっと様 

皆様ありがとうございます(お礼申し上げるのが遅くなりました)

【todo様へ】

引用:

todoさんの書き込み

本題とは外れますが、Excelのマクロで1時間もかかっているところに問題はないのでしょうか?
ちょっとしたテクで飛躍的に改善する場合もあります。


今回の質問とは、別の意味で役立たせていただきます。
以前、Office TANAKA(さん)のHPは拝見したことがあります。しかし、実はしっかり読んでいませんでした。よく読めば二次元配列と書いてあります(見落としています)。再度じっくり読みたいと思います。

引用:

todoさんの書き込み

また、ExcelCreatorを使うと、C#からxlsファイルを編集できます。
メーカーの情報を見ると、かなり速そうです。


一見しましたが、価格も高くないようですね。かるあ様もお勧めで。
ありがとうございます。


【かるあ様へ】
引用:

かるあさんの書き込み

やっぱりマクロ側の処理を減らすことはできないですか?
個人的には計算などの処理は .NET 側で出来るだけ行って、Excelのマクロではできるだけ簡単にしてあげたい気分はあります。


実は、まだ全てをEXCELマクロに渡しておらず、前段の作業をC#側でやっているのですが、実行時間が掛かり過ぎるような気がします。
それと、COMの関係(特に開放)がしっかりわかってないので、それが理解できるようになれば、c#側でやらせる事もできるのかと思っています(永遠にこないかもしれせんが)。

引用:

かるあさんの書き込み

そうすれば進捗メッセージの表示も、もう少し簡単にできる気がする。


はい、c#の部分では、メッセージの吐き出しはOKです。


【じゃんぬねっと様へ】

引用:

じゃんぬねっとさんの書き込み

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

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


Runメソッドと言うのは、RunMacro()のことでしょうか、まだ一気にそこまでいかずに、コマンドバーを使用しています。
Runメソッドを使えば、Excel側でメッセージをためこんで、マクロの終了時に一気にc#に戻り値として返すということもできそうですね。


引用:

じゃんぬねっとさんの書き込み

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


安定性の問題があるのは、キビシイですね。

引用:

じゃんぬねっとさんの書き込み

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


はい。
速度的には、どんなものなのでしょうか。

引用:

じゃんぬねっとさんの書き込み

1 時間もマクロ側で何を処理しているのでしょうか?


言葉で説明するとなると難しいですが、違う仕様で作成されているExcelの複数ファイルから、一致するデータで仕様の違うExcelファイルをオートマチカルに作成するとなります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-21 23:20
引用:

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

Runメソッドと言うのは、RunMacro()のことでしょうか、


いいえ、先にも書かせて頂いたとおり、Excel.Application インターフェイスの Run メソッドです。
この Run メソッドは VBA マクロ側のお好きな関数を呼び出すことができます。

引用:

まだ一気にそこまでいかずに、コマンドバーを使用しています。Runメソッドを使えば、Excel側でメッセージをためこんで、マクロの終了時に一気にc#に戻り値として返すということもできそうですね。


逐次戻り値を返す必要がないのであれば、それで良いと思います。

引用:

はい。
速度的には、どんなものなのでしょうか。


他の方法でも同じですがインタプリタレベルです。

引用:

言葉で説明するとなると難しいですが、違う仕様で作成されているExcelの複数ファイルから、一致するデータで仕様の違うExcelファイルをオートマチカルに作成するとなります。


それにしてもデータ量が多いのですね。
現在どのような実装をしているかわかりませんが、改善の余地はあると思いますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-05-22 14:58
じゃんぬねっと様

ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2007-05-21 23:20) より:

いいえ、先にも書かせて頂いたとおり、Excel.Application インターフェイスの Run メソッドです


そうでしたか、すみません。

引用:

この Run メソッドは VBA マクロ側のお好きな関数を呼び出すことができます。


このような記述を見るとわくわくするのは、私だけでしょうか。

引用:

逐次戻り値を返す必要がないのであれば、それで良いと思います。


本当は、逐次でいきたいのですが、このやり方で行く場合は、この方法しかないかと。後追いの目的は果たすことができますので。

引用:

それにしてもデータ量が多いのですね。
現在どのような実装をしているかわかりませんが、改善の余地はあると思いますよ。


はい。1つのファイルが10MBを軽く超えているので、前処理でそぎ落とす事も必要なのかと考えています。VBA側の作りの問題も当然見直しをかける必要があると思っています。

ScriptControlがいいのか、Excel.Application インターフェイスの Run メソッドで行くのがいいのか試行錯誤してみたいと思います。
明りが見えてきました。ありがとうございます。

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