0

C#2.0で記述されたExcelアドインがあり、奇妙な動作が発生しています。この動作はExcel2003でのみ見られ、Excel2007または2010では見られないことに注意してください。

問題:

ユーザーがインポートコマンドボタンをクリックすると、ファイルが読み取られ、Worksheet :: Shapes :: AddPicture()メソッドを使用して多数の図形が作成/ワークシートに追加されます。これらのShapeオブジェクトへの参照は、一般的なリストに保持されます。

List<Excel.Shape> list = new List<Excel.Shape>();

リストの参照が18未満になるまで、すべてが正常に機能します。カウントが18に達し、新しいShape参照が追加されると、最初の参照、つまり@index[0]が解放されます。その参照でメソッドまたはプロパティを呼び出すことができず、メソッド/プロパティを呼び出すとCOMException(0x800A1A8)、つまりObjectRequiredがスローされます。もう1つ追加すると、参照@[1]にアクセスできなくなります。

奇妙なことに...これはShapeオブジェクトでのみ発生します。つまり、1つのShapeを追加してから17個のnullをリストに追加すると、さらに17個のShapeオブジェクトが追加されるまでこれは発生しません。

カウントが18に達した後になぜそれが起こるのか誰かが知っていますか?

私はそれがリストのデフォルトの容量を持つものかもしれないと思いました。それらがリリースされる間に参照を再配置するようなものなので、1000の容量で初期化しましたが、それでも運がありません。

List<Excel.Shape> list = new List<Excel.Shape>(1000);

何か案が??


更新しました

文字列インデックスを介してShapeオブジェクトにアクセスしようとしたときに生成された例外が何らかの役割を果たしていることがわかりました。新しいShapeが追加されたら、Worksheet :: Shapes :: Item(shapename)を呼び出して、既存のShapeオブジェクトを確認します。Shapeが見つからない場合、これは例外をスローします。このコード行を削除すると...正常に機能します。

この例外を生成したり、コレクション全体を反復処理したりせずに、Shapeが存在するかどうかを確認する別の方法はありますか?

4

1 に答える 1

0

残念ながら、Excel には多くの邪悪な小さなバグがあります。UI と VBA の両方で。

そのうちの 1 つは、Excel で作成されたユーザー フォームに {特定の量} を超えるコントロールがある場合、 のフォームでコントロールを参照すると、Form.ControlName理由もなく Excel がクラッシュしますが、 のフォームで同じコントロールにアクセスするForm.Controls("ControlName")と機能します。大丈夫。

Worksheet::Shapesつまり、代わりに形状の文字列名を格納してみて、名前でコレクションをクエリして、必要になるたびに新しいポインタを取得してください。

于 2010-05-31T12:26:13.630 に答える