理想的には、私のUDFは、double [、]、double []の形式で、またはカスタムオブジェクトとして、いくつかのdouble結果を返します。すべてをExcelの単一のセルに保存してから、別のUDFを使用してそれらを抽出したいと思います。これは、計算結果をキャッシュして、後でオンデマンドで表示するのと似ています。
出来ますか?
理想的には、私のUDFは、double [、]、double []の形式で、またはカスタムオブジェクトとして、いくつかのdouble結果を返します。すべてをExcelの単一のセルに保存してから、別のUDFを使用してそれらを抽出したいと思います。これは、計算結果をキャッシュして、後でオンデマンドで表示するのと似ています。
出来ますか?
1つのアプローチは、Excel-DNAアドインに内部の「オブジェクトストア」を作成し、「ハンドル」を取得してオブジェクトにアクセスするアクセサ関数とともに、ある種の「ハンドル」をExcelに返す関数を作成することです。要求に応じ。作成できるオブジェクトのクリーンアップは問題になる可能性がありますが、RTD機能の一部を使用して対処できます。
Excel-DNAグループに関するこのディスカッションには、このアイデアをF#で実装する例があります-https://groups.google.com/group/exceldna/browse_frm/thread/138bc83923701e6d。
確かに可能ですが、ExcelDNAをどのように使用しているかを知らずに詳細な答えを出すことは困難です。私がそれによって意味するのは、C#メソッドをvbaコードでラップしているのか、それともC#でExcelアプリケーションのハンドルを取得して、そこから直接ブックに書き込んでいるのかということです。どちらの場合も、やりたいことができますが、その方法は少し異なります。ラッパーメソッドも少し柔軟性が低くなります。最初に値をvbaUDFに渡してから、そこからセルに書き込む必要があるため、返すことができるデータ型が制限されます(私がとにかく知っている)。
これを行う方法は、結果を特定のセルに、おそらく非表示のシートに書き込んで、改ざんされないようにし、別のUDFを使用してそれらを取得することです。セルアドレスをハードコーディングするか、シートを解析して必要な値を見つける必要があります。
を返すメソッドの場合、おそらく2つの異なるセルに値を書き込むか、1つのセルに区切り文字付きのテキストとして書き込み、セル値を取得double[,]
するときにテキストからdoubleに変換する必要があります。Double.Parse(cell.value.ToString().Split(',')[0])
純粋なvbaUDFを使用して値を取得する場合は、値(値をコンマ区切りの文字列として格納していると想定)または同様のコードをvbaに格納します。
これを実行したい場合は、値を格納するために、明確に定義された構造を持つ非表示のシートを使用する必要があると思います。セッション中に値を保存するだけでよい場合は、vbaモジュールのグローバル変数に値を保存する必要があると思います。
アップデート
関数を書いているだけなので、カスタムオブジェクトを渡すことはできないと思います(独自のコンバーターを実装し、それをテキストに変換してから、その方法で読み戻す場合を除きます)。
double
またはをUDFの変数に戻し、double[,]
そこからセルに書き込みます。次に、他のUDFを使用してそのセルから再度読み取ります。
残りは私が上で書いたものと同じです。同じセルに2つの値を格納する場合は、テキストとして保存する必要があるため、C#メソッドに渡す前に、まずUDFで値を分割して解析する必要があります(または、メソッドで解析を実行できます)。 )。
実際には、あなたがやろうとしていることに全く問題はないはずです。