我有一本工作簿,其中包含大量命名范围(远远超过 200 个)。我确实需要一种快速、轻松地处理所有命名范围的方法,这样我就可以使用 VBA 处理/填充它们。
到目前为止,我的解决方案是在公共(public) NamedRanges
模块中的一堆 get property
中添加代码,以将属性设置为等于命名范围,例如所以:
Public Property Get LotNumber49() As range
Set LotNumber49 = Common.GetRange(Strings.LotNumber49)
End Property
其中Strings.LotNumber49
是一个属性,其中包含工作簿中记录的命名范围的名称,Common.GetRange
是一个返回新实例的方法所需范围对象的。
虽然这个解决方案效果很好(我现在可以通过调用NamedRanges.LotNumber49
来访问该命名范围的实例),但在Strings中键入属性绝对是耗时且乏味的
类和 NamedRanges
类中的另一个属性。
有没有更好的方法来完成任何人都能想到的命名范围的快速引用?也许迭代由 Workbook.Names
属性返回的集合?
谢谢大家,我要处理这本工作簿以及其他四本工作簿,这意味着大量的命名范围!
最佳答案
通过字符串获取命名范围
为什么不采用像这样的简单过程:
Function GetNR(namedRange as String) as Range
Set GetNR = ActiveWorkbook.Names(namedRange).RefersToRange
End Function
然后只需获取命名范围,如下所示:
Sub Example()
Debug.Print GetNR("NAME").Value
End Sub
VBA 项目中的命名范围建议
或者如果您希望在 VBA 项目中弹出名称,则需要重新定义 Strings
类中的常量。尝试这个过程:
Sub GetAllNames()
Dim res As String, n As Name
For Each n In ActiveWorkbook.Names
If InStr(n.Name, "!") = 0 Then res = res & "Const " & n.Name & "=""" & n.Name & """" & vbNewLine
Next n
Dim fFile As Long
fFile = FreeFile
Open "out.txt" For Output As #fFile
Print #fFile, res
Close #fFile
End Sub
修改命名范围时,您需要偶尔重复此操作:
- 运行
GetAllNames
过程 - 打开
out.txt
文件 - 将输出复制到您的
Strings
类或其他类
现在要获取命名范围,请使用您的 Common.GetRange
方法以及您的 Strings
名称,或者简单地使用上面的方法来生成 Getter
代码如下:
Sub GetAllGetters()
Dim res As String, n As Name
For Each n In ActiveWorkbook.Names
If InStr(n.Name, "!") = 0 Then res = res & "Public Property Get " & n.Name & "() As range" & vbNewLine & "Set " & n.Name & " = Common.GetRange(Strings." & n.Name & ")" & vbNewLine & "End Property"
Next n
Dim fFile As Long
fFile = FreeFile
Open "outGetters.txt" For Output As #fFile
Print #fFile, res
Close #fFile
End Sub
关于vba - 将所有命名范围提取到一个类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30988364/