- PR -

C#  Excelの列を削除するには

1
投稿者投稿内容
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-02-19 21:25
初心者です。
C#でExcelの列の削除をしたくて、Webのあちこちを探し、以下の方法でと思ったのですが、エラーになります。

ws.get_Range("1:1", Type.Missing.Value).Delete();
「エラー:objectにValueの定義がありません」となります。

また、
using Excel = Microsoft.Office.Interop.Excel;を記述すると、上記のエラーはなくなりますが、
「エラー:Interopは名前空間Microsoft.Officeに存在しません」となります。

何を定義すればいいのか分りません。ご教授お願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-19 22:26
引用:

stoneさんの書き込み (2007-02-19 21:25) より:

C#でExcelの列の削除をしたくて、Webのあちこちを探し、以下の方法でと思ったのですが、エラーになります。
ws.get_Range("1:1", Type.Missing.Value).Delete();
「エラー:objectにValueの定義がありません」となります。


列を削除するには、Excel.Column から Delete メソッドを呼び出します。

引用:

また、using Excel = Microsoft.Office.Interop.Excel;を記述すると、上記のエラーはなくなりますが、「エラー:Interopは名前空間Microsoft.Officeに存在しません」となります。


コンパイル エラーがなくなっているわけではありません。
それ以前の段階でコケているため、違うコンパイル エラーになっているだけです。
(参照できていない段階ですから...)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-02-20 22:27
じゃんぬねっと様、ありがとうございます。

引用:

列を削除するには、Excel.Column から Delete メソッドを呼び出します。


わたくし、初心者(素人)なので、よくわからないのですが、Excel.ColumのExcelは、
オブジェクトという事なのでしょうか。Excel.Columを使っていろいろ試行錯誤したの
ですが、どうもうまくいきませんでした。それで、以下のように記述するとそれなり
に動きました。多分、邪道なのでしょうね。実はそれすら分らないのです。

Excel.Range col = (Excel.Range)ws.Columns;
col = (Excel.Range)ws.Columns[19, Type.Missing];
col.Delete(Type.Missing);

じゃんぬねっと様が書かれた「Excel.Column から Delete メソッドを呼び出す」の
は、どのように記述するのか、参考例をいただけませんでしょうか。

引用:

コンパイル エラーがなくなっているわけではありません。
それ以前の段階でコケているため、違うコンパイル エラーになっているだけです。
(参照できていない段階ですから...)


そうなんですね。恥ずかしい限りです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-20 23:27
引用:

stoneさんの書き込み (2007-02-20 22:27) より:

Excel.Range col = (Excel.Range)ws.Columns;
col = (Excel.Range)ws.Columns[19, Type.Missing];
col.Delete(Type.Missing);


やり方は間違っていません。

しかし、最初の ws.Columns の参照がデクリメントされる前に、
同じ変数 col に別のインスタンスを格納しているのはまずいですね。
ReleaseComObject メソッドのことをご存知であれば、なぜまずいのかは想像できると思いますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-02-21 23:23
引用:

じゃんぬねっとさんの書き込み (2007-02-20 23:27) より:

しかし、最初の ws.Columns の参照がデクリメントされる前に、
同じ変数 col に別のインスタンスを格納しているのはまずいですね。
ReleaseComObject メソッドのことをご存知であれば、なぜまずいのかは想像できると思いますが。




じゃんぬねっと様 ありがとうございます。
以前より「C#,VB.NET」を拝見させていただいています。
(車の)走らせ方ばかり考えていて、止め方をあまり考えていませんでした。
勉強させていただきます。
例を見ますと、最後の参照カウントから古い方へ順にデクリメントしているようです。あるいは、使わなくなったものはその都度デクリメントするのでしょうか。
(質問の仕方が変ですかね)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-21 23:35
引用:

stoneさんの書き込み (2007-02-21 23:23) より:

例を見ますと、最後の参照カウントから古い方へ順にデクリメントしているようです。あるいは、使わなくなったものはその都度デクリメントするのでしょうか。
(質問の仕方が変ですかね)


最後に書かれた "使わなくなったものはその都度デクリメントする" が該当します。

デクリメントする前に、別の参照を変数に入れてしまったら、どうなってしまいますか?
先に格納していたオブジェクトの、デクリメントする機会はどうなりますか?

このあたりの危険を犯してまで実装するよりは、素直に Excel VBA 側に処理を実装し、
それを C# から呼び出すような方法を取るのが望ましいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
stone
会議室デビュー日: 2007/02/19
投稿数: 8
投稿日時: 2007-02-21 23:48
引用:

じゃんぬねっとさんの書き込み (2007-02-21 23:35) より:

[デクリメントする前に、別の参照を変数に入れてしまったら、どうなってしまいますか?
先に格納していたオブジェクトの、デクリメントする機会はどうなりますか?

このあたりの危険を犯してまで実装するよりは、素直に Excel VBA 側に処理を実装し、
それを C# から呼び出すような方法を取るのが望ましいです。




じゃんぬねっと様
ありがとうございます。
そういう事なんですね。
勉強してみます。また、よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)