/// <summary> /// フォームがロードされた時のメソッドです。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void EnterName_Load(object sender, EventArgs e) { // ワークブックからワークシートを接続します sheets = book.Worksheets; jobsheet = (Excel.Worksheet)sheets.get_Item(sheets.getSheetIndex("仕事シフト")); //重複チェック高速化のためのテキスト変換 Excel.Range allRange = jobsheet.Cells[MainForm._MainFormInstance.startaddr_row, MainForm._MainFormInstance.startaddr_col]; allRange = allRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90); allString = allRange.DeepToString(); // フォームの初期化 jobBox.Items.Clear(); jobBox.Items.Add("全"); this.jobBox.SelectedIndex = 0; jobBox2.Items.Clear(); jobBox2.Items.Add("全"); this.jobBox2.SelectedIndex = 0; bureauTextBox.Text = "全"; gradeTextBox.Text = "全"; // 仕事選択とフォームがアクティブになった時のイベントハンドラの追加 this.jobBox.SelectedIndexChanged += new EventHandler(jobBox_SelectedIndexChanged); this.jobBox2.SelectedIndexChanged += new EventHandler(jobBox2_SelectedIndexChanged); this.Activated += new EventHandler(EnterName_Activated); activeCellUpdate(); }
private void viewUpdate_Click(object sender, EventArgs e) { Excel.Range allRange = jobsheet.Cells[MainForm._MainFormInstance.startaddr_row, MainForm._MainFormInstance.startaddr_col]; allRange = allRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90); allString = allRange.DeepToString(); activeCellUpdate(); nameViewUpdate2(bureauTextBox.Text, gradeTextBox.Text, jobBox.SelectedItem.ToString(), jobBox2.SelectedItem.ToString()); }
/// <summary> /// 仕事シフトを個人シフトに変換します /// </summary> /// 仕事シフトをallJobRange、個人シフトをallIdvRangeとしておきます /// 仕事シフトを文字列allStringに直して、個人シフト文字列allIdvStringに変換 /// 変換したものをallIdvRangeに入れ、さいごに必要に応じて結合を行う public static void Run(Excel.Workbook book) { book.Application.ScreenUpdating = false; book.Application.DisplayAlerts = false; MainForm._MainFormInstance.inProrgamUse = true; int Rows = 0, Columns = 0; Excel.Worksheet jobsheet; //仕事シフト Excel.Worksheet idvsheet; //個人シフト Excel.Sheets sheets; sheets = book.Worksheets; jobsheet = (Excel.Worksheet)sheets.get_Item(sheets.getSheetIndex("仕事シフト")); idvsheet = (Excel.Worksheet)sheets.get_Item(sheets.getSheetIndex("個人シフト")); Excel.Range current = idvsheet.Cells[1, 1]; //セル単体です string value; int cellCount = 1; Excel.Range wholeRange; Stopwatch sw = new Stopwatch(); //仕事シフトのセル全体をallJobRangeに Excel.Range allJobRange = jobsheet.Cells[MainForm._MainFormInstance.startaddr_row, MainForm._MainFormInstance.startaddr_col]; allJobRange = allJobRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90 + 10); //結合の解除と中身の破棄をやっておきます(名前や時間部分は消さないようにしているので注意) Excel.Range allIdvRange = idvsheet.Cells[4, 5]; allIdvRange = allIdvRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90 + 10); allIdvRange.UnMerge(); allIdvRange.Clear(); //個人シフトのセル全体をallIdvRangeに allIdvRange = idvsheet.Cells[1, 1]; allIdvRange = allIdvRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90 + 10); allIdvRange.Interior.ColorIndex = 2; string[,] allString = allJobRange.DeepToString(); //仕事シフトを入れる string[,] allIdvString = allIdvRange.DeepToString(); //個人シフトを入れる(何も起きないけど) Excel.Range JobRange = jobsheet.Cells[MainForm._MainFormInstance.startaddr_row, MainForm._MainFormInstance.startaddr_col - 1]; JobRange = JobRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 1); string[,] jobString = JobRange.DeepToString(); //仕事名を入れる sw.Start(); for (Rows = 0; Rows < MainForm._MainFormInstance.jobtype; Rows++) { for (Columns = 0; Columns < 100; Columns++) { if (allString[Rows, Columns] == null || allString[Rows, Columns] == "") { continue; } else { for (int tmp = 0; tmp < MainForm._MainFormInstance.jobtype; tmp++) { if (allIdvString[tmp, 3] == null || allIdvString[tmp, 3] == "") { } else if (allString[Rows, Columns] == allIdvString[tmp, 3])//仕事シフト文字列のとあるセル == 個人シフトの名前列の上からtmp番目 { //以下緊急対応です //配列外参照の可能性を消しました if (Columns + 4 > 93) { break; } allIdvString[tmp, Columns + 4] = jobString[Rows, 0];//個人シフトのとあるセル = 仕事シフトの仕事列の上からRows番目 break; } } } } } allIdvRange.set_Value(Type.Missing, allIdvString); book.Application.ScreenUpdating = true; book.Application.DisplayAlerts = false; //セルの結合を行う for (Rows = 1; Rows < MainForm._MainFormInstance.jobtype; Rows++) { for (Columns = 1; Columns < 100; Columns++) { cellCount = 1; value = allIdvString[Rows - 1, Columns - 1]; if (value == null || value == "") { } else//ここが結合する必要のある部分です { while (value == allIdvString[Rows - 1, Columns])//いくつ結合するかを確認 { cellCount++; Columns++; } //wholeRangeで結合するセルを選択し、結合する wholeRange = idvsheet.Cells[Rows, Columns - cellCount + 1]; wholeRange = wholeRange.get_Resize(1, cellCount); book.Application.DisplayAlerts = false; wholeRange.Merge(); wholeRange.Interior.ColorIndex = 35; wholeRange.BorderAround2(); } } } sw.Stop(); MessageBox.Show(sw.ElapsedMilliseconds + "ミリ秒で処理が終了しました.\r\n"); book.Application.ScreenUpdating = false; book.Application.DisplayAlerts = true; MainForm._MainFormInstance.inProrgamUse = false; }
/// <summary> /// 結合されてない個人シフトを作成します /// </summary> /// 詳しいことはJobToShiftにかいてあります public static void Run(Excel.Workbook book) { book.Application.ScreenUpdating = true; MainForm._MainFormInstance.inProrgamUse = true; int Rows = 0, Columns = 0; //Rowがy座標 Excel.Worksheet jobsheet; // 操作中のアプリケーション Excel.Worksheet idvsheet; Excel.Sheets sheets; sheets = book.Worksheets; jobsheet = (Excel.Worksheet)sheets.get_Item(sheets.getSheetIndex("仕事シフト")); idvsheet = (Excel.Worksheet)sheets.get_Item(sheets.getSheetIndex("MySheet")); Excel.Range current = idvsheet.Cells[1, 1]; //セル単体です Excel.Range allJobRange = jobsheet.Cells[MainForm._MainFormInstance.startaddr_row, MainForm._MainFormInstance.startaddr_col]; allJobRange = allJobRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90 + 10); Excel.Range allIdvRange = idvsheet.Cells[1, 1]; allIdvRange = allIdvRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90 + MainForm._MainFormInstance.startaddr_col + 1); allIdvRange.Interior.ColorIndex = 2; Excel.Range clear_cell = idvsheet.Cells[3, 5]; clear_cell = clear_cell.get_Resize(230, 90); clear_cell.ClearContents(); //allIdvRange.ClearContents(); //allIdvRange.UnMerge(); string[,] allString = allJobRange.DeepToString(); //仕事シフトを入れる string[,] allIdvString = allIdvRange.DeepToString(); //個人シフトを入れる Excel.Range JobRange = jobsheet.Cells[MainForm._MainFormInstance.startaddr_row, MainForm._MainFormInstance.startaddr_col - 1]; JobRange = JobRange.get_Resize(MainForm._MainFormInstance.jobtype, 1); string[,] jobString = JobRange.DeepToString(); //仕事名を入れる for (Rows = 0; Rows < MainForm._MainFormInstance.jobtype; Rows++) { for (Columns = 0; Columns < MainForm._MainFormInstance.startaddr_col + 90; Columns++) { if (allString[Rows, Columns] == null || allString[Rows, Columns] == "") { continue; } else { for (int tmp = 0; tmp < MainForm._MainFormInstance.jobtype; tmp++) { if (allIdvString[tmp, 3] == null || allIdvString[tmp, 3] == "") { } else if (allString[Rows, Columns] == allIdvString[tmp, 3]) { //allIdvString[tmp, Columns + 4] = jobString[Rows, 0]; //以下緊急対応です,配列外参照の可能性を消しています //要確認 if (Columns + 4 > 93) { break; } allIdvString[tmp, Columns + 4] = jobString[Rows, 0]; break; } //以下緊急対応です if (tmp == 500) { MessageBox.Show(jobString[Rows, 0] + "in" + allString[Rows, Columns] + " is not entered by error"); } } } } } allIdvRange.set_Value(Type.Missing, allIdvString); /* * book.Application.DisplayAlerts = false; * for (Rows = 1; Rows < 500; Rows++) * { * for (Columns = 1; Columns < 100; Columns++) * { * cellCount = 1; * value = allIdvString[Rows - 1, Columns - 1]; * if (value == null || value == "") * continue; * while (value == allIdvString[Rows - 1, Columns]) * { * cellCount++; * Columns++; * } * * wholeRange = idvsheet.Cells[Rows, Columns - cellCount + 1]; * wholeRange = wholeRange.get_Resize(1, cellCount); * wholeRange.Merge(); * wholeRange.Interior.ColorIndex = 35; * wholeRange.BorderAround2(); * } * } * * * * * book.Application.DisplayAlerts = true; */ // book.Application.ScreenUpdating = true; MainForm._MainFormInstance.inProrgamUse = false; }
public static void Run(Excel.Workbook book) { //シフトのデータが入っているセルを全てallRangeに入れます //allStringにallRangeの文字列をすべて入れます //allStringの中をfor文でチェックします //Rangeは読み込むのに時間がかかるため、String型に変換してから処理することで実行時間を短くしています //実行結果をmessageに入れます、その時に二列にして表示しているのですが、 //oddを使って奇数番目を先(左)に、偶数番目を後(右)に入れ、二列に見せかけています //実行時間も計測していますが、十分だと思います //表示結果が見にくいので、重複結果が重複しているとき(10:00と10:10で同じ人が重複しているとき) //表示結果を一つにまとめてしまうと良いかと思います book.Application.ScreenUpdating = true; MainForm._MainFormInstance.inProrgamUse = true; int Rows = 0, Columns = 0; Excel.Worksheet jobsheet; Excel.Sheets sheets; sheets = book.Worksheets; jobsheet = (Excel.Worksheet)sheets.get_Item(sheets.getSheetIndex("仕事シフト")); Excel.Range allRange = jobsheet.Cells[MainForm._MainFormInstance.startaddr_row, MainForm._MainFormInstance.startaddr_col]; allRange = allRange.get_Resize(MainForm._MainFormInstance.jobtype + 10, 90); string[,] allString = allRange.DeepToString(); string message = ""; bool isChecked = false; bool odd = true; string first = "", second = "", third = ""; Stopwatch sw = new Stopwatch(); sw.Start(); for (Columns = 0; Columns < 90; Columns++) //右に移動してチェックするfor文、 { for (Rows = 0; Rows < MainForm._MainFormInstance.jobtype; Rows++) //下に移動してチェックする { if (allString[Rows, Columns] == null || allString[Rows, Columns] == "") { continue; } for (int check = 0; check < MainForm._MainFormInstance.jobtype; check++) //チェックするものがその列にあるかどうか確認する { isChecked = false; //この変数意味ないですね、消すの怖いのでチェックしてから消してください、たぶん問題ないはず if (allString[Rows, Columns] == allString[check, Columns]) { if (Rows > check) //二回表示されるのを防ぐためにRows>checkの時はエラーとみなしません、上のfor文でcheck=Rowsにすれば解決ですけどね { break; } else if (Rows == check) //同じものを比較する意味は無いので当然飛ばします { } else //Rows < check { //メッセージを二列に分けているだけの処理 if (odd) { if (!isChecked) { first = allString[Rows, Columns] + "さんは重複しています "; second = (Rows + MainForm._MainFormInstance.startaddr_row) + "行目 " + (Columns / 6 + 7) + "時" + (Columns % 6 * 10) + "分 "; isChecked = true; } third = (check + MainForm._MainFormInstance.startaddr_row) + "行目 " + (Columns / 6 + 7) + "時" + (Columns % 6 * 10) + "分 "; } else { if (!isChecked) { first += "|" + allString[Rows, Columns] + "さんは重複しています \r\n"; second += "|" + (Rows + MainForm._MainFormInstance.startaddr_row) + "行目 " + (Columns / 6 + 7) + "時" + (Columns % 6 * 10) + "分\r\n"; isChecked = true; } third += "|" + (check + MainForm._MainFormInstance.startaddr_row) + "行目 " + (Columns / 6 + 7) + "時" + (Columns % 6 * 10) + "分\r\n"; message += first + second + third + "\r\n-----------------------------------------------------------------------\r\n"; first = ""; second = ""; third = ""; } odd = !odd; //メッセージを二列に分ける処理終了 } } } } } sw.Stop(); message += first + second + third; if (message == "") { message += "重複はありませんでした"; } MessageBox.Show(sw.ElapsedMilliseconds + "ミリ秒で処理が終了しました\r\n" + message); MainForm._MainFormInstance.inProrgamUse = false; book.Application.ScreenUpdating = true; }