我搜索了网络并根据文档显示似乎没有一种方法可以移动命名区域:http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange_methods(v=vs.80).aspx
下面是我使用的代码,它可以将单元格数据向下复制几行:
但是,当我运行这段代码并更改命名范围 RefersTo 值时,结果是 Excel 命名范围下拉列表中的命名范围消失了?!?
activeSheet.Range[leftColumn + startRow, rightColumn + endRow].Copy();
//activeSheet.Range[leftColumn + startRow, rightColumn + endRow].Delete();
Range newRange = activeSheet.get_Range(leftColumn + (startRow + RowsToMoveDown.Count), rightColumn + (endRow + RowsToMoveDown.Count));
newRange.PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationNone, Missing.Value, Missing.Value);
NamedRange是我要复制和粘贴的单元格,它确实将单元格值下移了几行,但由于它是一个复制操作,它会保留上面单元格中的数据,而Delete方法会导致异常。然而,真正的问题是在我移动单元格之后,我创建的NamedRange:
rnArea = activeSheet.Range[leftColumn + startRow , rightColumn + (MyData.Values.Length + startRow)];
Name name = activeBook.Names.Add(uniqueName, rnArea);
仍然指的是原始单元格范围(在我将单元格向下移动之前的位置)。
如何以编程方式在C# VSTO 4.0中移动NamedRange?
理想情况下,在将它们放入范围之前,我不必移动单元格,但如果这是唯一的解决方案,那么我必须采用它。
编辑:
在阅读Doug Glancy的评论关于在VSTO C#中尝试类似VBA的语法后,我想出了以下内容:
for (int i = 0; i < activeWorkbook.Names.Count; i++)
{
name = activeWorkbook.Names.Item(i + 1);
Debug.Write(name.Name.ToString());
System.Diagnostics.Debug.Write(name.RefersTo.ToString() + Environment.NewLine);
//prints out "Sheet1!$A$1:$A$25"
name.RefersTo = "Sheet1!$A$2:$A$26";
System.Diagnostics.Debug.Write(name.RefersTo.ToString());
//prints out "Sheet1!$A$2:$A$26"
}
但是,当我运行这段代码并更改命名范围 RefersTo 值时,结果是 Excel 命名范围下拉列表中的命名范围消失了?!?
name.RefersTo ="=Sheet1!$A$2:$A$26";
。你漏掉了括号内的等号。 - Doug Glancy