如何在Excel中移动NamedRange – VSTO不是VBA

我已经拖网,根据文档,似乎没有一种方法来移动NamedRange: http : //msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange_methods (v = VS.80)的.aspx

我有下面的代码复制单元格数据的几行:

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方法会导致exception。 然而,真正的问题是我移动单元格后,我创build的NamedRange:

 rnArea = activeSheet.Range[leftColumn + startRow , rightColumn + (MyData.Values.Length + startRow)]; Name name = activeBook.Names.Add(uniqueName, rnArea); 

仍然是指原来的细胞范围(我把细胞向下移动之前的位置)。

如何以编程方式在C#VSTO 4.0中移动NamedRange?

理想情况下,我不需要在将细胞放入一个范围之前移动细胞,但如果这是唯一的解决scheme,那么我将不得不去做。

编辑:

在阅读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" } 

但是,当我运行此代码并更改NamedRange RefersTo值时,结果是NamedRange从Excel NamedRange DropDownList丢失?!?!

您可以通过添加一个不同的地址来“移动”一个已命名的范围。 例如,在VBA中:

 Sub MoveNamedRange() ActiveSheet.Names.Add Name:="test", RefersTo:="=$A$1" Debug.Print ActiveSheet.Range("test").Address ActiveSheet.Names.Add Name:="test", RefersTo:="=$A$2" Debug.Print ActiveSheet.Range("test").Address End Sub 

这编译和运行,并在立即窗口中产生以下内容:

 $A$1 $A$2 

编辑 – C很难! 但是我在VS 2010 C#中设法凑齐了这个。 这是从一个工作簿项目,但也可以在一个插件,我相信。 我不认为我需要VS 2010中的所有Type.Missing,但是我确定我已经阅读过他们在早期版本中需要的:

 private void Sheet1_Startup(object sender, System.EventArgs e) { Globals.Sheet1.Names.Add("test", Globals.Sheet1.Range["A1"], System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing); MessageBox.Show(Globals.Sheet1.Range["test"].Address); Globals.Sheet1.Names.Add("test", Globals.Sheet1.Range["A2"], System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing); MessageBox.Show(Globals.Sheet1.Range["test"].Address); }