Страницы: 1
RSS
Счет по формату ячейки
 
Добрый день.

Уважаемые форумчане, никак не могу додуматься, почему не правильно работает функция подсчета по формату ячейки.
Пример в приложении, там же описание ошибки функции.
Суть в том, что функция подсчета по формату почему-то ставит значение равное "1", даже если ячеек с нужным форматом в диапазоне нет.

P.S. Код честно стырен с этого форума сто лет назад, исходный топик найти уже не могу. =)
 
Код
СЧЕТВЫХ(B1:L1;B5)
возвращает #ЗНАЧ!
Код
СЧЁТЗ(СЧЕТВЫХ(B1:L1;B5)) = СЧЁТЗ(#ЗНАЧ!)
возвращает 1
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
исправил только для искомой ячейки
 
доработала UDF - см. код СчётФормат() - перешла от объекта Range к счёту переменной типа Integer
то, что закомментировала по коду - давало вам 1, пробегая по ячейкам от 1-й до конца заданного диапазона... ячейки №0 не бывает в природе... поэтому перешла на чистый счёт, внеся изменения в макрос
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
поэтому перешла на чистый счёт, внеся изменения в макрос
Великолепно! Это то, что надо. Спасибо Вам огромное!
Теперь осталось самому разобраться в Вашем коде и понять как это работает =)  
 
Цитата
Сергей Беляев написал: исправил только для искомой ячейки
Формульный вариант тоже работает. Спасибо!
Для меня это проще в понимании, чем код VBA, т.к. я больше "формулист".
Принял ваш вариант на вооружение.
 
JeyCi,
В попытке разобраться с вашим кодом, обнаружил, что функция считает и пустые ячейки, в которых нет значений, но уже проставлено форматирование по образцу

Пример прикладываю.
Я увидел, что если заменить в строке "c.Interior.ColorIndex <> rTemplate.Interior.ColorIndex"  неравенство на "=", то она перестает считать пустые ячейки, но возникают другие ошибки подсчета. Пока не могу сообразить, что и как надо прописать, чтобы исключить из подсчета пустые ячейки из диапазона. Подскажете?

Хочу понять смысл каждой строки в коде, но пока разобрался только с первой половиной кода.
 
Код
Option Explicit
Public Function СчётФормат(Target As Range, rTemplate As Range, _
Optional IsFontColor As Boolean = True, _
Optional IsColor As Boolean = True, _
Optional IsFontStyle As Boolean = True, _
Optional IsFontName As Boolean = True) As Integer
  Dim c As Range
  Application.Volatile True
  If rTemplate.Count > 1 Then Exit Function
  СчётФормат = 0
  For Each c In Target
    If IsFontColor And (c.Font.Color <> rTemplate.Font.Color) Then GoTo nextC
    If IsColor And (c.Interior.ColorIndex <> rTemplate.Interior.ColorIndex) Then GoTo nextC
    If IsFontStyle And (c.Font.FontStyle <> rTemplate.Font.FontStyle) Then GoTo nextC
    If IsFontName And (c.Font.Name <> rTemplate.Font.Name) Then GoTo nextC
    If IsEmpty(c) Then GoTo nextC   'ЕСЛИ ПУСТАЯ, ТО НЕ СЧИТАТЬ (переход сразу к строке nextC)
    СчётФормат = СчётФормат + 1
nextC:
  Next  СчётФормат = СчётФормат
End Function
- добавлена строка 16 по коду - чтобы не считать пустые ячейки
Изменено: JeyCi - 27.07.2016 13:17:27
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Андрей Прокофьев написал: неравенство на "=",
не равно - означает если нет цвета, нет заданного стиля шрифта, нет указанного в шаблоне шрифта - то переход по циклу с отметки nextC... если это всё есть, то код исполняется последовательно с учётом строки СчётФормат = СчётФормат + 1 - т.е. считает данную яч
Изменено: JeyCi - 27.07.2016 13:16:05
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: то переход по циклу с отметки nextC
во жеж =) как все просто. Спасибо вам огромное за науку.
 
Еще раз подниму тему.
Есть проблемка с функцией, обнаружилась в процессе работы.

Крайне странная проблема.

В приложении пример.
Что необходимо сделать, чтобы увидеть ошибку.
1. Выделяем красную ячейку I11 и копируем ее.
2. выделяем диапазон I12:K14
3. Правой кнопкой мыши щелкаем по диапазону
4. Выбираем варианты вставки во всплывающем окне, но НЕ НАЖИМАЕМ на них, а просто "перещелкиваем" и смотрим пример результата вставки. Через 5-6 таких "перещелкиваний" формулы в ячейках B8:B11 принимают вид #Н/Д.

Исправить это возможно ТОЛЬКО обновлением этих формул в КАЖДОЙ ячейке, т.е. два раза щелкнуть мышкой, нажать Enter. Никаким другим способом у меня не получилось заставить пересчитаться их, даже сохранение файла, закрытие и его открытие не помогают.

Что это может быть? Крайне мешает в работе, т.к. в рабочем файле у меня более 500 ячеек с функцией "СчётФормат" и все их обновлять по Enter безумие.
Изменено: Андрей Прокофьев - 29.07.2016 11:38:41
 
Андрей Прокофьев, ctrl+alt+F9 пробовали?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:  ctrl+alt+F9 пробовали?
нет.
Помогло, спасибо! Как я понимаю, это аналог Application.CalculateFull?

Это все-таки лечение симптома, но не лечение причины. Может быть кто-то знает, как от этого избавиться в корне?
Изменено: Андрей Прокофьев - 29.07.2016 21:15:37
 
Андрей Прокофьев, почитайте справку про метод Volatile.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Андрей Прокофьев написал: Что это может быть?
обсуждалось в ветке - Как суммировать значения во всех незакрашенных (белых) ячейках?
полагаю, поможет (Shift)+F9
Цитата
Forve написал: Только после изменения заливки нажимайте Shift + F9 что бы обновить результат
Изменено: JeyCi - 06.08.2016 18:12:42
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх