如何在Visual Studio/VB中更新RefersToR1C1 Excel命名范围

如何在Visual Studio/VB中更新RefersToR1C1 Excel命名范围,excel,vb.net,Excel,Vb.net,最新编辑:我已经尝试了很多东西,但仍然不明白这一点。一个更简洁的问题是如何分配变量。根据我得到的第一条评论,我正在使用VSTO Dim wksSheetVSTO As Worksheet = Globals.Factory.GetVstoObject(wsThisSheet) Dim nrThisNamedRange As NamedRange = ??? 原始问题: 我是Visual Studio/VB.Net的新手,但我是一名经验丰富的VBA程序员。我有一个非常复杂的电子表

最新编辑:我已经尝试了很多东西,但仍然不明白这一点。一个更简洁的问题是如何分配变量。根据我得到的第一条评论,我正在使用VSTO

    Dim wksSheetVSTO As Worksheet = Globals.Factory.GetVstoObject(wsThisSheet)
    Dim nrThisNamedRange As NamedRange = ???
原始问题:

我是Visual Studio/VB.Net的新手,但我是一名经验丰富的VBA程序员。我有一个非常复杂的电子表格,使用Excel命名的范围,我似乎不知道如何操作它们

现有的电子表格使用Excel命名的区域,这些区域的行为基本上类似于数据库表。当用户添加一行时,它会将一行添加到命名范围。由于Excel不会自动扩展范围本身,VBA代码通过重新定义命名范围的refrestor1C1属性来重新定义命名范围以包括新行。它在VBA中工作得非常好。(如果有帮助,我可以发布正在工作的VBA代码。)

在VisualStudio/VB中,我想不出一种方法来将变量指定给指定的范围。我能找到的唯一文档谈到通过创建新的命名范围来分配变量,但我已经有了命名范围。我的工作环境(工作正常,但对我来说很糟糕)如下:

   Dim rngDataStore As Excel.Range
   Dim nrThisNamedRange As NamedRange

   ...<<stuff happening here>>...

    rngDataStore.Resize(1).Insert(Excel.XlInsertShiftDirection.xlShiftDown)

    ' The next line is what I don't want.
    nrThisNamedRange = wksSheetVSTO.Controls.AddNamedRange(wksSheetVSTO.Range("A1"), <<name>>)
    nrThisNamedRange.RefersToR1C1 = <<new named range R1C1 here>>
以Excel.Range的形式显示
将此命名为命名为命名
......
rngDataStore.Resize(1).Insert(Excel.XlInsertShiftDirection.xlShiftDown)
“下一行是我不想要的。
nrThisNamedRange=wksheetvsto.Controls.AddNamedRange(wksheetvsto.Range(“A1”),)
nrThisNamedRange.referestor1C1=
我不想仅仅扩展工作范围(rngDataStore),我需要实际更新命名范围的定义,以便继续引用和写入它。(这正是ctrl+F3允许您在Excel中执行的操作。)我尝试过在Names集合中循环,但除了使用“Controls.AddNamedRange”之外,我不知道如何简单地分配nrThisNamedRange变量并更新其RefersToR1C1属性


补充:上面的代码并不总是有效的,它给了我一个错误,命名范围已经存在。(我当然知道!)

对于全局命名范围:

Dim name = Globals.ThisWorkbook.Names.Item("name")
Dim range = name.RefersToRange
name.RefersTo = range.Resize(range.Rows.Count + 1)

@Slai帮助我找到了答案(工作表中有全局命名范围),所以我想我至少应该为任何可能需要它的人分享完整的功能

  Function ExpandNamedRange(sRangeName As String, lRowsToAdd As Long, sSheetName As String) As Boolean
    ' Adds the specified number of rows and resets the surrounding named range.

    Dim wsThisSheet As Excel.Worksheet = Globals.ThisWorkbook.Application.Worksheets(sSheetName)
    Dim rngDataStore As Excel.Range = wsThisSheet.Range(sRangeName)

    If lRowsToAdd > 0 Then
        rngDataStore.Resize(lRowsToAdd).Insert(Excel.XlInsertShiftDirection.xlShiftDown)

        ' For a global/workbook named range
        Globals.ThisWorkbook.Names.Item(sRangeName).RefersToR1C1 = "=" & wsThisSheet.Name &
                               "!R" & rngDataStore.Row - lRowsToAdd & "C" & rngDataStore.Column &
                               ":R" & rngDataStore.Row + rngDataStore.Rows.Count - 1 & "C" & rngDataStore.Column + rngDataStore.Columns.Count - 1

        ' For a local/worksheet named range
        'wsThisSheet.Names.Item(sRangeName).RefersToR1C1 = "=" & wsThisSheet.Name &
        '                       "!R" & rngDataStore.Row - lRowsToAdd & "C" & rngDataStore.Column &
        '                       ":R" & rngDataStore.Row + rngDataStore.Rows.Count - 1 & "C" & rngDataStore.Column + rngDataStore.Columns.Count - 1
    End If
    Return True
End Function
我学到了两件事: (1) 我实际上根本不需要引用NamedRange对象,我可以使用工作簿的Names集合;我最初是这样尝试的,因为我的第一次尝试失败了。但这很好,它节省了我的步骤。
(2) 在VBA中,您可以在任何地方引用“全局”命名范围。这就是我被卡住的地方。

我不使用VSTO,因此我不熟悉NamedRange控件。但是,for it表示将范围公式指定给refrestor1c1属性,就像指定给Excel.Name对象一样。您的问题是
rngDataStore.Address(True,True,Excel.XlReferenceStyle.xlR1C1,False,False)
没有返回您认为的已调整大小的范围吗<代码>范围。调整大小是一个属性,您需要指定其结果
rngDataStore=rngDataStore.Resize(rows,cols)
谢谢TnTinMn,我使用了您链接到的文档,以便让上面的代码像上面的示例一样工作。我的问题不是操纵范围本身(上面提到的rngDataStore)——这一切都很好。但我需要做的是重新分配底层/原始Excel命名范围,基本上我要问的是如何分配变量nrThisNamedRange而不使用“AddNamedRange”操作。你看过MSDN上的示例吗谢谢Slai,是的,我看过那篇文章。它添加了一个新的命名范围。(我发现的所有示例都添加了一个新的命名范围。没有一个示例尝试操作现有的命名范围。)我不想添加一个,我已经在工作表中有了它们,需要引用它们,仅此而已。与VBA中几乎相同:
rngDataStore.worksheet.Names[“name”]。refrestor1C1=“=R1C1”。我不确定您是否可以在不添加它的情况下获得
NamedRange
对象,因为当我仅使用
时,似乎没有用于它的方法。name(“name”)
我得到一个错误,它需要一个整数。这就是为什么我改用
.Names.Item(“name”)
的原因。