VBA Объединение динамических именованных диапазонов приводит к статическому диапазону ввода-вывода, сохраняя динамический
Контекст (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: возвращает именованные диапазоны из листа в виде строкового массива и исключает некоторый выбранный именованный диапазон, который я не хочу объединять (это обходной путь, так как я нашел функцию "Союз", но в VBA нет функции "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 ?)
' https://stackru.com/questions/12663879/adding-values-to-variable-array-vba
' https://stackru.com/questions/4029975/excel-listing-named-range-in-a-worksheet-and-get-the-value
' 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
1 ответ
RefersTo
должна быть строка обозначения стиля А1 (например, "=A1,B2"
):
Set MergedRange = aWS.Range(Join(DNRnames, ","))
aWS.Names.Add DNRprefix & "All", "=" & MergedRange.Address
Range.Address
ограничено 255 символами, поэтому может потребоваться создать его перед объединением диапазонов.
Для рабочей области именованного диапазона:
MergedRange.Name = DNRprefix & "All"