Страницы: 1
RSS
Как подсчитать количество именнованых клеток на листе?
 
Пытаюсь сделать так:=СЧЁТЕСЛИ(A1:AF828;"_*") но не выходит.
_* - это фильтр моих именованных ячеек. Все имена у меня типа _0_  _1_  _253_ ....
 
А что вы подразумеваете под "именованными клетками"? :)
There is no knowledge that is not power
 
Попробуйте так:

=СЧЁТЕСЛИ(A1:AF828;"_"&"*")
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Я так полагаю только через VBA(если это то, о чем я подумал). Что-то навроде такой вот пользовательской функции:
Код
Function Count_Names(sPref As String, Optional bShOnly As Boolean = False)
    Dim objName As Name, sName As String, lCnt As Long
    For Each objName In Application.Caller.Parent.Names
        sName = objName.Name
        If InStr(sName, "!") Then sName = Mid(sName, InStr(sName, "!") + 1)
        If Left$(sName, Len(sPref)) = sPref Then
            lCnt = lCnt + 1
        End If
    Next objName
    'смотрим имена с областью действия Книга
    If bShOnly = False Then
        For Each objName In ActiveWorkbook.Names
            sName = objName.Name
            If InStr(sName, "!") Then sName = Mid(sName, InStr(sName, "!") + 1)
            If Left$(sName, Len(sPref)) = sPref Then
                lCnt = lCnt + 1
            End If
        Next objName
    End If
    Count_Names = lCnt
End F unction

На листе в ячейку заносите:
=Count_Names("_")

Если хотите, чтобы имена просматривались исключительно с областью действия на листе с функцией:
=Count_Names("_";ИСТИНА)
или
=Count_Names("_";1)

Единственный обязательный аргумент - это префик имени, по которому ведется подсчет. Если указать =Count_Names("_П"), то будут подсчитаны все имена, которые начинаются с "_П".

Если не знаете, как применять пользовательские функции: Что такое функция пользователя(UDF)?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Johny, Формулы -> Присвоить имя
Владимир, не получается. Выдает ноль
 
Владимир, я так посмотрел, запись =СЧЁТЕСЛИ(A1:A4;"_1_"), при условии что в этом диапазоне есть именованная клетка _1_ тоже дает ноль, и имя клетки не видит
 
Лучше выкладывать пример.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Сергей Позняк, давайте придерживаться общепринятой терминологии: в Excel не клетка, а ячейка.
 
А причём тут именованные диапазоны и СЧЁТЕСЛИ?  :|
There is no knowledge that is not power
 
The_Prist, спасибо. Только не совсем корректно считает. Имена у меня вида _1_, то есть два подчеркивания. И вот функция считает количество по первому листу в два раза больше чем есть, а по второму и следующих листах как надо. Можно это исправить? И можно ли, чтобы функция считала количество только в текущем листе? Спасибо заранее
 
Скажите, для кого я в своем сообщении расписывал как применять функцию и какие аргументы прописывать? Или читать сообщение было лень, пусть лучше лишний раз ткнут носом? С таким подходом желание помогать улетучивается очень быстро.
=Count_Names("_";1)

чтобы не задваивались имена с областью действия Книга и текущего листа:
Код
Function Count_Names(sPref As String, Optional bShOnly As Boolean = False)
    Dim objName As Name, sName As String, lCnt As Long
    If bShOnly Then
        For Each objName In Application.Caller.Parent.Names
            sName = objName.Name
            If InStr(sName, "!") Then sName = Mid(sName, InStr(sName, "!") + 1)
            If Left$(sName, Len(sPref)) = sPref Then
                lCnt = lCnt + 1
            End If
        Next objName
        'смотрим имена с областью действия Книга
    Else
        For Each objName In ActiveWorkbook.Names
            sName = objName.Name
            If InStr(sName, "!") Then sName = Mid(sName, InStr(sName, "!") + 1)
            If Left$(sName, Len(sPref)) = sPref Then
                lCnt = lCnt + 1
            End If
        Next objName
    End If
    Count_Names = lCnt
