예제 #1
0
파일: EnterName.cs 프로젝트: cottpan/assift
        /// <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();
        }
예제 #2
0
파일: EnterName.cs 프로젝트: cottpan/assift
 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());
 }
예제 #3
0
        /// <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;
        }
예제 #4
0
        /// <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;
        }
예제 #5
0
        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;
        }