在Excel中从范围中删除单元格

我创build了一个包含两个button的自定义Excelfunction区。 btnFillColor和btnUndo。

当用户点击btnFillColorbutton时,选定的单元格将填充一些颜色。 同时显示一个input框,要求用户给选定的单元格范围命名。

当用户点击btnUndo时,单元格被清除,相应范围的名称将按照相反的顺序被删除。

当用户点击btnFillColor并给出所选单元格的名称时,如果已经存在相同的名称,范围将被添加到同名的现有范围中。

现在我的问题是:当用户点击撤销button后,两个不同的范围添加在同一名称下,只有那些单元格应该被清除,并删除范围内添加最后一个范围。 另外一个应该保持原来的名称一致。 如何做到这一点?

这是代码。

private void btnFillColor_Click(object sender, RibbonControlEventArgs e) { Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet; string strFilledRangeAddress = Globals.ThisAddIn.Application.Selection.Address.ToString(); Excel.Range FilledRange = ws.get_Range(strFilledRangeAddress); FilledRange.Interior.Color = Color.YellowGreen; string tagName = Microsoft.VisualBasic.Interaction.InputBox("Enter tag name:"); if (lstFilledRangeName.Contains(tagName)) { Excel.Range ExistingRange = ws.get_Range(tagName); FilledRange = Globals.ThisAddIn.Application.Union(ExistingRange, FilledRange); } else { lstFilledRangeName.Add(tagName); } FilledRange.Name = tagName; lstFilledRangeAddresses.Add(strFilledRangeAddress); if (btnUndo.Enabled == false) btnUndo.Enabled = true; } private void btnUndo_Click(object sender, RibbonControlEventArgs e) { Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet; Excel.Range FilledRange = ws.get_Range(lstFilledRangeAddresses[lstFilledRangeAddresses.Count - 1]); FilledRange.Interior.ColorIndex = 0; lstFilledRangeAddresses.RemoveAt(lstFilledRangeAddresses.Count - 1); if (lstFilledRangeAddresses.Count == 0) btnUndo.Enabled = false; } 

为了只清除最后填充的单元格,并将它们从现有的范围中删除,我正在跟踪用户在数据表中做了哪些select。 当用户点击撤消button时,在清除单元格和名称之前,我正在检查用户是否先前使用相同的名称进行了select。 如果是,那么首先我清除所有名称下的单元格,并删除名称。 之后,我再次填充颜色的前一个select,并给它相同的名称。

这是修改的代码:

  DataTable dtRangeName_Address = new DataTable(); private void RnD_Ribbon_Load(object sender, RibbonUIEventArgs e) { btnUndo.Enabled = false; dtRangeName_Address.Columns.Add("Name"); dtRangeName_Address.Columns.Add("Address"); } private void btnFillColor_Click(object sender, RibbonControlEventArgs e) { Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet; string strFilledRangeAddress = Globals.ThisAddIn.Application.Selection.Address.ToString(); Excel.Range FilledRange = ws.get_Range(strFilledRangeAddress); FilledRange.Interior.Color = Color.YellowGreen; DataRow drRangeName_Address = dtRangeName_Address.NewRow(); bool TagAlreadyExists = false; string tagName = Microsoft.VisualBasic.Interaction.InputBox("Enter tag name:"); for (int i = dtRangeName_Address.Rows.Count - 1; i >= 0; i--) { if (dtRangeName_Address.Rows[i][0].ToString() == tagName) { Excel.Range ExistingRange = ws.get_Range(dtRangeName_Address.Rows[i][1].ToString()); FilledRange = Globals.ThisAddIn.Application.Union(ExistingRange, FilledRange); drRangeName_Address[1] = FilledRange.Address.ToString(); drRangeName_Address[0] = tagName; TagAlreadyExists = true; break; } } if (TagAlreadyExists == false) { drRangeName_Address[1] = strFilledRangeAddress; drRangeName_Address[0] = tagName; } FilledRange.Name = tagName; dtRangeName_Address.Rows.Add(drRangeName_Address); if (btnUndo.Enabled == false) btnUndo.Enabled = true; } private void btnUndo_Click(object sender, RibbonControlEventArgs e) { Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet; Excel.Range FilledRange = ws.get_Range(dtRangeName_Address.Rows[dtRangeName_Address.Rows.Count - 1][1].ToString()); string tagName = dtRangeName_Address.Rows[dtRangeName_Address.Rows.Count - 1][0].ToString(); Excel.Range ExistingRange = null; bool TagAlreadyExists = false; for (int i = dtRangeName_Address.Rows.Count - 2; i >= 0; i--) { if (dtRangeName_Address.Rows[i][0].ToString() == tagName) { ExistingRange = ws.get_Range(dtRangeName_Address.Rows[i][1].ToString()); TagAlreadyExists = true; break; } } FilledRange.Interior.ColorIndex = 0; FilledRange.Name.Delete(); if (TagAlreadyExists == true && ExistingRange != null) { ExistingRange.Interior.Color = Color.YellowGreen; ExistingRange.Name = tagName; } dtRangeName_Address.Rows.RemoveAt(dtRangeName_Address.Rows.Count - 1); if (dtRangeName_Address.Rows.Count == 0) btnUndo.Enabled = false; }