【C#】Excelの書き込みで入力規則をチェックする(その2)

C#,開発

おはようございます。

引き続き、Excelの操作をやっていきます。

前回入力規則のチェック処理を書いてみたのですが、
Excelのサンプルが悪く、入力規則セルが3つ以上並んでいる場合にチェック漏れが発生することがわかったので修正版です。

プログラムは前回のものを流用します。

【C#】Excelの書き込みで入力規則をチェックする(その1)

スポンサーリンク

該当箇所

ExcelManager.cs
予め入力規則が設定されているセルを取得しておく処理で、

入力規則セルが3つ以上並んでいる(「A1:A3」)場合に、A2が抜けてしまうことが発覚。

まあ考えれば分かりますが。。

        /// <summary>
        /// 入力規則の条件を持つセル番地のリストを設定します.
        /// </summary>
        private void SetValidationAddressList()
        {
            Range range = _sheet.UsedRange.SpecialCells(XlCellType.xlCellTypeAllValidation);
            // 何も考えず range.Address.Replace(":", ",") したのが悪い
            _validationAddressList = range.Address.Replace(":", ",").Replace("$", "").Split(new char[] { ',' });
        }

ということで、

範囲内にあるすべてのセルアドレスを取得できるように修正。

プログラム修正

        /// <summary>
        /// 入力規則の条件を持つセル番地のリストを設定します.
        /// </summary>
        private void SetValidationAddressList()
        {
            Range usedRange = _sheet.UsedRange.SpecialCells(XlCellType.xlCellTypeAllValidation);
            string[] rangeList = usedRange.Address.Replace("$", "").Split(new char[] { ',' });
            List<string> addressList = new List<string>();
            foreach(string range in rangeList)
            {
                // 範囲していの場合に個別のセル番号に分解
                if (range.IndexOf(":") > -1)
                {
                    string[] tmpRange = range.Split(new char[] { ':' });
                    Range start = _sheet.Range[tmpRange[0]];
                    Range end = _sheet.Range[tmpRange[1]];
                    for (int col = start.Column; col <= end.Column; col++)
                    {
                        for (int row = start.Row; row <= end.Row; row++)
                        {
                            Range target = _sheet.Cells[row, col];
                            addressList.Add(target.Address.Replace("$", ""));
                        }
                    }
                }
                else
                {
                    addressList.Add(range);
                }
            }
            _validationAddressList = addressList.ToArray();
        }

1.カンマ区切りを分割して文字列のリストに

2.1のリストを走査し、範囲アドレスだった場合に、行列の開始、終了を1つずつずらしてアドレスを取得しリストへ設定

3.それ以外はそのままリストへ再設定

という感じです。

まとめ

Range と Cells をフル活用して変換してます。

単純にアドレス(A1のような表記)を行列に変換するプログラムを書いた方が多分処理は速いかも。

次はリスト以外の入力規則も試していけたらと思います。

何かのお役に立てれば。

ではでは。

スポンサーリンク


関連するコンテンツ