- PR -

Visual Basicからエクセルの操作

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-19 21:47
引用:

ちゃっぴさんの書き込み (2006-05-19 02:34) より:

なお、

xlRange("A1:N2").Select()



xlRange.Range("A1:N2").Select()

とした場合には例外が発生しません。


このあたりの記憶は正しかったようです。

引用:

なんか方法あるんですか?


_Default の代わりに Range を使うのだと思っていました。
私の記憶では、むしろコンパイル エラーになる予定だったのですが、実行まではできるんですね。

引用:

ちなみに関係ないかも知れないですけど、VBA で

Range("A1:N2").Select

なんてのができるのは、この頭の Range property が Global class の property だからですね。
# この場合、省略されているのは property ではなく、object。
# う〜む。素晴らしすぎる(笑)


関係ありだと思いますよ。
でも、どういう仕組みだったのか覚えてません。
(その上、今は出張先にいるので検証できませんw)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-05-20 00:53
引用:

じゃんぬねっとさんの書き込み (2006-05-19 21:47) より:
_Default の代わりに Range を使うのだと思っていました。
私の記憶では、むしろコンパイル エラーになる予定だったのですが、実行まではできるんですね。



Compile error にはならないですね。
というのは、Excel.Range class の Range property は、Variant 型宣言ですから。
.NET にしたってそれを受けて Object 型宣言になっているので。

もっとも、Option Strict On を有効にした場合には前述の source では compile error になりますが、これは下記のようにすれば compile error になりません。

コード:
DirectCast(xlRange("A1:N2"), Excel.Range).Select()



引用:

引用:

ちなみに関係ないかも知れないですけど、VBA で

Range("A1:N2").Select

なんてのができるのは、この頭の Range property が Global class の property だからですね。
# この場合、省略されているのは property ではなく、object。
# う〜む。素晴らしすぎる(笑)


関係ありだと思いますよ。
でも、どういう仕組みだったのか覚えてません。



そもそも、VB.NET に VB(VBA) の Global class のようなしくみ用意されていましたっけ?

余談ですが、関連したところとして Range property と Cells property の違いちゃんと意識したほうがいいですね。

Object Browser で覗いてみると一目瞭然ですが、Range は必ず引数をとる property です。xlSheet が Excel.Sheet class の instance が格納されているとして、

コード:
xlSheet.Range("A1")


は、COM instance が 1つ参照されますが、Cells だと引数が存在しないので、

コード:
xlSheet.Cells(1, 1)


これは

コード:
xlSheet.Cells._Default(1, 1)


の省略形なので、2つの COM instance が参照されます。

まあ、ここら辺は Object Browser かじりついて見てみればそのうち気づくでしょう。

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2006-05-20 00:54 ]

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