Страницы: 1
RSS
является ли имя именованной константой?
 
Как средствами vba определить является ли конкретное имя константой, т.е когда имя не ссылается на диапазон (ячейку)
 
Код
On Error Resume Next
Set r = Names("qwe").RefersToRange
If Err Then 'не диапазон
 
Я тоже так хотел в начале, но не проходит, поскольку именем может быть ни только ДИАПАЗОН, но и массив, и даже формула.....
Вытащить информацию, что не диапазон проще простого (например так, как вы указали)
 
- http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=47299
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
что, нет решений. как красиво решить задачу?
 
evgmaz, а вот "на слабо" не нужно - проходили уже...
 
Не понимаю ответа, но если действительно нет содержательного решения, тогда смело закрывайте тему.....
Мне казалось, что это очень простая задача, судя по аналогичным вопросам, но мне самому не удавалась ее решить....
Никого обижать и брать на слабо не собирался. Об этом вы сами сказали.....
Спасибо!
 
.RefersToRange не сработает с русскими названиями функций типа СЧЁТ, ИНДЕКС и т.п., которые могут быть в именах динамических диапазонах. Надежнее так:
Код
Function IsRange(MyName As String) As Boolean
  IsRange = IsObject(Evaluate(MyName))
End Function


или так:
Код
Function IsRange(MyName As String) As Boolean
  On Error Resume Next
  With Evaluate(MyName).Cells: End With
  If Err Then Err.Clear Else IsRange = True
End Function


При проверке констант, полагаю, достаточно считать, что если не диапазон, то это константа
Изменено: ZVI - 04.04.2013 16:48:40
 
Цитата
ZVI пишет: При проверке, полагаю, достаточно считать, что если не диапазон, то это константа
А так считать нельзя, поскольку у меня бывают и именованные массивы и именованные формулы
 
Понятно, тогда можно, например, проще:
Код
Function IsConstant(MyName As String) As Boolean
  Dim s As String
  s = Trim(Mid(Names(MyName).RefersTo, 2))
  IsConstant = IsNumeric(s) Or Mid(s, 1, 1) = """"
End Function

Если тоже не годится, то приведите примеры имен констант и не констант, с идентификацией которых возникают проблемы. И укажите, что Вы считаете чем.
Например, для RefersTo: =1+2 или ="A"&"B" - это по результату константы, но с другой стороны - это вычисляемые константы, то есть формулы
Изменено: ZVI - 04.04.2013 17:10:55
 
Спасибо, сейчас изучаю ваше решение....
RefersTo: =1 - это константа
RefersTo: ==Лист2!$H$15+Лист2!$J$13 - это формула
RefersTo: ={"пн";"вт";"ср";"чт"} - это массив

Вы правильно уловили мой вопрос...из кучи возможных имен, нужно выбрать конкретного типа (в частности константы, и в частности массивы)
 
[QUOTE]ZVI пишет:
Понятно, тогда можно, например, проще:
Код
 Function IsConstant(MyName As String) As Boolean
  Dim s As String
  s = Trim(Mid(Names(MyName).RefersTo, 2))
  IsConstant = IsNumeric(s) Or Mid(s, 1, 1) = """"
End Function 


Спасибо ZVI.... проверил, работает....
Я правильно понимаю, что для массива можно аналогично только фиг скобку надо выделять....
По другому никак?
 
Цитата
evgmaz: ... для массива можно аналогично только фиг скобку надо выделять.... По другому никак?
Всё правильно. Для идентификации массива можно и по другому, например:

Код
Function IsAnArray(MyName As String) As Boolean
  IsAnArray = TypeName(Evaluate(MyName)) = "Variant()"
End Function

' Или, если нужно похуже :-)
Function IsAnArray(MyName As String) As Boolean
  IsAnArray = IsArray(Evaluate(MyName)) And Not IsObject(Evaluate(MyName))
End Function


Для диапазона можно тоже по аналогии:
Код
Function IsRange(MyName As String) As Boolean
  IsRange = TypeName(Evaluate(MyName)) = "Range"
End Function
Изменено: ZVI - 05.04.2013 06:37:48
 
Спасибо ZVI, Вы даже помнится как-то уже помогали мне еще на старом форуме....

Собственно говоря, Вы продемонстрировали новый для меня аппарат программирования через TypeName и Evaluate. Раньше я только разбирал по частям строку для решения подобных задач.
Чувствовал, что можно как-то иначе (более красиво), но не знал!
 
ИМХО. Формально: Имя - это всегда переменная. Даже если =1 или ="а".
Раз стоит "=" , значит вычисляется; вычисляется, значит переменная.
Страницы: 1
Читают тему
Наверх