我正在使用具有近200个命名范围的工作表(每列是NR)。我现在想让它们变得动态,而不是像
那样定义它们PersonID = =RawData!$A$2:$A$100
我想这样做
PersonID = OFFSET(RawData!$A$2,0,0,COUNTA(RawData!$A:$A),1)
但我不想手动执行此操作!有没有办法在Excel之外的texteditor中执行此操作,还是有办法以编程方式执行此操作?我已经在第一种方式完成了200个NR,但是手动完成所有改变的想法让我感到害怕。
答案 0 :(得分:1)
您可以在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
答案 1 :(得分:0)
这似乎是您工具箱中的一个非常好的工具?
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更改为您的工作表名称,并将NameToExclude更改为您的范围以保持不变。 删除最后一条评论以实现它!但一定要先制作备份副本!!!!