Как создать динамический именованный диапазон – репликация A1:INDEX(range, COUNT()) в VBA?

У меня есть лист, который извлекает данные из API по строкам. Таким образом, одна формула будет охватывать, скажем, 6000 столбцов в строке 1, так же, как и строка 2. Длина каждого из них может различаться. Поэтому мне нужно создать динамические именованные диапазоны.

Я понял, как выполнить цикл с использованием цикла For...Next вниз по строке (с помощью SO), но это просто создает общий диапазон ячеек вместо необязательности формулы.

Мне это нужно сейчас, потому что я имею дело с более чем 300 диапазонами.

Sub SeriesScripts()

    Dim lastcol As Long, i As Long, ws As Worksheet, rng As Range

    Set ws = ThisWorkbook.Sheets("Master Sheet")
    
    For i = 1 To 3
        lastcol = ws.Cells(i, ws.Columns.Count).End(xlToLeft).Column
        Set rng = ws.Cells(i, 1).Resize(1, lastcol)
        ThisWorkbook.Names.Add Name: = "Series_" & i, RefersTo:=rng
    Next i

End Sub

Это подходит для добавления диапазонов, о которых я не знал, но объект SERIES() по-прежнему фиксируется как заданный диапазон.

Я не знаком с синтаксисом R1C1. Может быть, это решение?


50
1

Ответ:

Решено

Мои предложения по формуле в двух вариантах. Первый – когда все ячейки заполнены, второй – когда некоторые ячейки могут быть пустыми.

Sub SeriesScriptsA()
    Dim i As Long, ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Master Sheet")
    For i = 1 To 3
        ThisWorkbook.Names.Add Name: = "Series_" & i, RefersToR1C1:= _
            " = " & ws.Name & "!R" & i & "C1:INDEX(" & ws.Name & "!R" _
            & i & ",COUNTA(" & ws.Name & "!R" & i & "))"
    
        ThisWorkbook.Names.Add Name: = "SeriesA_" & i, RefersToR1C1:= _
            " = " & ws.Name & "!R" & i & "C1:INDEX(" & ws.Name & "!R" _
            & i & ",MATCH(2,1/(" & ws.Name & "!R" & i & "<>"""")))"
    Next i
End Sub