Обведите все значения именованных диапазонов - PullRequest
0 голосов
/ 26 июня 2019

У меня есть несколько именованных диапазонов в рамках моего Workbook.

enter image description here

Теперь я хочу перебрать все именованные диапазоны, следуя второму ответу по этой теме

Sub Range1()

Dim i As Integer

For i = 2 To ActiveWorkbook.Names.Count
    MsgBox ActiveWorkbook.Names(i).Name
Next i

End Sub

Этот макрос показывает мне все имена, такие как C_1 в msgbox. Я модифицирую скрипт следующим образом, чтобы «вызвать» каждый из диапазонов на основе имени соответствующего диапазона.

Sub Range2()

Dim i As Integer
Dim rng As Range
Dim nm As Name
Dim rng_name As String

For i = 2 To ActiveWorkbook.Names.Count
   Set nm = ActiveWorkbook.Names(i)
   rng_name = nm.Name
   Set rng = Application.Range(nm.Name)           `This line yields an error
   MsgBox rng.Address
Next i

End Sub

Я получаю ошибку:

«Ошибка во время выполнения« 1004 »: метод« Диапазон »объекта'_ Ошибка при апполяции

Есть идеи, что я делаю не так? Если я проверяю элементы, я вижу, что rng_name равно "C_1".

РЕДАКТИРОВАТЬ

Я считаю, что это как-то связано с тем, как создаются именованные диапазоны. Это делается следующим образом:

Sub createRanges()

Dim LastRowAll As Long, LastRowUnique As Long
Dim x, y
Dim rng As Range
Dim rng_name As String

LastRowUnique = Sheets("Lists").Range("J2").End(xlDown).Row
LastRowAll = Sheets("Deribit").Range("D8").End(xlDown).Row

For Each x In Sheets("Lists").Range("J2:J" & LastRowUnique)
    For Each y In Sheets("Deribit").Range("D8:D" & LastRowAll)
        If y.Offset(0, -1).value = "Call" Then
            If rng Is Nothing And y = x Then
                Set rng = y.Offset(0, -2)
            ElseIf y = x Then
                Set rng = Union(rng, y.Offset(0, -2))
            End If
        Else:
        End If
    Next y
    rng_name = "C_" & x.Offset(0, -1).value
    ThisWorkbook.Names.Add Name:=rng_name, RefersTo:=rng.Address
    Set rng = Nothing
Next x

1 Ответ

1 голос
/ 26 июня 2019

См .:

For i = 1 To ActiveWorkbook.Names.Count
    Set nm = ActiveWorkbook.Names(i)
    Set rng = ActiveWorkbook.Names(nm.Name) 'This is where the error was
    MsgBox rng.Address
Next i

Я также удалил имя rng_name, поскольку вы его не использовали.


Edit1:

Мне не удалось заставить Application.Range(nm.Name) работать изначально, но я смог заставить ActiveWorkbook.Range(nm.Name) работать, используя диапазоны на разных листах с именами "c" и "d".Я отметил, что nm = ActiveWorkbook.Names(i) не включал имя листа при его записи.

При именовании диапазонов с подчеркиванием и номером в них (я попытался c_1 & c_2), я не смогзаставить мой код работать;при проверке nm в режиме отладки я заметил, что в нем также указано имя листа.Мне нужно было указать, что rng ​​будет .RefersToRange, чтобы адрес ячейки отображался без имени листа.

Я сделал две дополнительные проверки, одну с подчеркиванием без номера (использовал «d_»), а другуюс числом и без подчеркивания (используется «name2»), и оба сделали дают мне ту же ошибку.Оба сценария сохранили имя листа в строке nm.

Вот код тестирования, который я выполнял / выполнял, чтобы разобраться с этим:

Dim rng As Range, i As Long
For i = 1 To ActiveWorkbook.Names.Count
    Set nm = ActiveWorkbook.Names(i)
    'Set rng = ActiveWorkbook.Names(nm.Name)
    Set rng = nm.RefersToRange
    'Debug.Print rng.Address
    MsgBox rng.Address
Next i

Использование Set rng = nm.RefersToRange сработалово всех сценариях, в то время как имена только из буквенных символов работали с предложением Set rng = ActiveWorkbook.Names(nm.Name).

, придерживайтесь .RefersToRange в качестве надежного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...