• 締切済み

文字列を用いてExcel関数を呼び出したい

C#にてExcel用のアドインを作成しています。 そのアドインは、独自の関数の挿入画面を表示し、こちらが用意したVBAの関数を呼び出してデータベースにアクセスする動きです。 この独自の関数の挿入画面上で引数にSUM()などのExcel関数を入力された場合、Excel標準の関数の挿入画面と同じように、 入力された関数の計算結果を右側に表示するような作りにしたいのです。 当初は独自の関数の挿入画面で引数に「SUM(B1:B10)+AVERAGE(C1:C5)」と入力されれば、その文字列を解析してどの関数が呼ばれているか抽出し、 Application.WorksheetFunction内のメソッドを呼び出そうかと考えたのですが、 作業量が多い上に自分の技術力が無いのでバグが発生する可能性が高く信頼に値しないということで、断念しました。 受け取った文字列をそのまま用いてWorksheetFunctionのメソッドを呼び出し、結果を受け取るということは可能でしょうか?

みんなの回答

回答No.1

>受け取った文字列をそのまま用いてWorksheetFunctionのメソッドを呼び出し、結果を受け取るということは可能でしょうか? 可能です。 元のブックを作業用ブックに丸コピーし、作業用ブックのどこか適当な未使用の空白セルにFormulaあるいはFormulaR1C1で文字列を式としてセットし、Valueでそのセルの値を取得すれば良いのです。 値の取得が終わったら、作業用ブックを破棄しましょう。 なお「OFFSET()ワークシート関数」などのように「式が入力されているセルの位置が計算式に影響する式」は使用できません。「どこか適当な未使用な空白セルの位置」が状況により変わる可能性がありますので。 また、入力した式が「シートの全セルを参照する式」や「特定の行の全列を参照する式」や「特定の列の全行を参照する式」の場合には「どこか適当な未使用な空白セル」が自分自身を循環参照する危険があるので、本当ならば 1.元のブックを作業用ブックに丸コピーする。 2.丸コピーした作業用ブックに「新規シート」を追加する。 3.「どこか適当な未使用な空白セル」に式をセット(このままでは循環参照する可能性がある) 4.そのセルを「コピー」するメソッドと「ペースト」するメソッドを呼んで、2.で作成した新規シートに貼り付ける(この時点で、式に別シート参照が自動的に付加され、循環参照は起きない筈) 5.貼り付けた方のセルの値を得る 6.作成した作業用ブックを破棄して閉じる と言う作業が必要になるでしょう。 「計算式をコピペしたり、セルそのものをコピペしたり」は、エクセルで「マクロの記録」を開始してから手動でコピペを行い、記録したマクロを流用すると良いかも。

goopencil
質問者

お礼

回答ありがとうございます。と同時にお礼が遅くなってしまい申し訳ありません。 教えて頂いた方法で実装してみたところ、問題が発生しました。 まず新しくブックを作成する点ですが、ブックを作成してシートを丸々コピーする際、 コピー元に大量のアドイン独自の関数が貼り付けられていると、DBからキャッシュしたデータに検索が走ってしまうため、パフォーマンスが落ちてしまいました。 なので、ブックを作成ではなく、同一ブック内にてシートを新規作成することで、ある程度はパフォーマンスを維持できたのですが、 上の人は気に食わないようで、リフレクションを使ってもっとスマートにやれと命令されました。 C#のワークシート関数は引数が省略出来ないはずだけど補填はどうすればいいか? "=SUM(A1:B10)+AVERAGE(C5:D10)"と入力されていたら? そもそもワークシート関数をリフレクションで呼び出せるのか?と色々分かっていません。 chie65535さんの回答自体はとても参考になりましたが、非常に申し訳ないのですが、 リフレクションを使うという案で引き続き回答を募集したいと思います。

関連するQ&A

専門家に質問してみよう