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

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

=OFFSET(Time!$A$1,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 

но я получаю «Runtime error 1004, метод« Range »объекта« _Global »не удался».

Вы можете реплицировать совпадение в своем 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 

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

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

Удачи!

  • Поиск количества символов в Word VBA
  • Передача диапазона в пользовательскую функцию из ячейки
  • Код VBA для перемещения ячеек из одного столбца в другой на основе конкретных критериев ячейки
  • Диапазон Excel, содержащий определенные значения
  • Номер категории Vlookup в диапазоне и (кручение) имени
  • Вычитание диапазонов в VBA (Excel)
  • Ошибка VBA при завершении операции или сброс, когда массив назначен в диапазон внутри Sub
  • Значения 2D-массива на листе в определенном месте
  • Подзаголовок вне диапазона, Excel VBA, Попытка создания массива в цикле
  • VBA: искать конкретные значения в нескольких несмежных столбцах
  • Как вы получаете определенный диапазон адресов, чтобы отображаться как относительная ссылка в формуле?
  • Давайте будем гением компьютера.