VBA定义多个命名范围

我正在使用近200个命名范围(每列是NR)的工作表。 我现在想让他们dynamic而不是像他们定义他们

PersonID = =RawData!$A$2:$A$100 

我想这样做

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

但我不想手动做这个! 有没有办法做到这一点在Excel以外的texteditor或有办法做到这一点编程? 我已经有了第一种方式完成的200个NR,但手动经过它们的想法都改变了我。

你可以在VBA中做到这一点。 创build新名称的示例:

 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 

特别感谢Jean-Francois帮助我。

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