VBA 合并动态命名范围导致静态范围 i/o 保持动态
VBA Merge of Dynamic Named Ranges results into a static range i/o keeping dynamic
上下文(VBA7.1,Excel 2013 Pro):
所有工作表和动态命名范围 (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: return 将工作表中的命名范围作为字符串数组并排除一些我不想合并的选定命名范围(这是一种解决方法,因为我在 VBA)
中找到 "Union" 但没有 "Substract" 函数
Function DNRGetNames(sheetName As String, WbScope As Boolean, SuffixStringToExclude() As String) As String() ' all DNR from one specific sheet (with wb scope or ws scope ?)
'
'
' kind of getter and setter
Dim wb As Workbook
Dim aWS As Worksheet
Dim element As Name
ReDim DNRArray(1 To 1) As String
Set wb = ThisWorkbook
Set aWS = wb.Sheets(sheetName)
' if SuffixStringToExclude is not defined, fill in the suffic string with a default fake data
If Not Len(Join(SuffixStringToExclude)) > 0 Then
SuffixStringToExclude = Split("*FaKe!")
End If
' populate a dynamic array with DNR related to aWS
For Each element In wb.Names
If Not ArrayIsInString(element.Name, SuffixStringToExclude) Then '
If IsNameRefertoSheet(aWS, element) Then
DNRArray(UBound(DNRArray)) = element.Name
ReDim Preserve DNRArray(1 To UBound(DNRArray) + 1) As String
End If
End If
Next element
' clean exit
If UBound(DNRArray) > 1 Then
ReDim Preserve DNRArray(1 To UBound(DNRArray) - 1) As String
DNRGetNames = DNRArray
Else
DNRGetNames = Empty
End If
End Function
GetDNR
函数 返回的 DNR:
RefersTo
必须是 A1 style notation 字符串(例如 "=A1,B2"
):
Set MergedRange = aWS.Range(Join(DNRnames, ","))
aWS.Names.Add DNRprefix & "All", "=" & MergedRange.Address
Range.Address
限制为 255 个字符,因此可能需要在合并范围之前创建它。
对于命名范围的工作簿范围:
MergedRange.Name = DNRprefix & "All"
上下文(VBA7.1,Excel 2013 Pro):
所有工作表和动态命名范围 (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: return 将工作表中的命名范围作为字符串数组并排除一些我不想合并的选定命名范围(这是一种解决方法,因为我在 VBA)
中找到 "Union" 但没有 "Substract" 函数Function DNRGetNames(sheetName As String, WbScope As Boolean, SuffixStringToExclude() As String) As String() ' all DNR from one specific sheet (with wb scope or ws scope ?)
'
'
' kind of getter and setter
Dim wb As Workbook
Dim aWS As Worksheet
Dim element As Name
ReDim DNRArray(1 To 1) As String
Set wb = ThisWorkbook
Set aWS = wb.Sheets(sheetName)
' if SuffixStringToExclude is not defined, fill in the suffic string with a default fake data
If Not Len(Join(SuffixStringToExclude)) > 0 Then
SuffixStringToExclude = Split("*FaKe!")
End If
' populate a dynamic array with DNR related to aWS
For Each element In wb.Names
If Not ArrayIsInString(element.Name, SuffixStringToExclude) Then '
If IsNameRefertoSheet(aWS, element) Then
DNRArray(UBound(DNRArray)) = element.Name
ReDim Preserve DNRArray(1 To UBound(DNRArray) + 1) As String
End If
End If
Next element
' clean exit
If UBound(DNRArray) > 1 Then
ReDim Preserve DNRArray(1 To UBound(DNRArray) - 1) As String
DNRGetNames = DNRArray
Else
DNRGetNames = Empty
End If
End Function
GetDNR
函数 返回的 DNR:
RefersTo
必须是 A1 style notation 字符串(例如 "=A1,B2"
):
Set MergedRange = aWS.Range(Join(DNRnames, ","))
aWS.Names.Add DNRprefix & "All", "=" & MergedRange.Address
Range.Address
限制为 255 个字符,因此可能需要在合并范围之前创建它。
对于命名范围的工作簿范围:
MergedRange.Name = DNRprefix & "All"