我已经拖网了,根据文档,似乎没有一种移动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方法导致异常。但是,真正的问题是在我移动了我创建的NamedRange单元之后:

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


仍指原始单元格范围(我将单元格向下移动之前的位置)。

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

理想情况下,在将它们放入“ Range”之前,我不必移动它们,但是如果这是唯一的解决方案,那么我将不得不使用它。

编辑:

在阅读了道格·格兰西(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值时,结果是Excel NamedRange DropDownList?!?!中缺少NamedRange。

最佳答案

您可以通过再次添加其他地址来“移动”命名范围。例如,在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#中将其拼凑在一起。它来自一个Workbook项目,但我相信也可以在一个插件中使用。我认为我不需要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);
        }

关于c# - 如何在Excel中移动NamedRange-VSTO而不是VBA,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10610828/

10-10 18:54