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 更改为您的范围以保持不变。
删除让它发生的最后一条评论!但是一定要先备份一份!!!!
我正在使用具有近 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 更改为您的范围以保持不变。 删除让它发生的最后一条评论!但是一定要先备份一份!!!!