0

私の問題は、タイトルのエラーメッセージです。

COM object that has been separated from its underlying RCW cannot be used.

グーグルしようとしましたが、デストラクタ/リリースオブジェクトに関連する解決策しか見つかりませんでした。それは私がやりたいことではありません。

まず、私のコードは次のとおりです。

String^ filename="c:\\wb.xlsx";
Microsoft::Office::Interop::Excel::Application^ exApp= gcnew Microsoft::Office::Interop::Excel::ApplicationClass();
exApp->Visible=false;
exApp->Workbooks->Open(filename, 2, true, Type::Missing, Type::Missing, Type::Missing, true, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing);
Worksheet^  exWss;
for (int x = 0; x <= checkedListBox1->CheckedItems->Count - 1; x++){
    for (int p=0; p<checkedListBox1->Items->Count; p++){
        if (checkedListBox1->CheckedItems[x]->ToString()->Equals(checkedListBox1->Items[p]->ToString())){
            p++;
            exWss  = safe_cast<Worksheet^> (exApp->ActiveWorkbook->Sheets[p]);
        }
    }
}

要するに:私はチェックリストボックスを持っています、コードのこの部分は必要なものが選択されたときに実行されます。チェックリストボックスには、Excelブックのさまざまなシートが一覧表示されます。チェックリストボックスで選択した項目に従って、ブックからシートを選択しようとしています。

最後のコード行(exWss = safe_cast(exApp-> ActiveWorkbook-> Sheets [p]);)で、前述のエラーメッセージが表示されます。

マーシャルの解放がそのような問題を引き起こす可能性があることを私は見ました。別の関数では、Marshal.Releasecomobjectを実行していますが、完全に分離されており、それがなくても同じエラーが発生します。

任意のアイデアをいただければ幸いです。

4

1 に答える 1

0

何らかの理由で、「for」ブロックが Interop オブジェクトを残りのコードから完全に分離しているようです。「for」ブロック内でInteropオブジェクトを初期化することで、問題を解決できました。(ワークブックが既に開かれているかどうかを示す bool 変数を導入しました。false の場合は、「for」ブロック内で開きます。それ以外の場合は続行します)

興味深いことに、オブジェクトは「for」ブロックから問題なくアクセスできます。それには説明があると思いますが、私にはわかりません-私は初心者であり、趣味のプログラマーのみです。

于 2012-12-30T22:01:42.367 に答える