Проверьте, существует ли диапазон в VBA

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

=OFFSET(Time!$A,IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),1,MATCH(Date_Range_End,AllDates)-IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),4)

но если диапазон дат не имеет данных в таблице, диапазон не существует (или что-то, idk). Как я могу написать код в VBA, чтобы проверить, если этот диапазон или нет?

Я пробовал что-то вроде

If Not Range("DateRangeData") Is Nothing Then

но я получаю "ошибка выполнения 1004, метод "диапазон" объекта "_Global" не удалось."

4 ответов


вы можете реплицировать совпадение в VBA для подсчета перед использованием диапазона, сколько строк у вас будет, или вы можете использовать обработку ошибок:

On Error Resume Next

Debug.Print range("DateRangeData").Rows.Count

If Err = 1004 Then
    MsgBox "Range Empty"
    Exit Sub
Else
    MsgBox "Range full"
End If

Err.Clear
On Error GoTo 0

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

Function RangeExists(R As String) As Boolean
    Dim Test As Range
    On Error Resume Next
    Set Test = ActiveSheet.Range(R)
    RangeExists = Err.Number = 0
End Function

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

такой:

If NamedRangeExists(ActiveSheet.Names, "Date") Then
    ...
Else
...
End If

или

If NamedRangeExists(ActiveWorkbook.Names, "Date") Then
   ...
Else
   ...
End If

Public Function NamedRangeExists(ByRef Container As Object, item As String) As Boolean


Dim obj As Object
Dim value As Variant

On Error GoTo NamedRangeExistsError:

    value = Container(item)
    If Not InStr(1, CStr(value), "#REF!") > 0 Then
        NamedRangeExists = True
    End If
    Exit Function

Exit Function

NamedRangeExistsError:
    NamedRangeExists = False
End Function

в зависимости от приложения, которое вы делаете, хорошо рассмотреть возможность использования словаря. Они особенно полезны, когда вы хотите проверить, существует ли что-то. Возьмем такой пример:

Dim dictNames as Scripting.Dictionary

Sub CheckRangeWithDictionary()

    Dim nm As Name

    'Initially, check whether names dictionary has already been created
    If Not dictNames Is Nothing Then
        'if so, dictNames is set to nothing
        Set dictNames = Nothing
    End If

    'Set to new dictionary and set compare mode to text
    Set dictNames = New Scripting.Dictionary
    dictNames.CompareMode = TextCompare

    'For each Named Range
    For Each nm In ThisWorkbook.Names
        'Check if it refers to an existing cell (bad references point to "#REF!" errors)
        If Not (Strings.Right(nm.RefersTo, 5) = "#REF!") Then
            'Only in that case, create a Dictionary entry
            'The key will be the name of the range and the item will be the address, worksheet included
            dictNames(nm.Name) = nm.RefersTo
        End If
    Next

    'You now have a dictionary of valid named ranges that can be checked

End Sub

в вашей основной процедуре все, что вам нужно сделать, это сделать проверку существования перед использованием диапазона

Sub CopyRange_MyRange()

    CheckRangeWithDictionary

    If dictNames.exists("MyRange") then
        Sheets(1).Range("MyRange").Copy
    end if

End Sub

при загрузке словаря может выглядеть немного дольше, это очень быстро для обработки и поиска. Также становится намного проще проверить, есть ли какой-либо именованный диапазон ссылка на допустимый адрес существует без использования обработчиков ошибок в этом простом приложении.

обратите внимание, что при использовании имен на уровне листа, а не книги уровне, необходимо использовать более сложные ключи, чтобы гарантировать уникальность. Из того, как был создан словарь, если ключ повторяется, значение элемента перезаписывается. Этого можно избежать, используя то же самое существует метод в качестве проверки в инструкции создания ключа. Если вам нужна хорошая ссылка на то, как чтобы использовать словари, используйте это один.

удачи!