End F unction
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Для им. диапазонов:
Код
Function mNames()
    Dim n As Name
    Dim Count As long
    On Error Resume Next
    For Each n In ActiveSheet.Names
        Count = Count + Range(n.RefersTo).Cells.Count
    Next n
    mNames = Count
End F unction
Изменено: KuklP - 24.12.2012 13:39:11
Я сам - дурнее всякого примера! ...
 
The_Prist, простите, не совсем внимательно прочел пост. просто сижу которую ночь подряд над работай, всплыли проблемы с именованными ячейками, которые почему то начали пропадать в рабочем файле, вот и понадобилась их как то подсчитать, чтобы видеть, если имена исчезают, и попробовать вычислить,  из-за каких моих действий пропадают имена.
Если не затруднит, подскажите возможно ли и как сделать, чтобы это количество по вашей функции обновлялась сразу же, когда появляется новое имя или исчезает старое, а то сейчас изменяется только после перезапуска файла. F9 не помогает.
Спасибо за помощь.
 
Добавьте в начало функции: Application.Volatile
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо
KuklP, вашу функцию тоже вставил, для всех имен. спасибо. только почему то ваша функция запоминает число имен из первого листа как я перехожу на второй лист. и только после того как что то ввожу в ячейку, число обновляется. Но при этом возвращаясь снова на первый лист, число берется из второго. Можно с этим что то сделать?
Разобрался, можно просто =Count_Names("_") от The_Prist, вместо вашей функции.
Изменено: Сергей Позняк - 24.12.2012 16:47:43
 
The_Prist, если не затруднит, можно ли подправить ваш скрипт так, чтобы подсчет имен производился только при ручном запуске этой функции при нажатии кнопки или сочетании клавиш? Дело в том, что насчиталось у меня в книге 8130 имен, и это только где то 8-я часть от того, что будет. А из моего расчетного файла экселя обновляются большие трехмерные сборки в SolidWorks. А ваша функция в разы снизила производительность обновления - с двух минут ранее до 15 минут сейчас, даже при отсутствии Application.Volatile. Когда я добавлю все имена - мой комп ляжет. Спасибо в любом случае.
 
Сергей Позняк, Вам не кажется, что Ваши нюансы проявляются как-то....слишком постепенно и нелогично. То надо чтоб обновлялось всегда, то не надо...То, что Вы хотите делается отдельной процедрурой, а не функцией. Приведенная процедура запишет имена в активную на момент запуска ячейку. Префикс и возможность просмотра только на активном листе регулируются константами: Const sPref As String = "_", bShOnly As Boolean = False
Код
Sub Count_Names()
    Const sPref As String = "_", bShOnly As Boolean = False
    Dim objName As Name, sName As String, lCnt As Long
    If bShOnly Then
        For Each objName In Activesheet.Names
            sName = objName.Name
            If InStr(sName, "!") Then sName = Mid(sName, InStr(sName, "!") + 1)
            If Left$(sName, Len(sPref)) = sPref Then
                lCnt = lCnt + 1
            End If
        Next objName
        'смотрим имена с областью действия Книга
    Else
        For Each objName In ActiveWorkbook.Names
            sName = objName.Name
            If InStr(sName, "!") Then sName = Mid(sName, InStr(sName, "!") + 1)
            If Left$(sName, Len(sPref)) = sPref Then
                lCnt = lCnt + 1
            End If
        Next objName
    End If
    ActiveCell.Value = lCnt
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо. Только вот строка  ActiveCell.Value = lCnt - красная и при запуске выскакивает ошибка syntax error.
По поводу нюансов - если бы я знал, что так будет тормозить работа эксель и Solidworks в связке, естественно сразу бы сказал то, к чему в итоге пришел, в ходе эксперимента. Естественно удобнее когда обновление количества происходит мгновенно, но если при этом падает резко производительность другой составляющей работы, приходится чем то жертвовать.
 
Удалите этот квадратик :)
Изменено: sva - 25.12.2012 17:24:41
 
sva, какой квадратик? Вы имеете ввиду всю эту строку? Так без нее вообще ничего не происходит при запуске.
 
ActiveCell.Value = lCnt - должно быть без пробела. Это глюки форума. Просто перепишите эту строку в код без пробела.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо. работает. скорость работы возвращена ).
Страницы: 1
Наверх