C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: Excel セルより読込 [1]


(過去ログ 16 を表示中)

[トピック内 31 記事 (21 - 31 表示)]  << 0 | 1 >>

■6060 / inTopicNo.21)  Re[18]: Excel セルより読込
  
□投稿者/ 片桐 (37回)-(2007/07/31(Tue) 10:52:04)
動かす事優先、それも選択肢の一つですので、私は「間違ってるよ」とは言いませんですよ。
がんばってください。お力になれず、すみませんです。

けれど、型をキャストする・型変換、という表現はVB.NET、.NET系の言語を扱っていく上でこれから先もぶつかる可能性があります。それくらい、避けて通れないものの一つなんです。
文法、というよりは、考え方・概念・用語・用法と言うほうが正しいと思いますから、どこかのタイミングで、キャスト・型変換とはどういうことか、をしっかりと自分なりにモノにしておくことをお勧めします。(.NETで苦しんでる自分の経験則として、これが判っているか否かで随分とトラブルや困りごとが減るんですよ、実際(^^;)


引用返信 編集キー/
■6068 / inTopicNo.22)  Re[3]: Excel セルより読込
□投稿者/ Jitta (381回)-(2007/07/31(Tue) 12:27:22)
No6007 (C#初心者 さん) に返信
> ■No6005 (IIJIMAS さん) に返信
> ご回答、ありがとうございます。
> なにぶん初心者なものでRangeメンバのことがよくわかっていません。

初心者だからわからないのではなく、調べていないからわからない、でしょ。
初心者って言葉は免罪符でも三つ葉葵の印でもありませんよ。

遠いところ、時間を共有できない人たちに聞くより、自分が主体となって動くほうが圧倒的に早いです。わからないから聞くではなく、わからないから調べる。調べたけど理解できないから聞く。ウェブコミュニティーは、そういう使い方をするところです(チャットは別)
引用返信 編集キー/
■6070 / inTopicNo.23)  Re[4]: Excel セルより読込
□投稿者/ 特攻隊長まるるう (76回)-(2007/07/31(Tue) 13:35:02)
2007/07/31(Tue) 15:26:53 編集(投稿者)

初心者という言葉を使うのは簡単なんですが。。。

> 納得はしていませんが、プログラムを動かすことを優先します。
納得と言うか。。。原因がつかめていないけど、何かおかしな動きになるプログラムを
そのまま放置することになりますから、それがユーザの手に渡って、実は致命的な
バグでシステムを壊しました。。。と言うことも有り得るわけです。

原発とかでやっちゃうと社会問題になると思いますが(^^;



>Valueの必要性もわかっています。
>しかし、私のパソコンではValueを入れるとエラーになり、
>Valueを無くすると正常なのです。
>そこで悩んでいるのです。

>もっとほかのところに原因があり、私のパソコン固有の症状なのかと悩んでいます。
>No6026で、再下行のValueを外すと正常に動きます。
>なぜなのでしょうか?

正直、こちらで発生しないので、原因が分からないのです。だから、条件を変えて
原因につながりそうなエラーメッセージが出ないか?原因が特定できるような動きを
しないか?プロパティ値が取れないか?。。。調査をすべき段階です。

そこで『原因は何ですか?』『動くからいいのでは?』と言われては身も蓋も無いデス。
C#初心者さんが、ご自分の環境で調べないと分からない事です。
現状において回答者は、その為の助言を行っているだけです。
引用返信 編集キー/
■6080 / inTopicNo.24)  Re[5]: Excel セルより読込
□投稿者/ C#初心者 (21回)-(2007/07/31(Tue) 18:02:39)
みなさん、いろいろなアドバイス、ありがとうございます。

Jittaさん
> 初心者だからわからないのではなく、調べていないからわからない、でしょ。
> 初心者って言葉は免罪符でも三つ葉葵の印でもありませんよ。
安易に質問しているわけではなく、1ヶ月ぐらい悩んで、本もたくさん買ってきて勉強し、
ネットでもいろいろなところを調べて、ここにたどり着いたのです。

特攻隊長まるるうさん
> 正直、こちらで発生しないので、原因が分からないのです。だから、条件を変えて
> 原因につながりそうなエラーメッセージが出ないか?原因が特定できるような動きを
> しないか?プロパティ値が取れないか?。。。調査をすべき段階です。
私の知りたかったのは特攻隊長まるるうさんの解答でした。
上記のコードでエラーが発生するのは私のパソコンだけ。
私のパソコンの何かの設定がまずいのでしょう。
視点を変えて研究してみます。
ありがとうございました。


