0

現在、Excel 2003 の相互運用メカニズムを使用してRangesを操作しています。

一部の範囲をクラスのプロパティとして addin に保存することがありますが、後でそれらにアクセスしようとすると、COM オブジェクトがランダムに無効になることがあり、COM オブジェクトの各プロパティが「 COMException」をスローします。それらにアクセスしようとすると。

Excelが割り当てるオブジェクトとアドインが使用しているオブジェクトとの間に強い関連性はないと言われています。そのため、 .Net/C#の観点から見ても、「真の」Range オブジェクトはいつでもExcelによって解放される可能性があります。それらへの参照があります。

それで、後で安全に使用するために Range オブジェクトを存続させる方法があるかどうか疑問に思っていましたか?

備考 : Ranges自体の代わりにRangesを表す文字列(例: "A1") を格納するなどの回避策を使用できますが、これによりコードがクリーンではなくなります。

よろしくお願いします。

4

1 に答える 1

1

Excel が割り当てるオブジェクトと、アドインが使用しているオブジェクトとの間に強い関連性はないと言われています。

これは、Excel が "Flyweights" を使用しているという事実を指しています。Excel は内部で COM を使用しません。COMクライアント(アドイン、VBA、または外部アプリケーション)による要求を処理するために、必要に応じて内部構造(私はそれらを「ビュー」と考えています)にCOMラッパーを作成します。

...「真の」RangeオブジェクトはいつでもExcelによって解放される可能性があります

「いつでも」とは言いません。

Rangeオブジェクトまたはその他の COM オブジェクトを取得すると、COM オブジェクトはリリースされるまで (COM の意味で - IUnknown::Release()each を呼び出してAddRef()) 使用可能なままになります。

ただし、COM オブジェクトを保持していて、基になる構造が存在しなくなった場合、COM オブジェクトは無効になります。他に何ができるでしょうか?

あなたが を保持していRangeて、ユーザーが範囲が配置されていたワークシートを削除したとしましょう。何が起こるべきだと思いますか?Excelが「申し訳ありませんが、一部のコードがワークシートを保持しようとしているため、ワークシートを削除できません」というメッセージボックスをスローするわけではありません。ユーザーがデータを削除すると、Excel は準拠し、Rangeオブジェクトは対処する必要があります。アドインは、その可能性に備える必要があります。アドインで数式を提供する場合は、#REF などを返すようにします。

とにかくこれを積極的に検出する方法はないと思います。どこかに IsValid(myRange) メソッドがあるかどうかを確認しましたが、何も表示されませんでした。

とにかく、それが非常に役立つとは考えにくいです。多くのコマンドが [windows] メッセージの処理につながる可能性があり、コードの外部で発生するたびに、疑いを持たないタイミングで実行され、範囲が無効になる可能性があります。エラーが発生したときに実際にキャッチし、適切に「パント」する必要があります。

多分あなたは正しいです。「いつでも」でもいい。しかし、それはランダムではありません。誰かが行って範囲をいじる必要があります。

ちなみに、私は状況を裏切ろうとはしません。範囲参照テキストを保存しても、ユーザーが意図した別のデータ セットに対してアドインが動作するだけです。「正しい」ことは「優雅に失敗する」ことです。

于 2011-04-07T16:13:23.177 に答える