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

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

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

Re[6]: 繰り返す処理を関数にしたい


(過去ログ 151 を表示中)

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

■87959 / inTopicNo.1)  繰り返す処理を関数にしたい
  
□投稿者/ 河童 (6回)-(2018/07/20(Fri) 16:45:45)

分類:[C#] 

いつも大変お世話になっております。

繰り返す処理を関数にするやり方を教えてください。

環境 VS2010

エクセルのブックを開いて
各シート上のデータを配列に代入しています。
今現在シートは2種類あります。
・A病棟
・B病棟

シートのフォーマットは同じで
配列に代入する処理も同じです。

今後病室が増えると予想。
その都度処理のコードを追記する手間暇を減らしたいです。

Excel_Readの処理中に
シートごとの共通処理を関数にして
その結果をget_day_inpの変数に代入していきたいです。

共通の処理と引数などはどの様に
作成すればよいでしょうか?

get_day_inpの中は
A病室とB病室の値が代入されている。

よろしくお願いいたします。

public string[,] Excel_Read(string path)
{

//処理は省略
エクセルファイルのチェック
      ブックのオープン
(省略)


//取得日数変数
string[,] get_day_inp = new string[1000, 5];


//***********************************************
//A病室
//***********************************************

//取込シート
string stSheet;
stSheet = "A病室";

//取り込みシート確認&セット
IXLWorksheet worksheet;
if (!workbook.TryGetWorksheet(stSheet, out worksheet))
{
CmnMsgBox.Show("シートが見つかりません", 2);
return (null);
}

do
{

//処理は省略
get_day_inp [DataCount, 0] = cnt_day;
(省略)

} while (End_Fg);


//***********************************************
//B病室
//***********************************************

//取込シート
stSheet = "B病室";

//取り込みシート確認&セット
IXLWorksheet worksheet;
if (!workbook.TryGetWorksheet(stSheet, out worksheet))
{
CmnMsgBox.Show("シートが見つかりません", 2);
return (null);
}

do
{

//処理は省略
get_day_inp [DataCount, 0] = cnt_day;
(省略)

} while (End_Fg);




//データが有るかのチェック
if (DataCount == 0)
{
CmnMsgBox.Show("取り込みデータが見つかりません\n取り込みを中止します", 2);
get_day_inp = null;
}

return (get_day_inp);
}
引用返信 編集キー/
■87961 / inTopicNo.2)  Re[1]: 繰り返す処理を関数にしたい
□投稿者/ 河童 (7回)-(2018/07/20(Fri) 20:58:30)
繰り返しの処理は、一応関数にすることができました。

2次元配列の戻り値を1つにまとめるにはどのようにすればよいでしょうか?

inp1とinp2の値を
data_inpに合体?させたいです。

よろしくお願いいたします。

string[,] data_inp = new string[1000, 5];

string[,] inp1 = Sheet_Torikomi("A病室", workbook);
string[,] inp2 = Sheet_Torikomi("B病室", workbook);

for (int i = 0; i < inp1.Length; i++)
{

}
for (int i = 0; i < inp2.Length; i++)
{

}
引用返信 編集キー/
■87962 / inTopicNo.3)  Re[2]: 繰り返す処理を関数にしたい
□投稿者/ サメ (2回)-(2018/07/20(Fri) 22:59:27)
No87961 (河童 さん) に返信

data_inpにどういう規則で値を入れるのか
わかんないですけど、結果をリストにまとめて
ぐるぐるやったらいんじゃないでしょうか

var sheetNames = new List<string>() { "A病室", "B病室" };
var values = new List<string[,]>();

foreach (var sheetName in sheetNames)
{
    var value = Sheet_Torikomi(sheetName, workbook);
    values.Add(value);
}

var data_inp = new string[1000, 5];
var row = 0;

foreach (var value in values)
{
    for (var i = 0; i < value.Length; i++)
    {
        data_inp[row++, 0] = value[i, 0];
    }
}

