Excel VBA定义多个命名范围

Excel VBA定义多个命名范围,excel,vba,range,named,Excel,Vba,Range,Named,我正在处理一个有将近200个命名范围的工作表(每列是一个NR)。我现在想让它们成为动态的,而不是像这样定义它们 PersonID = =RawData!$A$2:$A$100 我想这样做 PersonID = OFFSET(RawData!$A$2,0,0,COUNTA(RawData!$A:$A),1) 但我不想手动执行此操作!有没有办法在Excel之外的文本编辑器中实现这一点,或者有没有办法通过编程实现这一点?我已经用第一种方法完成了200个NR,但是一想到要手动完成它们来进行更改,我就

我正在处理一个有将近200个命名范围的工作表(每列是一个NR)。我现在想让它们成为动态的,而不是像这样定义它们

PersonID = =RawData!$A$2:$A$100
我想这样做

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

但我不想手动执行此操作!有没有办法在Excel之外的文本编辑器中实现这一点,或者有没有办法通过编程实现这一点?我已经用第一种方法完成了200个NR,但是一想到要手动完成它们来进行更改,我就感到害怕

您可以在VBA中执行此操作。创建新名称的示例:

ActiveWorkbook.Names.Add Name:="PersonID", _
    RefersTo:="=OFFSET(RawData!$A$2,0,0,COUNTA(RawData!$A:$A),1)"
要编辑已存在的名称,请执行以下操作:

ActiveWorkbook.Names("PersonID").RefersTo = _
    "=OFFSET(RawData!$A$2,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 & "$2,0,0,COUNTA(RawData!$" & FindTheColumn & ":$" & FindTheColumn & "),1)"
    Debug.Print DynNameString
    'ActiveWorkbook.Names.Item(i).Name.RefersTo = DynNameString
  End If
Next i

End Sub
特别感谢让·弗朗索瓦帮助我

将RawData更改为sheetname,将NameToExclude更改为ranges,使其保持不变。
删除使其发生的最后一条评论!但一定要先备份一份

好的,谢谢!伟大的这将带我走一段路。我想我可以把referesto读出来作为一个字符串,搜索它已经定义的列,然后构建我的新字符串并分配它?我还可以遍历名称集合吗?我刚刚意识到,我不希望在命名范围的名称中使用特定的名称!我不能输入所有的名字!必须有一种方法来迭代所有命名范围,而不管它们的名称和交换内容?对不起,我是这个论坛的新手!我不知道我可以或者应该那样做!我现在非常感谢你的帮助!谢谢Jean Francois!我会看看我在这基础上提出了什么,然后把它贴在这里让你改进?我来看看旅游。。。。