引用返信 編集キー/
■6086 / inTopicNo.25)  Re[6]: Excel セルより読込
□投稿者/ ぽぴ王子 (247回)-(2007/07/31(Tue) 18:31:38)
ぽぴ王子 さんの Web サイト
No6080 (C#初心者 さん) に返信

たぶんこのままだと荒れそうなので、ちょっとフォローを。

> 安易に質問しているわけではなく、1ヶ月ぐらい悩んで、本もたくさん買ってきて勉強し、
> ネットでもいろいろなところを調べて、ここにたどり着いたのです。

回答者にとっては、出された情報がすべてなのです。

C#初心者さんが
「安易に質問しているわけではない」
「1ヶ月ぐらい悩んだ」
「本もたくさん買ってきて勉強した」
「ネットでもいろいろなところを調べた」
ことは、ここで初めて表記されていますよね。その前に回答者が知り得た
情報といえば、C# を始めて1ヶ月ほどの初心者の方らしいということと(私
は試していませんが)他の方の環境とC#初心者さんの環境では動作が異
なっているらしいということぐらいでしょうか。

これまでのやりとりを拝見していると、互いの情報のやりとりがうまくいって
いなくて、回答者はほぼお手上げ状態(まるるうさんも『原因の調査をすべ
き段階』と書かれていますし)のように見えます。
たぶん横にいて指導することができればもっと解決できることがあるかもし
れませんが、我々にはそこまでする義理もなければ権限もありません。
結局のところ、与えられた情報(C#初心者さんが書かれた情報)を元に、
原因を推測して書き出すぐらいしかできないのです。
この場合、初心者かどうかは全く関係ありません。むしろ初心者である!
と明言することは「オラオラ、オレ様は初心者なんだからもっと懇切丁寧に
1から10まで教えろってんだコノヤロウ」と書かれている、という印象を与え
かねません。これはC#初心者さんがそう思っているかどうかは関係なく、
受け取る側でそう感じてしまう、ということです。なので「初心者という言葉
は使わない方が…」と皆さん書かれているのです。


現在はC#初心者さんからの情報待ちの状態になっていますので、なぜC#
初心者さんのパソコンでだけエラーが発生するのかをご自身で調査してい
ただく以外に解決方法はないと思います。なぜなら、それはC#初心者さん
以外の誰にもできないことですので。
なので、まずはその方向での調査をしていただくのが良いと思います。
引用返信 編集キー/
■6096 / inTopicNo.26)  Re[16]: Excel セルより読込
□投稿者/ mあ (34回)-(2007/08/01(Wed) 01:18:32)
2007/08/01(Wed) 01:31:26 編集(投稿者)

No6053 (C#初心者 さん) に返信
> oXL = new Excel.Application();
> oXL.Visible = true;
>
> oWB =
> oXL.Workbooks.Open(strFileName,
> Type.Missing, Type.Missing, Type.Missing, Type.Missing,
> Type.Missing, Type.Missing, Type.Missing, Type.Missing,
> Type.Missing, Type.Missing, Type.Missing, Type.Missing,
> Type.Missing, Type.Missing);
>
> oSheet = (Excel._Worksheet)oWB.ActiveSheet;
> oSheet.Cells[1, 1] = "test";

C# じゃなくてすんまそんですが・・・
http://officetanaka.net/excel/vba/file/file01.htm
VBAのサンプルにあったけど、Open() の引数って必須は1個だけだけど。。。

C#の関数プロトタイプは
http://msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel.workbooks.open(VS.80).aspx

ですね。
確かに多いけど、1つ目以外は省略可能ですけど・・・
省略可能なのに、Type.Missing って??
2番目の引数は省略可能ですが、省略しない場合は何か指定しないとダメぽ?

まぁ、根本的な解決には程遠いとは思うけど、Open("xxx.xls") だけにして
みたらどーです?


引用返信 編集キー/
■6098 / inTopicNo.27)  マルチレス
□投稿者/ 魔界の仮面弁士 (367回)-(2007/08/01(Wed) 02:24:59)
2007/08/01(Wed) 03:40:01 編集(投稿者)