引用返信 編集キー/
■87963 / inTopicNo.4)  Re[3]: 繰り返す処理を関数にしたい
□投稿者/ 河童 (8回)-(2018/07/21(Sat) 07:54:19)
おはようございます。
サメさん、お返事ありがとうございます。

value[i, 0] // 名前
value[i, 1] // カタカナ
value[i, 3] // 日付

value[i, 0]がキーになります。

foreach文の繰り返しの処理で
データ型の範囲をオーバーします。
A病室も1000
B病室も1000
data_inpも1000
です。

そこで
value[i, 0]==null
のときは、data_inpに代入させたくありません。
そこでvalue[i, 0]==nullのとき
continue
を追記しました。
しかし、まだ範囲をオーバーします。

A病室の処理中
value[i, 0]==null
になった時点で
B病室の処理を開始して、
B病室の処理中
value[i, 0]==null
になった時点で繰り返し処理を終了。

data_inpに
A病室とB病室の値を代入できるように
繰り返し処理をどのようにすればよいでしょうか?

よろしくお願いいたします。


var sheetNames = new List<string>() { "A病室", "B病室" };
var values = new List<string[,]>();

foreach (var sheetName in sheetNames)
{
var value = Sheet_Torikomi(sheetName, workbook);
values.Add(value);
}

var data_inp = new string[1000, 5];
var row = 0;

foreach (var value in values)
{
for (var i = 0; i < value.Length; i++)
{

if (value[i, 0] == null)
{
continue;
}
data_inp[row++, 0] = value[i, 0];
data_inp[row++, 1] = value[i, 1];
data_inp[row++, 2] = value[i, 2];
}
}
引用返信 編集キー/
■87966 / inTopicNo.5)  Re[4]: 繰り返す処理を関数にしたい
□投稿者/ サメ (3回)-(2018/07/21(Sat) 11:57:33)
No87963 (河童 さん) に返信

おはよーございますー

外側のループが病室をぐるぐるしますので
value[i, 0]==nullのときに内側のループをbreakで抜けたら
次の病室を処理するようにできます

ちょっと私のLengthの使い方がおかしかったので
GetLengthに修正しました、二次元配列の次元を指定しないとダメでした

> data_inp[row++, 0] = value[i, 0];
> data_inp[row++, 1] = value[i, 1];
> data_inp[row++, 2] = value[i, 2];

ここのところって列ごとに行を変える感じなんですか?
列数が3個あるので同じ行に入れるのが自然なんじゃないかなって
思って↓こちらのコードの出来上がりです

var data_inp = new string[1000, 5];
var destRow = 0;

foreach (var value in values)
{
    for (var srcRow = 0; srcRow < value.GetLength(0); srcRow++)
    {
        if (value[srcRow, 0] == null)
        {
            break;
        }

        for (var field = 0; field < value.GetLength(1); field++)
        {
            data_inp[destRow, field] = value[srcRow, field];
        }

        destRow++;
    }
}

引用返信 編集キー/
■87974 / inTopicNo.6)  Re[5]: 繰り返す処理を関数にしたい
□投稿者/ 河童 (10回)-(2018/07/21(Sat) 14:22:44)
こんにちは。

サメさん、ありがとうございます。
出来ました。

ポイントとして
value.GetLength(0)
指定した次元の配列の長さで繰り返して

nullだったらbreakして
次の病室を

data_inpのカウンタを
destRow

おかげさまでコードが読みやすくなって
勉強になりました。
本当にありがとうございました。

今少しずつプログラミングすることが増えてきて
いろんな質問をすると思います。
またつまずいた時はよろしくお願いします。


引用返信 編集キー/
■87975 / inTopicNo.7)  Re[6]: 繰り返す処理を関数にしたい
□投稿者/ 河童 (11回)-(2018/07/21(Sat) 14:23:16)
問題すっきり解決しました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -