2014-02-20 3 views
6

Я пытаюсь «COUNT» указать номер определенного объекта в столбце I (в данном случае) на нескольких листах. Это значение в столбце I является результатом формулы (если это имеет значение). До сих пор у меня есть:Excel - Использование COUNTIF/COUNTIFS для нескольких листов/одного столбца

=COUNTIF('Page M904'!I:I,A13)+COUNTIF('Page M905'!I:I,A13)+COUNTIF('Page M906'!I:I,A13)

, который работает, но я буду иметь 20 страниц что-то для сканирования с помощью. Я хотел бы избежать использования формулы длинной страницы.

Я попытался

=COUNTIFS('Page M904:Page M906'!I:I,A13) и =COUNTIF('Page M904:Page M906'!I:I,A13)

но приводит к #VALUE.

И я думаю, что

=COUNTIFS('Page M904'!I:I,A14,'Page M905'!I:I,A14,'Page M906'!I:I,A14)

является растрата из COUNTIFS, потому что я получаю 0 когда оно должно быть 35.

Я пытаюсь избегать использования VBA для этого приложения. Но если это так, то это должно быть :) Спасибо заранее за ваше время и помощь.

+2

' 'Page M904: Страница M906' Я: I' - хорошая попытка, но к сожалению,' Countif' не поддерживает ссылки 3-D .. –

+1

'Я пытаюсь избегать использования VBA. Но если это так, то это должно быть:) '- для этого вы могли бы написать довольно простую пользовательскую функцию. –

+1

'= COUNTIFS ('Страница M904'! I: I, A14, 'Страница M905'! I: I, A14, 'Страница M906'! I: I, A14)' возвращает 0, потому что в этой фразе она становится 'IF. ..AND', а не 'IF ... OR', как вы этого хотите. – nutsch

ответ

4

Я стараюсь избегать использования VBA. Но если должно быть, то он должен быть :)

Существует довольно простой UDF для вас:

Function myCountIf(rng As Range, criteria) As Long 
    Dim ws As Worksheet 

    For Each ws In ThisWorkbook.Worksheets 
     myCountIf = myCountIf + WorksheetFunction.CountIf(ws.Range(rng.Address), criteria) 
    Next ws 
End Function 

и назвать его так: =myCountIf(I:I,A13)


PS если вы хотите, чтобы исключить некоторые листы, вы можете добавить If заявления:

Function myCountIf(rng As Range, criteria) As Long 
    Dim ws As Worksheet 

    For Each ws In ThisWorkbook.Worksheets 
     If ws.name <> "Sheet1" And ws.name <> "Sheet2" Then 
      myCountIf = myCountIf + WorksheetFunction.CountIf(ws.Range(rng.Address), criteria) 
     End If 
    Next ws 
End Function 

UPD:

У меня есть четыре «ссылка» листов, которые мне нужно исключить из сканирования/искал , В настоящее время они последние четыре в книге

Function myCountIf(rng As Range, criteria) As Long 
    Dim i As Integer 

    For i = 1 To ThisWorkbook.Worksheets.Count - 4 
     myCountIf = myCountIf + WorksheetFunction.CountIf(ThisWorkbook.Worksheets(i).Range(rng.Address), criteria) 
    Next i 
End Function 
+0

У меня есть четыре «справочных» листа, которые мне нужно исключить из проверки/поиска. В настоящее время они являются последними четырьмя в книге и остаются в этом месте. Можно ли изменить этот код, чтобы исключить эти четыре листа? –

+0

уверен, см. Мою часть обновления –

+0

глупый вопрос ... как я могу заставить UDF работать. Я получаю ошибку '#NAME? '. Макросы включены. –

11

Это может быть решена без VBA по следующей методике.

В этом примере я подсчет всех троек (3) в диапазоне A:A листов Page M904, Page M905 и Page M906.

Список всех имен листов в одном непрерывном диапазоне, как показано в следующем примере. Здесь перечислены в диапазоне D3:D5.

enter image description here

Затем, имея значение подстановки в ячейке B2, результат может быть найден в ячейке B4, используя следующую формулу:

=SUMPRODUCT(COUNTIF(INDIRECT("'"&D3:D5&"'!A:A"), B2)) 
+0

Спасибо Søren, но я собираюсь использовать метод VBA/UDF. Я не знал о UDF, но теперь я это делаю, и это кажется более простым. Я определенно ценю помощь. : D –

+1

Нет проблем :) Это тоже очень хорошее решение. –

2

Мой первый пост ... UDF мне удалось быстро скомпилировать. Использование: Выбор 3D диапазоне, как нормальный и заключить это в кавычки, как показано ниже ...

= CountIf3D (" 'StartSheet: EndSheet' G16: G878!", "Критерии")

благоразумно листы быть рядом, чтобы избежать непредвиденных результатов.

Public Function CountIf3D(SheetstoCount As String, CriteriaToUse As Variant) 

    Dim sStarSheet As String, sEndSheet As String, sAddress As String 
    Dim lColonPos As Long, lExclaPos As Long, cnt As Long 

    lColonPos = InStr(SheetstoCount, ":") 'Finding ':' separating sheets 
    lExclaPos = InStr(SheetstoCount, "!") 'Finding '!' separating address from the sheets 

    sStarSheet = Mid(SheetstoCount, 2, lColonPos - 2) 'Getting first sheet's name 
    sEndSheet = Mid(SheetstoCount, lColonPos + 1, lExclaPos - lColonPos - 2) 'Getting last sheet's name 

    sAddress = Mid(SheetstoCount, lExclaPos + 1, Len(SheetstoCount) - lExclaPos) 'Getting address 

     cnt = 0 
    For i = Sheets(sStarSheet).Index To Sheets(sEndSheet).Index 
     cnt = cnt + Application.CountIf(Sheets(i).Range(sAddress), CriteriaToUse) 
    Next 

    CountIf3D = cnt 

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