c# - 如何在 Excel 中移动 NamedRange - VSTO 而不是 VBA

标签 c# excel vsto named-ranges

我在网上搜索了一下,根据文档,似乎没有移动 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?

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

编辑:

阅读 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);
        }

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

相关文章:

vba - EXCEL:使用 vba 或公式从单元格中提取毫升和升

string - 公式来查看姓氏是否在单元格内重复并输出简化的字符串

加载项中的 WPF LifeCyle

c# - 如何增加局部变量的限制

c# - 如何将鼠标滚轮事件中的计时器间隔更改为快和慢?

c# - 如何用ASP Core运行爬虫、服务交互和生命周期问题

c# - 使用来自 c# reportviewer 的文件流创建新的 excel 工作表

c# - 简化 Excel 单元格列表以创建范围

c# - Word、VSTO、OpenXml - 将 XML 插入段落对象

c# - c# 中的聚合异常不保存单个异常消息