简体   繁体   中英

How to know editable cell address in merged cells

enter image description here

Here, there are four cells(A1,B1,C1,D1) have been merged, I would like to get the editable cell address(A1). According to Excel A1 Cell able to edit, others not editable. I could able to get merged cells count as 4 using below code. Also I can get whether cell has been merged or not. But not able to get the address of editable cell(A1) in merged cells.

                Microsoft.Office.Interop.Excel.Application appl = null;
                appl = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook wbk;
                wbk = appl.Workbooks.Open("C:\\Users\\test\\Desktop\\test.xlsx");
                Worksheet sheet = wbk.Worksheets.get_Item(1);

                Range range = sheet.Cells[1, 2]; //B1 Cell

                var a = range.Cells.MergeArea.Count;  // can be able to get merged count cells

                string b = range.Address;
                **int ab = range.Cells.Areas.Count;**
                Range ac = range.Cells.Areas.get_Item(1);

                for (int i = 1; i <= 4; i++)
                {
                    **if (sheet.Cells[1, i].Mergecells)**   //merged cell
                    { 
                       MessageBox.Show("Merged");
                    }
                    else //Unmerged cell
                    {
                       MessageBox.Show("UnMerged Cells");   
                    }
                }
                wbk.Save();
                wbk.Close(false);
                appl.Quit();

The MergeArea property of a Range is again a Range. If you have a cell, just use something like the following to get the first (=top left) cell of the merged area (untested in C# as I don't have it available, but works in VBA and should also work for C#):

Range range = sheet.Cells[1, 2];
Range firstCell = range.MergeArea.Cells[1, 1];

This works even if a cell is not merged, MergeArea is always set, so on an unmerged cell range and firstCell would point to the same cell.

If I correctly understood your real need, please try the next approach. It is based on the fact that a merged area keeps the value in its first cell :

'your existing code...
                if (sheet.Cells[1, i].Mergecells)   //merged cell
                    { 
                       MessageBox.Show(sheet.Cells[1, i].MergeArea.cells[1, 1].Value);
                    }
                    else //Unmerged cell
                    {
                       MessageBox.Show(sheet.Cells[1, i].Value);   
                    }
'your existing code...

Here is the solution

string mergedCellsAddress = mergedRange.Address;
string[] firstMergedCell = mergedCellsAddress.Split(':');
string firstCell = firstMergedCell.GetValue(0).ToString().Replace("$", "");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM