- PR -

セル指定し中に入ってるデータを抽出する方法。

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

オウドーさんの書き込み (2007-06-06 13:59) より:

申し訳ありません。デバックも通りましたがやはりまだ値は出力されませんね。
System.Object[,]に変わりましたが。ああ、なんでだろう。。。


上記引用内容がいわゆる 「独り言」 「途中経過報告」 程度のものであれば、下記については無視してください。

'どこの' '何の' 話をしているのでしょうか? 式ウォッチで表示される型の話でしょうか? それとも出力しようとしている値の話でしょうか? 先ほどの話とは別のことでお悩みのようですが、先の問題から '何を' 'どのように' 変更して今に至っているのかがわかりません。

オウドーさんからすれば (主観的に見て) ご自身のコトですからご自身の事情は当たり前のようにわかっているでしょう。しかし私はオウドーさんが暗黙的に (当たり前だと) 理解されている前提や事情を知ることができません。

問題の解決をするにあたり、前提や状況説明は非常に大切です。なぜならば、その場にいない第三者は問題の原因すら推測できなくなるからです。

私に限らず回答者は現場にはいません。ディスプレイに映る文字だけを通して、質問者さんが抱える問題を理解し解決することになります。問題がうまく説明できない質問者さんはその状況を聞くことにより推測することができます。状況説明や問題に関する情報がないということは、回答者が問題解決するための唯一の手段が断たれていることに他なりません。

閑話休題。

Excel.Range のどのプロパティを使ってセルの中身にアクセスしようとしていますか? 言葉で説明が難しい場合は実装を提示して頂いた方が問題解決のお手伝いがしやすいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-06-06 14:52
引用:

'どこの' '何の' 話をしているのでしょうか? 式ウォッチで表示される型の話でしょうか? それとも出力しようとしている値の話でしょうか? 先ほどの話とは別のことでお悩みのようですが、先の問題から '何を' 'どのように' 変更して今に至っているのかがわかりません。

オウドーさんからすれば (主観的に見て) ご自身のコトですからご自身の事情は当たり前のようにわかっているでしょう。しかし私はオウドーさんが暗黙的に (当たり前だと) 理解されている前提や事情を知ることができません。

問題の解決をするにあたり、前提や状況説明は非常に大切です。なぜならば、その場にいない第三者は問題の原因すら推測できなくなるからです。

私に限らず回答者は現場にはいません。ディスプレイに映る文字だけを通して、質問者さんが抱える問題を理解し解決することになります。問題がうまく説明できない質問者さんはその状況を聞くことにより推測することができます。状況説明や問題に関する情報がないということは、回答者が問題解決するための唯一の手段が断たれていることに他なりません。

閑話休題。

Excel.Range のどのプロパティを使ってセルの中身にアクセスしようとしていますか? 言葉で説明が難しい場合は実装を提示して頂いた方が良いです。





申し訳ございません。少し熱くなってました。では、現在の状況をいわしてもらいます。
まず、ソースはこんな感じです。

string Name = openFileDialog1.FileName;
string n = Path.GetFullPath(Name);
string nn = Path.GetFileName(n);


Excel.Application exapp = new Excel.Application();

Excel.Workbooks ks = exapp.Workbooks;
Excel.Workbook kd = ks.Open(n, 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);


Excel.Sheets ss = kd.Worksheets;

Excel.Worksheet st = (Excel.Worksheet)ss[1];
Excel.Range ge = st.Cells;

Excel.Range GEGE = exapp.ActiveCell;
GEGE = st.get_Range("A1", "C5");

this.textBox1.Text = GEGE.Value2.ToString();

ks.Close();
exapp.Quit();

で、ビルドは通ります。そして、デバックをやります。デバックも見事成功。

その後、GEGE = st.get_Range("A1", "C5");の部分の[GEGE]をウォッチ式に。

そして、 this.textBox1.Text = GEGE.Value2.ToString();の部分の[this.textBox.Text]をウォッチ式に。すると、内容が[System.__Comobject]になっています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-06 15:06
引用:

オウドーさんの書き込み (2007-06-06 14:52) より:

Excel.Range ge = st.Cells;


ここまでは OK です。

引用:

Excel.Range GEGE = exapp.ActiveCell;


これが理解できません。すでに前述の 'ge' に Cells コレクションの参照が入っているのですから、ここで ActiveCell を取得する意味はありません。実際その直後に、

引用:

GEGE = st.get_Range("A1", "C5");


としており、'GEGE' は即刻参照を上書きされてしまっています。どう見ても ActiveCell の意味はありませんし、COM の参照カウントをデクリメントするタイミングを失っています。これは 「冗長ですよ」 という意味ではなく 「不具合を加えていますよ」 と受け止めてください。

引用:

GEGE = st.get_Range("A1", "C5");


この部分の意味は理解していらっしゃいますでしょうか?

変数 'ge' を利用して、ge[1, 1] で Excel.Range の参照を取り、その参照から Value プロパティを参照して値を取得するのが正しい方法です。'ge' が何のために参照を取っているのか実装者であるオウドーさんは理解している必要があると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-06-06 15:22
>>GEGE = st.get_Range("A1", "C5");

このコードに関しては、間違ってると思います。正しくは

GEGE = ge.get_Range("A1","C5");

と思います。日本語でゆうとExcel.Range ge = st.Cells;で取得したCellsの指定。

と思っております。

>>Excel.Range GEGE = exapp.ActiveCell;

そうですね。おっしゃるとおりです。ありがとうございます。

todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-06-06 17:16
引用:

オウドーさんの書き込み (2007-06-06 12:57) より:
余談ですがデータを抽出じゃなくDBからエクセルにデータを挿入するサンプルが多くみられたような気がします。エクセルからインポートするサンプルは私が調べた限りではありませんでした。探す能力、もしくは、C#の理解力が乏しいだけかもしれませんが。




[HOWTO] ASP.NET、ADO.NET、および Visual C# .NET による Excel データの取得と表示方法
http://support.microsoft.com/kb/306572/ja

Visual C# で Excel を自動化して、配列による範囲内へのデータ入力および範囲内からのデータ取得を行う方法
http://support.microsoft.com/kb/302096/ja
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-06-06 17:21
todoさんありがとうございます。
明日、朝一に詳しく調べて実行しようかと思ってます。
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-06-07 11:47
皆様おはようございます。セルを指定し中に入ってるデータを抽出する方法ですがまだ苦戦中です。Rangeでセル範囲を決めることは出来たのですがその後がわかりません。
コードは昨日の書き込みを参照してもらえればわかると思います。
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-06-12 14:37
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//パス取得及びファイル名取得。
string Name = openFileDialog1.FileName;
string n = Path.GetFullPath(Name);
string nn = Path.GetFileName(n);

DataRow rb;


//Excelのインスタンス。
Excel.Application exapp = new Excel.Application();

Excel.Workbooks ks = exapp.Workbooks;
//ブックを指定。
Excel.Workbook kd = ks.Open(n, 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);


Excel.Sheets ss = kd.Worksheets;
//シート指定。
Excel.Worksheet st = (Excel.Worksheet)ss["sheet1"];
//セル指定しデータを取得。
for (int i = 11; i < 41; i++)
{
//行生成。
rb = this.workSystemDataSet1.DataTable1.NewRow();

//日付列(セル指定)
Excel.Range rng = exapp.get_Range("A" + i, Missing.Value);

rb[0] = rng.Text;



// 区分番号
Excel.Range rng1 = exapp.get_Range("C" + i, Missing.Value);

rb[1] = rng1.Text;


this.workSystemDataSet1.DataTable1.Rows.Add(rb);

}




//this.textBox1.Text = rng.Value2.ToString();



ks.Close();
exapp.Quit();
}

これから私と同じような境遇をした人へ。
私はここで教えてもらい上記のようなコードにたどり着きました。
参考にしてもらえれば幸いです。
遅れながらですが皆様ありがとうございました。

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