No6009 (HiJun さん)
> oSheet.Cells[1, 1]の値は、Cellオブジェクトですので...
Cell オブジェクトではなく、Range オブジェクトではないかと。


No6019 (C#初心者 さん)
> Microsoft.Excel 11.0 Object Library を参照しています。
> こういった現象は私のパソコンだけなのでしょうか?
> Microsoft.Excel 12.0 Object Library だと正常に動きます。
実行環境の Excel バージョンと、開発環境の Excel バージョンを一致させてください。
Excel バージョンが異なると、正常に動作しない可能性が高いです。

たとえば、Workbooks の Open メソッドの引数の数は、Excel のバージョンによって異なります。
そのほか、古いバージョンでは戻り値が無い(void)メソッドだったのに、あるバージョンからは
オブジェクトを返すようになっていたり、新たなメソッドが追加されていたりするなど、
COM インターフェイスの差異が無視できないため、バージョン混在は基本的にできません。


No6056 (mあ さん)
> oSheet.Rows(1).Cells(1) とか、書けないのだろうか??
VBA なら書けますが、C# では書けません。

C# ではレイトバインドが使えないので、(他の方が書かれているように)キャストが必要です。

> Cells[]って古い書き方なんじゃ?
C# では引数付きプロパティがサポートされておらず、インデクサによって処理されるため、
言語仕様上、Cells[ ] での表現となります。別に古い書き方というわけではありません。


No6096 (mあ さん)
> C# じゃなくてすんまそんですが・・・
申し訳ないですが、質問者の方が混乱してしまいますので、VB6/VBA 系の情報は
引っ込めて、C# に限定した話でお願いできますでしょうか。>mあ さん


> 確かに多いけど、1つ目以外は省略可能ですけど・・・
VBA ならそうなのですが、C# ではそうではありません。

C# は、省略可能な引数をサポートしていないため、Optional 引数の部分には
すべて Missing を指定しなければならないのです。


No6025 (C#初心者 さん)
> PIAがインストールできていなかったようです。
PIA を使うか、(自動生成される)IA を使うかで、微妙にコードが異なってきますので、
サンプル等を真似る際には注意が必要ですね。

> oXL = new Excel.Application();
間違いではありませんが、この場合は
 oXL = new Excel.ApplicationClass();
の方が適切かと思います。(本題とは関係ありませんが)


> oSheet.Cells[1, 1].Value = "test";
> 再下行でValueがエラーになります。
C# で書く場合には、
 Excel.Range oCells = oSheet.Cells;
 Excel.Range oRange = (Excel.Range)oCells[1, 1];
 oRange.Value = "test";
または、
 Excel.Range oCells = oSheet.Cells;
 Excel.Range oRange = (Excel.Range)oCells[1, 1];
 oRange.set_Value(Type.Missing, "test");
となります。

いずれの構文になるのかは、Excel のバージョンによって異なります。
Excel 2000 以下であれば前者、Excel 2002 以上であれば後者です。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=7041&KLOG=6

# ただし、PIA を使っている場合は前者の表現となることもあります。


いずれにせよ、oCells[1, 1] の戻り値は object 型であるため、C# においては
Value プロパティを直接呼び出すことができません。(VB ならば呼べるのですが)
C# では、Excel.Range 型(または、Excel.IRange)へのキャストが必要になります。
引用返信 編集キー/
■6109 / inTopicNo.28)  Re[7]: Excel セルより読込
□投稿者/ クイン (1回)-(2007/08/01(Wed) 11:06:15)
No.6098 (魔界の仮面弁士さん)
>C# で書く場合には、
> Excel.Range oCells = oSheet.Cells;
> Excel.Range oRange = (Excel.Range)oCells[1, 1];
> oRange.Value = "test";

この場合(C#の場合)、本来の引数をとらないValueプロパティに対応するのはValue2ですので、
ValueではなくValue2を使うのが正しいと思うのですがどうでしょう。

#Excel.Rangeオブジェクトの取得はExcel.Worksheetオブジェクトのメソッドを使うことでもできますね。
#Excel.Range oRange = oSheet.get_Range("A1", "A1");
引用返信 編集キー/
■6117 / inTopicNo.29)  Re[8]: Excel セルより読込
□投稿者/ 魔界の仮面弁士 (369回)-(2007/08/01(Wed) 12:32:25)
No6109 (クイン さん) に返信
> この場合(C#の場合)、本来の引数をとらないValueプロパティに対応するのはValue2ですので、
> ValueではなくValue2を使うのが正しいと思うのですがどうでしょう。

限定条件下では、十分に代替手段とはなりえます。が、Value2 の方が正しいというわけではありません。

今回は、右辺が文字列であったため、Value2 でも置き換えが可能ですが、もし、右辺の変数が、
 DateTime str = DateTime.Now;
だった場合、Value2 プロパティだと異なる結果を生んでしまうかと思います。(ToOADate の代入に変換されてしまう)


もともと、やろうとしていることは、
> oSheet.Cells[1, 1] = str;
に対する処理でしたので、Value2 よりも Value の方が適切な置き換え(※)となるでしょう。


とはいえ、Value では扱いずらいのも事実なので、上記の点を踏まえた上であれば、
それを Value2 で代用するのも、有効な選択肢といえるかと思います。


---
(※) 厳密にいえば、IA の場合の正しい対応コードは、Value2 でも Value でもなく、
 oCell.set_Item(Type.Missing, Type.Missing, str); のようなメソッド呼び出しになります。
 (もっとも、これは Value への代入と同じ結果となりますが)
引用返信 編集キー/
■6122 / inTopicNo.30)  Re[9]: Excel セルより読込
□投稿者/ クイン (2回)-(2007/08/01(Wed) 14:30:20)
No6117 (魔界の仮面弁士 さん) に返信
> 今回は、右辺が文字列であったため、Value2 でも置き換えが可能ですが、もし、右辺の変数が、
>  DateTime str = DateTime.Now;
> だった場合、Value2 プロパティだと異なる結果を生んでしまうかと思います。(ToOADate の代入に変換されてしまう)

確かに・・・。(私は文字列に変換してValue2に渡してましたわ、ずっと)
Valueにこんな使い方があるとは知りませんでした。
Valueの扱い方がわからなくなってしまいました。
ただ、期待した結果になるかよく吟味しなければならないということですね。
引用返信 編集キー/
■6142 / inTopicNo.31)  Re[10]: Excel セルより読込
□投稿者/ IIJIMAS (12回)-(2007/08/02(Thu) 12:53:49)
2007/08/02(Thu) 12:57:56 編集(投稿者)
2007/08/02(Thu) 12:56:53 編集(投稿者)
2007/08/02(Thu) 12:54:44 編集(投稿者)

