如何在Excel中移动命名区域 - VSTO而非VBA

3
我搜索了网络并根据文档显示似乎没有一种方法可以移动命名区域: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?

理想情况下,在将它们放入范围之前,我不必移动单元格,但如果这是唯一的解决方案,那么我必须采用它。

编辑:

在阅读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 命名范围下拉列表中的命名范围消失了?!?

不确定这是否有帮助,但我想提一下:http://www.ozgrid.com/forum/showthread.php?t=21749 - Kendall Frey
请澄清一下,您的目标是将命名范围随着单元格一起剪切并粘贴到新位置吗? - Doug Glancy
是的Doug,如果您在Excel中从DropDownList选择一个NamedRange,它将选择NamedRange区域,您可以使用鼠标拖放该区域,它会移动单元格以及NamedRange。 - Jeremy Thompson
1
应该是 name.RefersTo ="=Sheet1!$A$2:$A$26";。你漏掉了括号内的等号。 - Doug Glancy
1个回答

4

您可以通过使用不同的地址再次添加命名范围来“移动”它。例如,在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);
        }

嘿,道格,我看到了你在这里的另一篇帖子:http://stackoverflow.com/questions/8564738/c-sharp-excel-vsto-possible-to-move-a-pivottable,不幸的是,这是Visual Studio Tools for Office(VSTO)而不是VBA代码。你的答案正是我在VSTO中尝试做的事情。无论如何,还是谢谢。 - Jeremy Thompson
我知道这个,你可以在C# VSTO中做同样的事情。你试过了吗? - Doug Glancy
好的,这是一个非常有价值的提示(关于在VSTO C#中尝试VBA的等效方法)。我看到了你的编辑,请查看我的编辑,我尝试过但结果有些混乱。我也希望它能够正常工作。另外,如果你更喜欢VB,可以使用http://www.CodeChanger.com。 - Jeremy Thompson
好的,我尝试了您的编辑,它完美地运行了。非常感谢。 - Jeremy Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接