2

ExcelDna を使用して C# で単純な UDF を作成していたときに問題が発生しました

関数はこれを使用します:

  var reference = XlCall.Excel(XlCall.xlfCaller);
  string oldValue = ((ExcelReference)reference).GetValue().ToString();

関数をクラス 2 (数式に追加)としてマークする を指定しない限り、循環参照エラー ( GetValueUDF を再度呼び出してセルを再評価しようとする) が発生します。IsMacroType=true#

循環エラーにどのようにつながるかわかりません。ExcelReference.GetValue()しかし、セルを評価することもあれば、評価しないこともあると思いますか?

クラス 2 のみに影響するようですxlfCallerが、

その後、 のソース コードを確認したExcelReferenceところ、実際に呼び出されているのは xlCoerce であることがわかりました。

また、セルで F2 を押すとGetValue()、セルが何であっても 0 を返すことに気付きました。Ctrl+Alt+F9 を押すと、強制的にすべて再計算GetValue()され、以前に計算された値が返されます。

誰かがこれについてもう少し詳しく説明してもらえますか? xlCoerce はとにかくセル値/数式に対してどのように機能し、クラス 2 はそれにどのように影響しますか?

4

1 に答える 1

2

xlCoerce参照に含まれる値を取得する標準的な方法です。単独では、ExcelReference を使用してこの呼び出しを行っても、セルが再計算されることはありません。

関数がマクロ シートと同等の関数として登録されている場合 ( Excel-DNAIsMacroType=trueの宣言を追加することにより)、呼び出しセルの以前の値を含め、計算中にシート上の任意の値を読み取ることができます。F2 で数式を編集した場合、それは単なる再計算ではなく、セルの内容全体の再入力であるため、再計算を強制する場合とは動作が異なることは理にかなっています。

あなたの質問に直接答えるものではないかもしれませんが、Charles Williams が Excel の計算プロセスについてかなり詳しく書いています: http://www.decisionmodels.com/calcsecretsc.htm .

于 2012-11-16T12:06:14.857 に答える