2015-05-12 3 views
1

Нужна формула для соответствия текста от одного столбца к тексту в другом листе и подсчета выделенных ячеек. Это похоже на выполнение sumif, но вместо того, чтобы возвращать числовое значение в статическом столбце, я верну счет подсвеченных ячеек.Формула Excel с VBA

Я успешно написал VBA для подсчета выделенных ячеек в данном столбце, но теперь должен выполнить совпадение имен. Значение, если имя в столбце А1: А50 соответствует имени в Sheet2 колонке J1: J52, а затем возвращают подсчет выделенных ячеек в колонке 2 листа X.

Формула для подсчета клеток подсвеченные: countbycolor('sheet2'!J4:J1847,A52)

VBA:

Function CountByColor(InputRange As Range, ColorRange As Range) As Long 
    Dim cl As Range, TmpCount As Long, ColorIndex As Integer 
    Application.Volatile 
    ColorIndex = ColorRange.Interior.ColorIndex 
    TmpCount = 0 
    On Error Resume Next 
    For Each cl In InputRange.Cells 
    If cl.Interior.ColorIndex = ColorIndex _ 
     Then TmpCount = TmpCount + 1 
    Next cl 
    CountByColor = TmpCount 
End Function 
+0

A1: A50 содержит 50 ячеек для проверки на J1: J52, который содержит 52 ячейки. Вы хотите посмотреть, содержится ли текст в A1 в любом месте J1: J52, или вы хотите проверить, соответствует ли текст A1 тексту J1? – shagans

+0

если есть, то возвратите счет. – ExcelQuestions

+0

смесь обоих, только потому, что я не мог придумать другой способ подсчета цветной ячейки, кроме использования VBA. Если есть способ сделать то, что мне нужно (имя совпадения и цветная ячейка), а не использовать VBA, я обязательно попробую. – ExcelQuestions

ответ

0

Добавление параметра для диапазона критериев и реализации Application.Countif должно быть достаточным.

Function CountByColorAndName(InputRange As Range, NameRange As Range, ColorRange As Range) As Long 
    Dim cl As Range, TmpCount As Long, ColorIndex As Integer 
    Application.Volatile 
    ColorIndex = ColorRange.Interior.ColorIndex 
    TmpCount = 0 
    On Error Resume Next 
    For Each cl In InputRange.Cells 
     If cl.Interior.ColorIndex = ColorIndex and _ 
      cbool(application.countif(NameRange , cl.value)) then _ 
      TmpCount = TmpCount + 1 
    Next cl 
    CountByColor = TmpCount 
End Function 

Пример синтаксиса:

=CountByColorAndName('sheet2'!J4:J1847, A1:A50, A52) 

Существует небольшая путаница, как ваше описание ситуации относится как к Sheet2 Колонка J1: J52 и 'sheet2' J4: J1847. Если это не подходит, уточните пожалуйста.

MATCH function на самом деле более эффективен, чем COUNTIF function, как на рабочем столе, так и внутри VBA. Это должно уменьшить нагрузку на вычисления.

For Each cl In InputRange.Cells 
     If cl.Interior.ColorIndex = ColorIndex then _ 
      if not iserror(application.match(cl.value, NameRange , 0)) then _ 
      TmpCount = TmpCount + 1 
    Next cl 
+0

Спасибо. Я попытаюсь выполнить оба решения. Вы были правы в том, чтобы поймать мою ошибку описания на колонке J; J4: J1847 является правильным. – ExcelQuestions

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