2011/02/09(Wed) 20:23:03 編集(投稿者)
■No56977 (魔界の仮面弁士 さん) に返信
早速のご指摘ありがとうございます。
>>・内容:C#でExcelに接続後
> Marshal.ReleaseComObject は?
まだ、調べていませんが、Excelを閉じてもプロセスに残ってしまうという事でしょうか?
これからちょっと調べてみます。
> 値を削除したセルを含めたくないなら、UsedRange プロパティを使ってみてください。
>
>>*今回やりたいことは、VBAで言うところの MsgBox SheetName.Cells(65563, 1).End(xlUp).Row です。
> それだと、一列目が未使用で、二列目以降からデータが記載されていたような場合に対応できないかと。
UsedRange。VBAでも使えたのですね。調べて初めて分かりました。
ということで、★★問題の箇所★★の部分を以下のように書き直してみました。
rng = ws.UsedRange;
MessageBox.Show(rng.get_End(Microsoft.Office.Interop.Excel.XlDirection.xlDown).Row.ToString() + ":" +
rng.get_End(Microsoft.Office.Interop.Excel.XlDirection.xlToRight).Column.ToString());
こちらの方法で最後の行と列を取得してみました。また、やっているうちに以下でも取得できるようになりました。
int EndRow = ws.get_Range("A1",TypeMissing).get_End(Excel.XlDirection.xlDown).Row;
ただし、後者の場合、最初や途中に抜けているセルがあると、魔界の仮面弁士さんの
>それだと、一列目が未使用で、二列目以降からデータが記載されていたような場合に対応できないかと。
のご指摘どおり、対応できません。
>>wb = ExcelApp.Workbooks.Open(ExcelFile,
> これだと、Workbooks の解放に問題が生じる可能性が高くなります。
> COM を扱う際に、2つ以上の「.」が続くような記述は避けた方が良いかと思いますよ。
> (名前空間を指定するための「.」は構いませんが)
知識不足のため、理解し切れていませんが、これから調べて見ようかと思います。
>>rng = ws.get_Range("A65536", ExcelApp.ActiveCell.get_End(Excel.XlDirection.xlUp));
> Active〜系プロパティは多用しないようにしましょう。コードが曖昧になります。
はい。その通りだと感じました。素人ながらVBAでもActiveCellは使わないようにしてました。
結果、何とか目的は達成できたと感じています。
しかし、「ここがおかしい!」等感じることがございましたら、大変恐縮ではございますが、
ご指摘お願いいたします。少し、日がたってから"解決済み"にしたいと思います。