掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DataGridView をエクセルに出力 (ID:147614)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 普通にエクスプローラなどから開こうとしたら開けません。 > 何が原因なのでしょうか? 提示されたコードには COM オブジェクトの解放処理が漏れているため、 Excel が正しく終了されず、非表示のままゾンビプロセスとして 残っている可能性が考えられます。 (実行後、タスクマネージャーに Excel.exe が残っていませんか?) もしくは、再描画禁止またはユーザー操作禁止モードのまま Excel が閉じれられてしまい、次回起動時に真っ白になってしまうなどの 問題を起こしているパターンもあります。(今回はそうでは無さそうですが) > 2000、2003、2007と3種類存在しています。 複数の Excel バージョンが混在しているというのは、 実行環境でしょうか、それとも開発環境でしょうか。 ・VB6 や VBA では、変数に Nothing を代入することでオブジェクト参照を 解放できるのですが、VB.NET から扱う場合はそれでは不十分です。 .NET のメモリ管理と ActiveX のメモリ管理は異なるため、この場合は Marashal.RelaseComObject メソッドを利用しないと早期解放されません。 ・.NET からの Excel 2000 の制御は、あまりお勧めしません。Office XP や 2003、2007、2010 にはプライマリ相互運用機能アセンブリ(PIA)が 提供されていますが、2000 や 97 用のものは用意されていないためです。 (保証されていないというだけで、PIA でなくても一応呼べますが…) ・開発環境の Excel バージョンと実行環境の Excel バージョンは できるだけ一致させてください。統一できない場合は、 「実行環境のExcelバージョン ≧ 開発環境のExcelバージョン」 にしておくと、呼び出し時の問題を軽減できます。 ・開発側のバージョンの方が高くても呼び出せないわけではありませんが、 一部のメソッドで、引数の数が異なっているとか、Sub が Function に 拡張されるといった違いがあるため、そのままだと実行時エラーに なってしまう物があります。この場合、下位互換の隠しメソッドに 置き換えるなどで対処は可能ですが、Excel の各バージョンの差異を 理解している必要があるため、実装難易はやや上がります。 ・バージョンを限定できない場合には、参照設定して使うことを諦め、 すべてレイトバインドで実行するという手もあります。この場合は バージョンの差異をかなり吸収できますが、この場合、参照カウントが 意図せず増加してしまうことがあるため、オブジェクトの後始末処理に、 多少手を入れねばならないかも知れません。 > xlApp.Workbooks.Add() > xlBook = xlApp.Workbooks(1) Workbooks(1) で受けるのではなく、 Add メソッドの戻り値から Workbook を得るようにすべきです。 ただしその前に、Workbooks プロパティも変数に受けるようにしましょう。 そうしないと、オブジェクトを正しく ReleaseComObject できないため、 Excel が正しく終了しなかったり、2回目以降の操作に支障をきたすなどの 弊害をもたらします。 http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm そのほか、Worksheets や Range の使い方にも問題があるので、 一度、上記の URL に目を通しておかれることをお奨めします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.