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

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

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

Re[2]: C# ExcelのRangeについて


(過去ログ 107 を表示中)

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

■63830 / inTopicNo.1)  C# ExcelのRangeについて
  
□投稿者/ あらいぐま (1回)-(2012/10/16(Tue) 02:21:06)

分類:[C#] 

はじめまして。
本当にド素人な質問をさせてください。

win7(64bit)、Microsoft Visual C# 2010 Expressを使用してExcel2010のシートの内容を参照しようとしているのですが・・・

1)やりたいこと
指定したシート内のセルの内容を、列(具体的にはC列)の内容を行毎に参照したい。


2)やったこと−1
ファイルをOPENし、指定したシートの、指定したセルの内容を参照

==以下、シート指定をした後の処理==
int y = 1;
string strval, cval = "";

Microsoft.Office.Interop.Excel.Range xlRange = oSheet.Cells[y, 3];
cval = xlRange.Value;
strval = cval + "\n";
textBox3.Text = strval;
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
y=y+1;
==ここまで==
で行うと、C1の内容をtextBox3に表示できたので、、、

2)やったこと−2
C列の全行内容を取得しようと思い
==以下、やってみた処理==
int krow;
int y = 1;
string strval, cval = "";
krow = oSheet.UsedRange.Rows.Count;

for(inti=1;i<krow;i++)
{
 Microsoft.Office.Interop.Excel.Range xlRange = oSheet.Cells[y, 3];
 cval = xlRange.Value;
  if(cval!=null)
  {
   strval=cval+"\n";
   System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
  }
 y=y+1;
}
==ここまで==
と、シートで使用している最大行数分を参照しようとすると
 cval = xlRange.Value;

「RuntimeBinderExceptionはハンドルせれませんでした」
「型'double'を'string'に暗黙的に変換できません」
とエラーになります。

ローカル変数を見ると、
strvalには、C1の内容が入ってました。


2)やったこと−3
→2)やったこと−1
の内容を2度繰り返したら、
Microsoft.Office.Interop.Excel.Range xlRange = oSheet.Cells[y, 3];
の「xlRange」で、かぶりエラーとなりました。


3)対処について教えてください
このような場合、気にせず
Microsoft.Office.Interop.Excel.Range xlRange1 = oSheet.Cells[1, 3];
Microsoft.Office.Interop.Excel.Range xlRange2 = oSheet.Cells[2, 3];
Microsoft.Office.Interop.Excel.Range xlRange3 = oSheet.Cells[3, 3];
Microsoft.Office.Interop.Excel.Range xlRange4 = oSheet.Cells[4, 3];



と想定される分を指定して、forでループ処理を行数分した方がよいのか
根本的に他の方法で、対処できるものなのでしょうか?

お手間おかけますが、どなたかよろしくお願い致します。

引用返信 編集キー/
■63831 / inTopicNo.2)  Re[1]: C# ExcelのRangeについて
□投稿者/ 魔界の仮面弁士 (66回)-(2012/10/16(Tue) 03:35:29)
No63830 (あらいぐま さん) に返信
> krow = oSheet.UsedRange.Rows.Count;
COM 参照を変数に受けましょう。

Microsoft.Office.Interop.Excel.Range range1 = oSheet.UsedRange;
Microsoft.Office.Interop.Excel.Range range2 = range1.Rows;
krow = range2.Count;
Marshal.ReleaseComObject(range2);
Marshal.ReleaseComObject(range1);


> for(inti=1;i<krow;i++)
> {
>  Microsoft.Office.Interop.Excel.Range xlRange = oSheet.Cells[y, 3];
>  cval = xlRange.Value;
>   if(cval!=null)
>   {
>    strval=cval+"\n";
>    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
>   }は
>  y=y+1;
> }
Cells プロパティを変数に受けましょう。

strval = "";
range1 = oSheet.Cells;  // .Range とは異なり、.Cells は引数なしのプロパティであることに注意
for(int rowIndex = 1; rowIndex <= krow ; rowIndex++)
{
 xlRange = range1[rowIndex, 3];
 dynamic cval = xlRange.Value;
 if(cval != null)
 {
  strval += cval.ToString() + "\n";
 }
 Marshal.ReleaseComObject(xlRange);
}
Marshal.ReleaseComObject(range1);



> と、シートで使用している最大行数分を参照しようとすると
>  cval = xlRange.Value;
個の変数 cval は dynamic 型でしょうか、object 型でしょうか。それとも…?


> 「RuntimeBinderExceptionはハンドルせれませんでした」
Value プロパティが返しうる値は、double / string / 2 次元配列などがあります。
あるいは DateTime が返されることもありますし、値セット時には 1 次元配列も渡せます。

データ内容に応じた処置を施してください。


> 「型'double'を'string'に暗黙的に変換できません」
> とエラーになります。
極端な話、
   dynamic o = 3.0;
   string cval = o;   // string cval = o.ToString();
というコードでも、同様のエラーは生じますよね。

「cval = xlRange.Value;」の Value が返す値が何になっていて、
そして変数 cval の型は何にしているのか、改めて確認してみてください。


> Microsoft.Office.Interop.Excel.Range xlRange = oSheet.Cells[y, 3];
> の「xlRange」で、かぶりエラーとなりました。
「かぶりエラー」というのは何ですか?


> 想定される分を指定して、forでループ処理を行数分した方がよいのか
Offset プロパティを使う手もありますね。


> 根本的に他の方法で、対処できるものなのでしょうか?
C 列の内容を取りたいのなら、
 xlRange = oSheet.Range["C1:C" + krow];
 object[,] values = xlRange.Value;
 Marshal.ReleaseComObject(xlRange);
のように、複数セルの内容をまとめて配列に取得できますよ。

引用返信 編集キー/
■63835 / inTopicNo.3)  Re[2]: C# ExcelのRangeについて
□投稿者/ あらいぐま (2回)-(2012/10/16(Tue) 10:48:17)
2012/10/18(Thu) 01:24:26 編集(投稿者)

No63831 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士様

お世話になります。
動きました!期待通りの処理ができました!!ありがとうございます。

> 「型'double'を'string'に暗黙的に変換できません」
> とエラーになります。
というところで
> dynamic cval = xlRange.Value;
もfor文の中で試していたのですが、その際エラーが出たので(for文の外で実行したらOKなのは確認しました)
「cval」をstringにしfor文の外で実行したら値が取得できたので、やれるのかと思ってしまいました。
そもそも、ReleaseComObjectを理解できてなく、最大行数分のところが足りてなかったのを全く理解せず
型の問題でエラーが出ているかと思い込んでました。



>>根本的に他の方法で、対処できるものなのでしょうか?
> C 列の内容を取りたいのなら、
>  xlRange = oSheet.Range["C1:C" + krow];
>  object[,] values = xlRange.Value;
>  Marshal.ReleaseComObject(xlRange);
> のように、複数セルの内容をまとめて配列に取得できますよ。
>

ありがとうございます。この方法も別途試したいと思います。

本当にありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

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

管理者用

- Child Tree -