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

Возвращенный ДНР GetDNR функция:

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"
Другие вопросы по тегам