- PR -

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

投稿者投稿内容
seg
会議室デビュー日: 2006/11/30
投稿数: 7
投稿日時: 2006-12-20 10:41
質問させて下さい。

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

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

どこかExcel操作のお勧めサイト等あれば、教えて頂けないでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-20 11:40
引用:

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

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


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

引用:

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

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

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


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

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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
seg
会議室デビュー日: 2006/11/30
投稿数: 7
投稿日時: 2006-12-20 11:56
回答ありがとうございます。

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

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

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

素人質問で申し訳ないです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-20 12:00
引用:

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

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


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

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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-12-20 12:02
引用:

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



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

引用:

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



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

引用:

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



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

あと、Excel の操作をマクロに記録して、自動生成された VBA のソースを読んで Excel オートメーションの手順を考える、というのを個人的にはよくやります。
seg
会議室デビュー日: 2006/11/30
投稿数: 7
投稿日時: 2006-12-20 13:49
>参照設定に 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なのかな、試してみます。

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

(引用の仕方が解らず可読性に欠けますがご了承下さい;)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-20 13:59
引用:

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:xlSheets.get_Range(xlSheets.Cells[1, 1],xlSheets.Cells[1, 1])
MSレイトバインド:objSheet.Range("A1")


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

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

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

引用:

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


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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
seg
会議室デビュー日: 2006/11/30
投稿数: 7
投稿日時: 2006-12-20 14:30
引用:

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

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


Excel2003の11.0になります。

引用:

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

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


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

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

引用:

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


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

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