2011-12-28 6 views
10

Я пытаюсь понять, что, по моему мнению, было бы довольно простым заявлением vba, чтобы проверить, имеет ли именованный диапазон область охвата рабочей книги или определенного листа.Прогеммически определить, обладали ли именованные диапазоны в рабочей книге


В качестве теста я создал новый документ Excel и добавлен в 6 названных диапазонов. Вот как они заложили, в Имя менеджера:

Name   | Refers To   | Scope 
-------------+----------------------+----------- 
rng_Local01 | =Sheet1!$A$2:$A$16 | Sheet1 
rng_Local02 | =Sheet1!$C$2:$C$16 | Sheet1 
rng_Local03 | =Sheet1!$E$2:$E$16 | Sheet1 
rng_Global01 | =Sheet1!$B$2:$B$16 | Workbook 
rng_Global02 | =Sheet1!$D$2:$D$16 | Workbook 
rng_Global03 | =Sheet1!$F$2:$F$16 | Workbook 

Я бы ожидать, что работает:

For i = 1 To ThisWorkbook.Names.Count 
    If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

приведет к трем Workbook контекстными именованных диапазонов для быть авторизованы, однако ничего не происходит. Ошибок нет. .Names(i).WorkbookParameter оценивает по False по адресу ВСЕ названных диапазонов, и я не уверен, почему.


Просматривая Name объекта в помощи VBA я наткнулся на ValidWorkbookParameter, который выглядит как ReadOnly кузена WorkbookParameter, однако с помощью этого метода не имеет никакого значения.

Я также попытался явно устанавливая ThisWorkbook.Names(i).WorkbookParameter = True, однако это приводит к ошибке:

"Invalid procedure call or argument"

Несмотря на то, что WorkbookParameter перечислен как Чтение/запись


Может кто-нибудь пролить любой свет на то, почему это не работает, как я тоже этого ожидаю? Я не понял, как должен работать Name.WorkbookParameter? Кто-нибудь может заставить это работать успешно?

+0

Спасибо за самые полезные решения ребята ... Мне все еще интересно узнать о свойствах свойств «WorkbookParameter» и «ValidWorkbookParameter» объекта «Name» в VBA. На мой взгляд, эти свойства не работают *, как рекламируется *. –

+0

Не уверен, что именно WorkbookParameter, но подозревает его для служб Excel в Sharepoint, а не для клиента Excel –

ответ

19

Вы можете использовать свойство Parent:

Sub Global_Local_names() 
    Dim oNm As Name 
    For Each oNm In Names 
     If TypeOf oNm.Parent Is Worksheet Then 
      Debug.Print oNm.Name & " is local to " & oNm.Parent.Name 
     Else 
      Debug.Print oNm.Name & " is global to " & oNm.Parent.Name 
     End If 
    Next 
End Sub 
+0

Nice. Спасибо за подсказку – JMax

+0

Спасибо за решение ... Я не думал использовать свойство «Родитель».Я отметил это как ответ, поскольку он наиболее непосредственно касается того, принадлежит ли указанный диапазон к книге или к листу. –

3

мне не удалось сделать WorkbookParameter работу, но я нашел обходной путь:

For i = 1 To ThisWorkbook.Names.Count 
    If UBound(Split(ThisWorkbook.Names(i).Name, "!")) > 0 Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

Название местного именованного диапазона (т.е. область только для листа) форматируется следующим образом: Sheet1!NamedRange, тогда как имя global Именованный диапазон отформатирован: NamedRange.

Таким образом, вы можете разделить на ! и проверить длину массива.

+0

Мне нравится творческое решение, использующее 'Split' –

Смежные вопросы