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] メッセージの処理につながる可能性があり、コードの外部で発生するたびに、疑いを持たないタイミングで実行され、範囲が無効になる可能性があります。エラーが発生したときに実際にキャッチし、適切に「パント」する必要があります。
多分あなたは正しいです。「いつでも」でもいい。しかし、それはランダムではありません。誰かが行って範囲をいじる必要があります。
ちなみに、私は状況を裏切ろうとはしません。範囲参照テキストを保存しても、ユーザーが意図した別のデータ セットに対してアドインが動作するだけです。「正しい」ことは「優雅に失敗する」ことです。