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

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

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

セルが結合されているときの繰り返し処理について

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

■88004 / inTopicNo.1)  セルが結合されているときの繰り返し処理について
  
□投稿者/ 河童 (13回)-(2018/07/27(Fri) 18:56:15)

分類:[C#] 

セルが結合されているときの繰り返し処理について

セルが結合されている場合の最初と最後の値を取得する繰り返し処理について
教えてください。

環境:
VS2010
closedXML

エクセルの予定表があります。
月の日数:
B1のセルからAF1まで1から31の数値で日程を入力します。

状態区分:
B3のセルからAF3まで状態区分を入力します。
「◎」は開始
「〇」は期間中
「●」は終了

氏名:
B4のセルからAF4まで氏名を入力します。
氏名のセルは状態の区分でセルを結合して入力します。
例えば、
B3が「◎」、C3からI3まで「〇」J3が「●」のとき
B4からJ4までセルを結合して氏名を入力します。

コメント:
B5のセルからAF5までコメントを入力します。


3行ごとに状態、氏名とコメントはB74まで同じ構成で作成していきます。

処理:
1.最初のB3から氏名が空白かどうか判定
2.空白でなければ、
 最初のセルの区分と最後のセルの区分を取得して、配列にセット

分からないこと:
1.セルが結合されていた時の最初と最後のセルの値の取得方法
2.セルが結合されてないときの判定


B  C  D  E F   G  H  I  J  K
1  2  3  4 5   6  7  8  9  10
〇 〇 ● ◎●     ◎ 〇 〇 ● 
testA    testB    testC

やりたいこと:
//配列(氏名、開始日、終了日)
data_inp[0, 0] = testA
data_inp[0, 1] = ""    
data_inp[0, 2] = 2018/7/3 
data_inp[1, 0] = testB
data_inp[1, 1] = 2018/7/4    
data_inp[1, 2] = 2018/7/5 
data_inp[2, 0] = testC
data_inp[2, 1] = 2018/7/7    
data_inp[2, 2] = 2018/7/10

注意点:
セルの最初が「◎」以外だと、開始日は空白
セルの最後が「●」以外だと、終了日は空白


string[,] data_inp = new string[1000, 5];
string tmp_name = "";   //氏名
     
//氏名データ行(始行4行目から終行73行目まで)
for (int srcRow = Start_Line; srcRow < End_Line; srcRow +=3)
{
   //月末までループ(1日から月末日まで)
   for (int X = date_start_column; X < dayc + date_start_column; X++)
   {
      //氏名行セル取り込み
      Cell = worksheet.Cell(srcRow, X).Value.ToString();
      
      if (Cell != "")
      {
         //結合がない場合の判定
         //結合された最初のセルの判定(〇か◎)
         //結合された最後のセルの判定(〇か●)
               

         //結合された最初のセルと最後のセルの値をセット            
         data_inp[DataCount, 0] = tmp_name; //氏名
         data_inp[DataCount, 1] = strdate;  //開始日
         data_inp[DataCount, 2] = endDate;  //終了日

         DataCount++;
      }                      
   }
}

引用返信 編集キー/
■88007 / inTopicNo.2)  Re[1]: セルが結合されているときの繰り返し処理について
□投稿者/ furu (175回)-(2018/07/27(Fri) 21:38:45)
No88004 (河童 さん) に返信

CellのIsMerged()とかWorksheetのMergedRangesを
使うとできるっぽい。
引用返信 編集キー/
■88009 / inTopicNo.3)  Re[2]: セルが結合されているときの繰り返し処理について
□投稿者/ 河童 (14回)-(2018/07/28(Sat) 08:46:44)
おはようございます。
furuさん、お返事ありがとうございます。

セルが結合しているかは
IsMerged
で判定できました。

今固定で「B4」としていますが、
セル番地を使って結合している範囲を
調べるにはどの様な方法があるでしょうか?
知りたいのは何列結合されているかです。


MergedRanges.Count
結合しているすべてのカウント?


//セルが結合されているか
if (worksheet.Cell(srcRow, X).IsMerged())
{
    string adr = "B4";    
    var range = worksheet.Range(adr);
    if (range.IsMerged())
    {
        var m = worksheet.MergedRanges.Count;
    }
}

引用返信 編集キー/
■88014 / inTopicNo.4)  Re[3]: セルが結合されているときの繰り返し処理について
□投稿者/ Hongliang (663回)-(2018/07/30(Mon) 10:53:50)
IXLWorksheet.MergedRangesでワークシート内のマージされているIXLRangeを列挙できるので、
var cell = sheet.Cell("B4");
var merged = sheet.MergedRanges.FirstOrDefault(_ranged => _ranged.Contains(cell));
if (merged != null) {
  Debug.Print("{0} - {1}", merged.FirstCell().Address, merged.LastCell().Address);
}
みたいな感じでどうでしょう。

とはいえ、仕様を見る限り、マージされている名前をまず見に行くよりも、
◎〇●空白の行を1列ずつ見ていってどの範囲が対象となるか確認するように
した方が簡単そうですが……。

引用返信 編集キー/
■88016 / inTopicNo.5)  Re[4]: セルが結合されているときの繰り返し処理について
□投稿者/ 河童 (15回)-(2018/07/30(Mon) 11:18:05)
こんにちは。
Hongliangさん、お返事ありがとうございます。

そうですね。
◎などの行で判定する方法が簡単でした。
最初の◎〇●のときに氏名を取得するように仕様を変更しました。

アドバイスいただいたコードを勉強させていただきました。

ありがとうございました。


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