C#にてExcel用のアドインを作成しています。
そのアドインは、独自の関数の挿入画面を表示し、こちらが用意したVBAの関数を呼び出してデータベースにアクセスする動きです。
この独自の関数の挿入画面上で引数にSUM()などのExcel関数を入力された場合、Excel標準の関数の挿入画面と同じように、
入力された関数の計算結果を右側に表示するような作りにしたいのです。
当初は独自の関数の挿入画面で引数に「SUM(B1:B10)+AVERAGE(C1:C5)」と入力されれば、その文字列を解析してどの関数が呼ばれているか抽出し、
Application.WorksheetFunction内のメソッドを呼び出そうかと考えたのですが、
作業量が多い上に自分の技術力が無いのでバグが発生する可能性が高く信頼に値しないということで、断念しました。
受け取った文字列をそのまま用いてWorksheetFunctionのメソッドを呼び出し、結果を受け取るということは可能でしょうか?
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>受け取った文字列をそのまま用いてWorksheetFunctionのメソッドを呼び出し、結果を受け取るということは可能でしょうか?
可能です。
元のブックを作業用ブックに丸コピーし、作業用ブックのどこか適当な未使用の空白セルにFormulaあるいはFormulaR1C1で文字列を式としてセットし、Valueでそのセルの値を取得すれば良いのです。
値の取得が終わったら、作業用ブックを破棄しましょう。
なお「OFFSET()ワークシート関数」などのように「式が入力されているセルの位置が計算式に影響する式」は使用できません。「どこか適当な未使用な空白セルの位置」が状況により変わる可能性がありますので。
また、入力した式が「シートの全セルを参照する式」や「特定の行の全列を参照する式」や「特定の列の全行を参照する式」の場合には「どこか適当な未使用な空白セル」が自分自身を循環参照する危険があるので、本当ならば
1.元のブックを作業用ブックに丸コピーする。
2.丸コピーした作業用ブックに「新規シート」を追加する。
3.「どこか適当な未使用な空白セル」に式をセット(このままでは循環参照する可能性がある)
4.そのセルを「コピー」するメソッドと「ペースト」するメソッドを呼んで、2.で作成した新規シートに貼り付ける(この時点で、式に別シート参照が自動的に付加され、循環参照は起きない筈)
5.貼り付けた方のセルの値を得る
6.作成した作業用ブックを破棄して閉じる
と言う作業が必要になるでしょう。
「計算式をコピペしたり、セルそのものをコピペしたり」は、エクセルで「マクロの記録」を開始してから手動でコピペを行い、記録したマクロを流用すると良いかも。
回答ありがとうございます。と同時にお礼が遅くなってしまい申し訳ありません。
教えて頂いた方法で実装してみたところ、問題が発生しました。
まず新しくブックを作成する点ですが、ブックを作成してシートを丸々コピーする際、
コピー元に大量のアドイン独自の関数が貼り付けられていると、DBからキャッシュしたデータに検索が走ってしまうため、パフォーマンスが落ちてしまいました。
なので、ブックを作成ではなく、同一ブック内にてシートを新規作成することで、ある程度はパフォーマンスを維持できたのですが、
上の人は気に食わないようで、リフレクションを使ってもっとスマートにやれと命令されました。
C#のワークシート関数は引数が省略出来ないはずだけど補填はどうすればいいか?
"=SUM(A1:B10)+AVERAGE(C5:D10)"と入力されていたら?
そもそもワークシート関数をリフレクションで呼び出せるのか?と色々分かっていません。
chie65535さんの回答自体はとても参考になりましたが、非常に申し訳ないのですが、
リフレクションを使うという案で引き続き回答を募集したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Excel(エクセル) Excelにの以下の設定方法について教えてください! C列にデータ入力の設定をしています。(出、入を 3 2022/06/22 01:33
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- Excel(エクセル) A列が指定数値以上になったらD列の計算式を変更 3 2022/07/11 11:03
- Excel(エクセル) Excelについて質問があります。 関数の数値入力についてなのですが、 b1にー c1に数値 がある 1 2023/05/28 12:13
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のセルが空白だったら、そ...
-
ExcelVBAを使って、値...
-
【Excel VBA】指定行以降をクリ...
-
【Excel】指定したセルの名前で...
-
i=cells(Rows.Count, 1)とi=cel...
-
特定の文字を条件に行挿入とそ...
-
DataGridViewの各セル幅を自由...
-
Excel vbaで特定の文字以外が入...
-
Excelのプルダウンで2列分の情...
-
Excelのハイパーリンクにマクロ...
-
【VBA】シート上の複数のチェッ...
-
Excelで指定した日付から過去の...
-
実行時エラー438 オブジェクト...
-
指定した条件で範囲選択したい
-
EXCELで変数をペーストしたい
-
VBAを使用した時間管理
-
EXCELのVBA-フィルタ抽出後の...
-
VBA初心者です。結合セルを保持...
-
UWSCで値のみコピーするには?
-
DataGridViewのセルのItem設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
i=cells(Rows.Count, 1)とi=cel...
-
【Excel VBA】指定行以降をクリ...
-
Excelで指定した日付から過去の...
-
【Excel】指定したセルの名前で...
-
Excel vbaで特定の文字以外が入...
-
特定の文字を条件に行挿入とそ...
-
TODAY()で設定したセルの日付...
-
screenupdatingが機能しなくて...
-
Excelのプルダウンで2列分の情...
-
EXCELで変数をペーストしたい
-
連続する複数のセル値がすべて0...
-
Excel VBA、 別ブックの最終行...
-
VBAを使用した時間管理
-
エクセルVBAでコピーして順...
-
セル色なしの行一括削除
-
【EXCEL VBA】Range("A:A").Fi...
-
VBA コピーして次の値まで貼り...
-
VBA初心者です。結合セルを保持...
おすすめ情報