Excel VBA将动态命名范围结果合并为静态范围i/o,保持动态
上下文(VBA7.1,Excel 2013 Pro):Excel VBA将动态命名范围结果合并为静态范围i/o,保持动态,excel,64-bit,vba7,vba,Excel,64 Bit,Vba7,Vba,上下文(VBA7.1,Excel 2013 Pro): 所有图纸和动态命名范围(DNR)都是通过编程方式创建的。我想将一些DNR单元(在多个列上有相同数据的情况)合并到一个DNR中,以便对它们进行分组。在此阶段,单位DNR及其合并结果均在工作表范围内 问题: 合并的命名范围不保留所有单个DNR的动态属性。如果我手动操作,它当然可以工作,只是为了确认要合并的DNR是有效的动态的 问题: 如何应用命名范围合并,使结果范围也保持为动态命名范围 主代码 Sub xx() ... some code g
所有图纸和动态命名范围(DNR)都是通过编程方式创建的。我想将一些DNR单元(在多个列上有相同数据的情况)合并到一个DNR中,以便对它们进行分组。在此阶段,单位DNR及其合并结果均在工作表范围内 问题:
合并的命名范围不保留所有单个DNR的动态属性。如果我手动操作,它当然可以工作,只是为了确认要合并的DNR是有效的动态的 问题:
如何应用命名范围合并,使结果范围也保持为动态命名范围
主代码
Sub xx()
... some code goes here ...
Dim DNRnames() As String
Dim MergedRange As Range
Dim currentRng As Range
Dim rngStr As Variant
Dim strStringToExclude() As String
' Get created DNRs on this sheet
strStringToExclude = Split("_Desc,Headers", ",")
DNRnames = DNRGetNames(aWS.Name, False, strStringToExclude)
' Merge DNRs into 1
For Each rngStr In DNRnames
' Set currentRng = aWS.Names(CStr(rngStr)).RefersToRange
Set currentRng = aWS.Range(CStr(rngStr)) ' also this way keeps it static
If Not MergedRange Is Nothing Then
Set MergedRange = Union(MergedRange, currentRng)
Else
Set MergedRange = currentRng
End If
Next rngStr
' Add "MergedRange" to the aWS : ISSUE : the MergeRange is NOT dynamic...
' as it would be if I would create it in the ws by a named_range=(range1,range2,..)
aWS.Names.Add Name:=DNRprefix & "All", RefersTo:=MergedRange
...
end sub
GetDNR:以字符串数组形式从工作表中返回命名范围,并排除一些我不想合并的选定命名范围(这是一种解决方法,因为我在VBA中找到了“Union”但没有“Substract”函数)
通过GetDNR
函数返回的DNR:
引用必须是字符串(例如“=A1,B2”
):
Range.Address
限制为255个字符,因此可能需要在合并范围之前创建它
对于工作簿范围命名范围:
MergedRange.Name = DNRprefix & "All"
Thx-Slai;我并没有百分之百地理解它。第二行是aWS.Names.Add…
没有编译,我对VBA没有足够的技能来找出问题所在。@hornetbzz我在aWS.Names.Add DNRprefix&“All”、“=”&MergedRange.Address
行中看不到任何可能无法编译的内容,但如果您能提供更多细节,我可能会想到一些东西。我在Excel 2016上试用了它,它使用了Sheet1.Names.Add“ab”,“A1,B2”
行aWS.Names.Add Name:=DNRprefix(0)和“_All”,“=”&MergedRange.Address(0,0)
导致此编译错误:预期:命名参数
删除名称:=
参数名称,或者也包括引用:=
参数名称。@hornetbzz抱歉,我可能误解了这个问题。我找不到一种方法来保持组合命名范围的动态性,即使是像,referesto:=“=Name1,Name2”
或,referesto:=“=INDIRECT(““Name1,Name2”)”,
或,referesto:=”=EVALUATE(““Name1,Name2”)
。我猜一个VBA UDF函数可能是一个选项,它引用类似于Range(“Name1,Name2”)
的内容。
Set MergedRange = aWS.Range(Join(DNRnames, ","))
aWS.Names.Add DNRprefix & "All", "=" & MergedRange.Address
MergedRange.Name = DNRprefix & "All"