No6122 (クイン さん) に返信
> ■No6117 (魔界の仮面弁士 さん) に返信
>>今回は、右辺が文字列であったため、Value2 でも置き換えが可能ですが、もし、右辺の変数が、
>> DateTime str = DateTime.Now;
>>だった場合、Value2 プロパティだと異なる結果を生んでしまうかと思います。(ToOADate の代入に変換されてしまう)
>
> 確かに・・・。(私は文字列に変換してValue2に渡してましたわ、ずっと)
> Valueにこんな使い方があるとは知りませんでした。
> Valueの扱い方がわからなくなってしまいました。
> ただ、期待した結果になるかよく吟味しなければならないということですね。

皆様、私の最初の返信が明確でなかったために、グダグダなスレッドになってしまい申し訳ございませんでした。

最初の質問への回答は
string str = ((Excel.Range)oSheet.Cells[1, 1]).get_Value(Type.Missing).ToString();
でしたね。

クイン様と魔界の仮面弁士様のご投稿で結果的に私も勉強させていただきました。
私もいままでValueの代わりに気軽にValue2を使用していました。

参考リンクのURLも以下のをはればよかったのかもしれません。

マイクロソフトサポートオンライン
Visual C# で Excel を自動化して、配列による範囲内へのデータ入力および範囲内からのデータ取得を行う方法
http://support.microsoft.com/kb/302096/ja

MSDN Forums > Visual Studio Tools for Office > Visual Studio Tools for Office > Retrieve cell value
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=603852&SiteID=1

C# と VB.NET の質問掲示板>Excelのバージョンの違いをカプセル化する方法について
http://bbs.wankuma.com/index.cgi?mode=al2&namber=7041&KLOG=6

クイン様、魔界の仮面弁士様ありがとうございました。

#結果的に質問者のC#初心者様もこのスレッドでいろいろと(本題以外にも)ご参考になったのではないでしょうか。
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -