QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

レイトバインドによるExcel操作

質問させて下さい。

データ入力集計ソフトを作成しまして、それらをExcel出力するのですが
ある壁にぶつかりました。
私の会社でのExcelのバージョンが統一されておらず
COMオブジェクトを使用しての作成は諦め、レイトバインドで
コードを書き直すことにしました。
しかし、C#でのレイトバインドコードは私にはとても難しく
調べている間に、VBでクラスライブラリを作成しそれを用いてExcel操作
するのがよい方法だと知り早速、作成しているのですが

・ファイルオープン・セルの参照等 基本的な事さえ解りません;
HPを参照しても、皆それぞれ同じレイトバインドでも操作方法が違ったりと

どこかExcel操作のお勧めサイト等あれば、教えて頂けないでしょうか。

質問者:seg

回答

segさんの書き込み (2006-12-20 10:41) より:

私の会社でのExcelのバージョンが統一されておらずCOMオブジェクトを使用しての作成は諦め、レイトバインドでコードを書き直すことにしました。

「遅延バインディング」 かどうかは、COM ラッパ オブジェクトを使用有無とは全く関係がないと思います。
遅延バインディングでも、Office PIA を利用していれば、COM ラッパ オブジェクトを使用します。

しかし、C#でのレイトバインドコードは私にはとても難しく調べている間に、VBでクラスライブラリを作成しそれを用いてExcel操作するのがよい方法だと知り早速、作成しているのですが

・ファイルオープン・セルの参照等 基本的な事さえ解りません;

HPを参照しても、皆それぞれ同じレイトバインドでも操作方法が違ったりと

どこかExcel操作のお勧めサイト等あれば、教えて頂けないでしょうか。

"VB になるとわからない" という範囲ではないと思います。(構文レベルのお話ではないですから)

とりあえず、実行環境では、型を明示化してソースを組んだ方が良いでしょう。
インテリセンスが使えますし、各メンバを参照しやすいです。
(あとで、遅延バインディングに変えるとしても、手間はかかりません)

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

回答ありがとうございます。

とりあえず、実行環境では、型を明示化してソースを組んだ方が良いでしょう。
インテリセンスが使えますし、各メンバを参照しやすいです。
(あとで、遅延バインディングに変えるとしても、手間はかかりません)

私が困ってるのが、まさにここで素人プログラマなのでインテリセンスが無いと
ほぼ何も出来ません。。

MSのサイトからのソースを流用して作成しているのですが、

Dim objApp As Object
Dim objBook As Object
Dim objBooks As Object
Dim objSheets As Object
Dim objSheet As Object
Dim range As Object

' Instantiate Excel and start a new workbook.
objApp = CreateObject("Excel.Application")
objBooks = objApp.Workbooks
objBook = objBooks.Add
objSheets = objBook.Worksheets
objSheet = objSheets.Item(1)

range = objSheet.Range("A1")

'Set the range value.
range.Value = "Hello, World!"

'Return control of Excel to the user.
objApp.Visible = True
objApp.UserControl = True

COMオブジェクトの参照設定をしていないからでしょうか
インテリセンスが使えません;
どうすればインテリセンスが使えるようになるのでしょうか?

素人質問で申し訳ないです。

投稿者:seg

編集 履歴 (0)

segさんの書き込み (2006-12-20 11:56) より:

COMオブジェクトの参照設定をしていないからでしょうか

インテリセンスが使えません;

どうすればインテリセンスが使えるようになるのでしょうか?

先にも書いたように "型を明示化" すれば良いです。

明示化するためには、seg さんがすでにご理解しているとおり、
参照設定に Office PIA 用の COM を一時的にでも加える必要があります。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

・ファイルオープン・セルの参照等 基本的な事さえ解りません;

Excel のヘルプを参照してください。
Excel オートメーションは、基本的に Excel VBA のオブジェクトモデルを公開したものです。

HPを参照しても、皆それぞれ同じレイトバインドでも操作方法が違ったりと

仕方ありません。
ある目的を達成するのにいくつかの通り道があるのは当たり前の話ですし、同じ操作をするにしても Excel のバージョンによってメソッド引数などが異なったりします。

どこかExcel操作のお勧めサイト等あれば、教えて頂けないでしょうか。

特定の操作の事例が必要なら、VBA 関係のサイトを探した方が早そうです。

あと、Excel の操作をマクロに記録して、自動生成された VBA のソースを読んで Excel オートメーションの手順を考える、というのを個人的にはよくやります。

投稿者:渋木宏明(ひどり)

編集 履歴 (0)

参照設定に Office PIA 用の COM を一時的にでも加える必要があります。

そうすることによって、インテリセンスは使えるようにはなりますが
メソッドが違うみたいです、例えばRangeを参照する際だと
COM:xlSheets.get_Range(xlSheets.Cells[1, 1],xlSheets.Cells[1, 1])
MSレイトバインド:objSheet.Range("A1")
となるみたいです。
やはりMSサイトに書かれている通りインテリセンス無しで、何度も動作確認を
しながら作成するしかないのでしょうか。

