C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Excel出力で行をコピーして挿入したい


(過去ログ 30 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■14095 / inTopicNo.1)  Excel出力で行をコピーして挿入したい
  
□投稿者/ まへ (1回)-(2008/02/08(Fri) 21:37:24)

分類:[.NET 全般] 

初めまして。いつもサイトや掲示板を拝見しております。
開発に行き詰ってしまい、何とか解決方法をご教授願いたいと思っております。
よろしくお願いします。

開発環境は VB.NET 2005
ローカルのエクセルのバージョンは2003、IISサーバーのバージョンは2000です。

やりたいことは、エクセルの任意の一行をコピーし、挿入することです。

sheet.Range("5:5").copy()         'sheet は Excel.WorkSheetです。
sheet.Range("5:5").insert()

この様に記述したところローカルでは、処理も成功しエクセルのプロセスも消えました。
サーバーで実行したところ、処理は成功していますがエクセルのプロセスが残ってしまいました。
正しくないコードを記述している所為だと思いますが、
解決方法に検討がつきません。
プロセスが残らない正しい記述方法を教えてください。
よろしくお願いします。

引用返信 編集キー/
■14098 / inTopicNo.2)  Re[1]: Excel出力で行をコピーして挿入したい
□投稿者/ 魔界の仮面弁士 (610回)-(2008/02/08(Fri) 23:42:58)
No14095 (まへ さん) に返信
> ローカルのエクセルのバージョンは2003、IISサーバーのバージョンは2000です。
IIS からの利用はお奨めできません。

> sheet.Range("5:5").copy() 'sheet は Excel.WorkSheetです。
> sheet.Range("5:5").insert()
これ、ローカルであっても、問題があるかと思いますよ。Copy や Insert を呼ぶ前に、
 R = sheet.Range("5:5")
 R.Copy()
 R.Insert()
 If Marshal.IsComObject(R) Then
  Marshal.ReleaseComObject(R)
 End If
のように、一度 Range 型の変数に受け取っておき、メソッド実行後に
オブジェクト解放のための ReleaseComObject メソッドの呼び出しが必要かと。


> この様に記述したところローカルでは、処理も成功しエクセルのプロセスも消えました。
その記述だと、解放漏れが出るはずなのですが…。
処理実行後、そのローカルアプリを終了させてはいませんか?

引用返信 編集キー/
■14186 / inTopicNo.3)  Re[2]: Excel出力で行をコピーして挿入したい
□投稿者/ まへ (2回)-(2008/02/12(Tue) 18:53:10)
No14098 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士さん、返信ありがとうございます。
返信が遅くなり申し訳ありませんでした。

>>ローカルのエクセルのバージョンは2003、IISサーバーのバージョンは2000です。
> IIS からの利用はお奨めできません。
そうなのですか。勉強不足です。
会社でこの環境でやるという方向だった為、疑問に思いませんでした。

>  R = sheet.Range("5:5")
>  R.Copy()
>  R.Insert()
>  If Marshal.IsComObject(R) Then
>   Marshal.ReleaseComObject(R)
>  End If
> のように、一度 Range 型の変数に受け取っておき、メソッド実行後に
> オブジェクト解放のための ReleaseComObject メソッドの呼び出しが必要かと。
ありがとうございます。
色々と試行錯誤を繰り返している段階で、上記のようなコードを記述しました。
エクセルのプロセスは無事消えましたが、思ったとおりの結果が得られませんでした。

その後もネットを調べながら試行錯誤した結果、
以下の記述方法で行のコピー貼り付けが成功しました。

Dim RangeToRow As Object = sheet.Rows
Dim CopyRange As Object = Nothing
CopyRange = RangeToRow("5:5")
CopyRange.Copy()
CopyRange.Insert()

MRComObject(RangeToRow)          'ReleaseComObjectで解放する処理
RangeToRow = Nothing
MRComObject(CopyRange)
CopyRange = Nothing

無事解決できました。ありがとうございます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -