VBA 定义多个命名范围

VBA Defining Multiple Named Ranges

我正在使用具有近 200 个命名范围的 sheet(每列都是一个 NR)。我现在想让它们动态化,而不是像

那样定义它们
PersonID = =RawData!$A:$A0

我想这样做

PersonID = OFFSET(RawData!$A,0,0,COUNTA(RawData!$A:$A),1)

但我不想手动执行此操作!有没有办法在 Excel 之外的文本编辑器中执行此操作,或者有没有办法以编程方式执行此操作?我已经以第一种方式完成了 200 个 NR,但是手动检查它们以进行更改的想法让我感到害怕。

您可以在 VBA 中完成。创建新名称的示例:

ActiveWorkbook.Names.Add Name:="PersonID", _
    RefersTo:="=OFFSET(RawData!$A,0,0,COUNTA(RawData!$A:$A),1)"

要编辑已有的名称:

ActiveWorkbook.Names("PersonID").RefersTo = _
    "=OFFSET(RawData!$A,0,1,COUNTA(RawData!$A:$A),1)"

您在评论中表示您还想遍历所有命名范围以方便更改它们的定义。要遍历所有名称,您可以这样做:

Dim nm As Name
For Each nm In ActiveWorkbook.Names
    Debug.Print nm.Name
Next nm

或者这个:

Dim i As Long
For i = 1 To ActiveWorkbook.Names.Count
    Debug.Print ActiveWorkbook.Names.Item(i).Name
Next i

这似乎是您工具箱中的一个不错的工具?

Sub MakeRangesDynamic()
Dim i As Long

For i = 1 To ActiveWorkbook.Names.Count
  If Not (ActiveWorkbook.Names.Item(i).Name = "NameToExclude1" Xor _
          ActiveWorkbook.Names.Item(i).Name = "NameToExclude2" Xor _
          ActiveWorkbook.Names.Item(i).Name = "NameToExclude3") Then

    FindTheColumn = Mid$(ActiveWorkbook.Names.Item(i).RefersTo, 11, 2)

    If Mid$(FindTheColumn, 2, 1) = "$" Then
        FindTheColumn = Mid$(FindTheColumn, 1, 1)
    Else
        FindTheColumn = Mid$(FindTheColumn, 1, 2)
    End If

    DynNameString = "=OFFSET(RawData!$" & FindTheColumn & ",0,0,COUNTA(RawData!$" & FindTheColumn & ":$" & FindTheColumn & "),1)"
    Debug.Print DynNameString
    'ActiveWorkbook.Names.Item(i).Name.RefersTo = DynNameString
  End If
Next i

End Sub

特别感谢 Jean-Francois 帮助我。

将 RawData 更改为您的工作表名称,将 NameToExclude 更改为您的范围以保持不变。 删除让它发生的最后一条评论!但是一定要先备份一份!!!!