質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

C#、エクセルシートのデータを配列に入れる際のループの回し方について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 6,033

score 48

var objWsAaa = (object[,])wsAaa.Range[wsAaa.Cells[12,2],wsAaa.Cells[r,c]].Cells.Value2;

上記ワークシートのデータをリストに入れる際に
大枠のループでは列数、
中のループでは行数で処理にあてはめなければいけません。
可能でしょうか。
また、どのようにリストに入れることができますか。

var listObjWsAss = new double[r];
v = 0;
for(k = 1; k < c + 1; k++)
{
  for(n = 1; n < r + 1; r++)
  {
  listObjWsAss[n][v] = double.Parse((string)objWsAaa[n,k]);
  }
} 

今の状況は上記です。
よろしくお願いいたします。


  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

コメント踏まえて、シートA→シートBへのデータ反映部分を組んでみました。

//列毎に処理
for(int currentCol = 1; currentCol <= c - 2; currentCol++)
{
    //シートA対象列の全行取得
    var rowsData = new List<object>();
    for(int currentRow = 1; currentRow <= r - 12; currentRow++)
    {
        rowsData.Add(objWsAaa[currentRow, currentCol]);
    }

    //対象列をシートBにコピーするか判定(1つでも条件を満たすセルがあればコピーしない)
    var isExist = rowsData.Any((x) =>
        {
            //True:セルが対象外とする条件を満たす
            return true;
        });

    //シートBデータへ反映
    if(!isExist)    //対象列のみ
    {
        for(int currentRow = 1; currentRow <= r - 12; currentRow++)
        {
            //便宜上、上書きしてる。加算とか、なんでも良い。
            objWsB[currentRow, currentCol] = rowsData[currentRow - 1];
        }
    }
}
//※シートAのデータ行数≦シートBのデータ行数を前提としたのでチェックしてない。
//※doubleの必要性がよくわからなかったのでobjectのまま処理している

未検証です。ループが1回多く回るとか、凡ミスがあるかも。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/14 17:13

    ありがとうございます。
    一点質問があります。
    "var isExist = rowsData.Any((x) =>{});"
    上記の"(x)"って何ですか?!

    キャンセル

  • 2015/05/14 17:20

    rowsDataの1要素です。
    rowsDataはList<object>なのでobjectですね。

    キャンセル

  • 2015/05/14 18:44

    もう少しでできそうです。
    ありがとうございました!

    キャンセル

0

こんにちは。

tomi0416さんのやりたいことが、ちゃんと理解出来ているか自信が無いですが、
おそらく、案2ですか?

//案1:行列の番号でリスト作りたいなら
var result = new Dictionary<Tuple<int, int>, double>();
for (k = 1; k < c + 1; k++)
{
    for (n = 1; n < r + 1; n++)
    {
        //TODO:Cast可否チェックしたほうが良いです。
        result.Add(
            new Tuple<int, int>(n, k),
            double.Parse((string)objWsAaa[n, k])
            );
    }
}

//案2:Excelの行列番号ではなく0始まりで配列作るのであれば
const int startCol = 12;    //wsAaa.Cells[12,2]の12
const int startRow = 2;     //wsAaa.Cells[12,2]の2
var listObjWsAss = new double[r,c];
//v = 0;    vって固定で0ですか?つかいどころがイマイチわかりませんでした。
for (k = 1; k < c + 1 - startCol; k++)
{
    for (n = 1; n < r + 1 - startRow; n++)
    {
        listObjWsAss[n - 1, k - 1] = double.Parse((string)objWsAaa[n, k]);
    }
}

未検証!

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/14 14:07

    ありがとうございます。
    1.対象外と判断された列はシートB上ではどうなりますか。空白列ですか?詰めますか?
    → 対象外と判断された列はシートB上ではでは変化しないです。理由は、シートBのデータをオブジェクトに入れています。
    var objWsB = (object[,])wsB.Range[wsB.Cells[a,2],wsB.Cells[b,c]].Cells.Value2;
    (a,b,cはシート内から出力したlong型のデータです。)

    2.ObjectのままではなくDouble型にしているのは何故ですか?
    → シートBのデータがDoubleなのでDoubleにしました。もしかして、関係ないですか?!

    キャンセル

  • 2015/05/14 14:29

    objWsBの登場で複雑になってしまいました。
    添え字のa, b, c, r などのせいで問題点がわかりにくくなっています…。
    シートAでは12, 2, r, cが登場しますね。
    シートBではa, 2, b, cが登場しますね。
    このそれぞれのインデックスの関連性を教えてください。

    キャンセル

  • 2015/05/14 14:43

    var objWsAaa = (object[,])wsAaa.Range[wsAaa.Cells[12,2],wsAaa.Cells[r,c]].Cells.Value2;

    var objWsB = (object[,])wsB.Range[wsB.Cells[a,2],wsB.Cells[b,c]].Cells.Value2;

    関連性は特にないです。
    変数にした理由は、固定ではないっということを伝えたかっただけです。
    値は各シートのデータ量で変動します。

    ご存じの通り、"シートBのデータ量" > "シートAのデータ量"です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る