2016-06-03 4 views
2

Я пытаюсь определить, был ли именованный диапазон установлен через VBA. Именованный диапазон называется LoadedToken и по существу загружается, когда пользователь нажимает на определенную кнопку. Я использую это как доказательство того, что инициализация состоялась.Excel VBA проверяет, установлен ли именованный диапазон

У меня есть функция, чтобы проверить, если это имело место:

Function ToolIsEnabled() 

    ' We check if the R2A add-in has been loaded by detecting the named range 
    If ActiveWorkbook.Names("LoadedToken") Is Nothing Then 
     ToolIsEnabled = False 
    Else 
     ToolIsEnabled = True 
    End If 

End Function 

и я получаю сообщение об ошибке приложения. Конечно, VBA неверен. Однако как я могу это сделать ?!

+0

короткая версия 'ToolIsEnabled = [ISERR (LoadedToken)]' – Slai

ответ

3
Sub Test() 
    Debug.Print IsNamedRange("Bumsti") 
End Sub 

Function IsNamedRange(RName As String) As Boolean 
Dim N As Name 

    IsNamedRange = False 
    For Each N In ActiveWorkbook.Names 
     If N.Name = RName Then 
      IsNamedRange = True 
      Exit For 
     End If 
    Next 
End Function 

Использование в контексте ОП может быть

' ... 
If IsNamedRange("LoadedToken") Then 
    ' ... 
End If 
' ... 

или - если программа конкретных Bool необходимо установить

' ... 
Dim IsTokenLoaded as Boolean 
IsTokenLoaded = IsNamedRange("LoadedToken") 
' ... 

Both constr ucts делают это довольно ясно в исходном коде, к чему вы стремитесь.

+0

Да, это должно быть частью основной библиотеки расширений. (а не использовать On Error Resume Next) –

+1

Угадайте, откуда это происходит ... моя основная библиотека :-) – MikeD

+0

Очень читаемое решение и что-то, что я добавил в мой маленький помощник класса. –

0

Вы можете добиться этого с помощью обработки ошибок:

Function ToolIsEnabled() As Boolean 
    Dim rng As Range 

    On Error Resume Next 
    Set rng = ActiveWorkbook.Range("LoadedToken") 
    On Error GoTo 0 

    ToolIsEnabled = Not rng is Nothing 

End Function 
0

Это будет проверяться либо в ThisWorkbook, либо в названной книге, и возвращает TRUE/FALSE.

Sub Test() 

    MsgBox NamedRangeExists("SomeName") 
    MsgBox NamedRangeExists("SomeOtherName", Workbooks("Book1.xls")) 

End Sub 

Public Function NamedRangeExists(sName As String, Optional Book As Workbook) As Boolean 

    On Error Resume Next 

     If Book Is Nothing Then 
      Set Book = ThisWorkbook 
     End If 

     NamedRangeExists = Book.Names(sName).Index <> (Err.Number = 0) 

    On Error GoTo 0 

End Function 

Edit: Сокращенный вариант, если он только будет выглядеть в ThisWorkbook:

Public Function NamedRangeExists(sName As String) As Boolean 

    On Error Resume Next 

     NamedRangeExists = ThisWorkbook.Names(sName).Index <> (Err.Number = 0) 

    On Error GoTo 0 

End Function 
+0

интересно, как выглядит '<>', когда 'ThisWorkbook.Names (sName) .Index' выдает сообщение об ошибке? Is на самом деле оценивает 'false' или является возвращаемым значением только значением по умолчанию' NamedRangeExists'? – arcadeprecinct

+0

Мое понимание этого заключается в том, что, как вы говорите, значением по умолчанию является 'false', которое возвращается, если' ThisWorkbook.Names (sName) .Index <> (Err.Number = 0) 'выдает ошибку из-за имени not существующий. Если он существует, хотя он вернет положительное значение, а 'Err.Number = 0' вернет TRUE, который будет равен -1, поэтому результат будет выглядеть как' 1 <> -1 = TRUE' –

+0

Но 'ThisWorkbook.Names (sName) .Index> 0' сделает то же самое, не так ли? – arcadeprecinct

0

Для ActiveWorkbook, вы можете также вызвать функцию старого XLM ИМЕНА():

Function IsNameInActiveWorkbook(sName As String) As Boolean 
    IsNameInActiveWorkbook = Not IsError(Application.ExecuteExcel4Macro("MATCH(""" & sName & """,NAMES(),0)")) 
End Function 
Смежные вопросы