あと、Excel の操作をマクロに記録して、自動生成された VBA のソースを読んで Excel オ
ートメーションの手順を考える、というのを個人的にはよくやります。

C#でCOMオブジェクトを参照している時は、仰るとおりVBAソースから流用出来たのですが

Excel オートメーションは、基本的に Excel VBA のオブジェクトモデルを公開したものです。

ということは、まさにExcelVBAなのかな、試してみます。

じゃんぬねっとさん 渋木宏明(ひどり)さん
回答ありがとうございました。もう少し勉強してみます。

(引用の仕方が解らず可読性に欠けますがご了承下さい;)

投稿者:seg

編集 履歴 (0)

segさんの書き込み (2006-12-20 13:49) より:

そうすることによって、インテリセンスは使えるようにはなりますが

メソッドが違うみたいです、例えばRangeを参照する際だと

COM:xlSheets.get_Range(xlSheets.Cells[1, 1],xlSheets.Cells[1, 1])

MSレイトバインド:objSheet.Range("A1")

となるみたいです。

そうはならないと思いますが...
参照に加えた Microsoft Excel Object Library のバージョンはいくつでしょうか?

COM:xlSheet*s*.get_Range(xlSheets.Cells[1, 1],xlSheets.Cells[1, 1])

MSレイトバインド:objSheet.Range("A1")

'Sheet*s' が複数形になっているのが、気になります。
Excel.Worksheet 型と、Excel.Worksheet
s* 型は別物なのですから、比較する意味がありません。

# 再度申し上げますが、遅延バインディングを使用することと、
# COM ラッパーオブジェクトを使用することは、全く関係ありません。
# 「遅延バインディング」 の意味合いを、正確に理解しましょう。

最初の投稿に戻りますが、

しかし、C#でのレイトバインドコードは私にはとても難しく調べている間に、VBでクラスライブラリを作成しそれを用いてExcel操作するのがよい方法だと知り早速、作成しているのですが

こういうことであれば、Excel VBA マクロもしくは、VBScript に実装して、
C# からそれを呼び出す方が、COM を意識する必要が少なくなり安全です。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさんの書き込み (2006-12-20 13:59) より:

参照に加えた Microsoft Excel Object Library のバージョンはいくつでしょうか?

Excel2003の11.0になります。

'Sheet*s*' が複数形になっているのが、気になります。

Excel.Worksheet 型と、Excel.Worksheet*s* 型は別物なのですから、比較する意味がありません。

再度申し上げますが、遅延バインディングを使用することと、

COM ラッパーオブジェクトを使用することは、全く関係ありません。

「遅延バインディング」 の意味合いを、正確に理解しましょう。

sheetsの複数形は誤記です、申し訳ありません。
再度、MSのHPを参照しましたがどうやら私が勘違いをしていたようですね
Excelバージョンが違う⇒遅延バインディングなら大丈夫と安易に考えてました;

実際にエラーが起きたのはExcel2000で、恐らくOpenメソッドの引数の数違いで
例外がスローされたのだと思います。
値の参照・設定 セルの結合等 簡単な処理しかしていないので
例外を見直して、修正するのが早いかもしれませんね。
古いバージョンのExcelオブジェクトライブラリを使うには、Excelをバージョンダウン
するしかないのでしょうか?

こういうことであれば、Excel VBA マクロもしくは、VBScript に実装して、

C# からそれを呼び出す方が、COM を意識する必要が少なくなり安全です。

*.bas を読込んでExcel上で実行させる事が可能なのですか!?
すごい事が出来るんですね;

投稿者:seg

編集 履歴 (0)

segさんの書き込み (2006-12-20 14:30) より:

値の参照・設定 セルの結合等 簡単な処理しかしていないので例外を見直して、修正するのが早いかもしれませんね。

古いバージョンのExcelオブジェクトライブラリを使うには、Excelをバージョンダウン

するしかないのでしょうか?

引数の省略が可能なものは、引数のパラメータ名:= と書いて引数を指定すれば良いです。
下位互換性のために別名になっているだけのメソッドもあります。
こういう時こそ、遅延バインディングの出番だったりしますが。

*.bas を読込んでExcel上で実行させる事が可能なのですか!?

すごい事が出来るんですね;

標準モジュールに限った話でもないですが、可能です。
Excel.Application インターフェイスの Run メソッドがソレです。

過去ログにサンプル コードがあるハズなので、一度探されてみてはいかがでしょうか?

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさんの書き込み (2006-12-20 14:50) より:

引数の省略が可能なものは、引数のパラメータ名:= と書いて引数を指定すれば良いです。

下位互換性のために別名になっているだけのメソッドもあります。

こういう時こそ、遅延バインディングの出番だったりしますが。

:= ってそういう使い方だったのですか、
結局、同僚のExcel2000の入ったPCから抽出したライブラリで組み直したのですが
上記の様な手法もあったのですね。ありがとうございます勉強になりました。

標準モジュールに限った話でもないですが、可能です。

Excel.Application インターフェイスの Run メソッドがソレです。

過去ログにサンプル コードがあるハズなので、一度探されてみてはいかがでしょうか?

探してみてそちらも検討したいと思います。

どうもありがとうございました。

投稿者:seg

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。