Функция COUNTIFS, работающая на нескольких листах - PullRequest
0 голосов
/ 26 апреля 2020

enter image description here

Как включить vlookup в мой текущий набор кода для подсчета всех результатов vlookup на всех похожих листах. Коды, которые у меня есть, будут пытаться выполнить подсчет на листах для одной указанной ячейки или всего диапазона данных в столбце или строке. Вместо этого я хотел бы, чтобы нижеописанная функция имела возможность подсчитывать количество результатов vlookup в столбце на листах с похожим именем.

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

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name Like "Sheet1*" Then
            myCountIfSheet1 = myCountIfSheet1 + WorksheetFunction.CountIf(ws.Range(rng.Address), criteria)
        End If
    Next ws
End Function



Public Function shifted_lookup(lookup_value As Variant, table_array As Range, column_index As Integer, range_lookup As Integer) As Variant
    Dim curr_wsname As String, oth_wsname As String
    Dim curr_ws As Worksheet, oth_ws As Worksheet
    Set curr_ws = ActiveSheet
    curr_wsname = curr_ws.Name
    oth_wsname = Right(curr_wsname, 3)
    Set oth_ws = Worksheets(oth_wsname)
    Dim src_rng_base As String, src_rng As Range
    src_rng_base = table_array.Address
    Set src_rng = oth_ws.Range(src_rng_base)
    Dim aux As Variant
    shifted_lookup = Application.WorksheetFunction.VLookup(lookup_value, src_rng, column_index, range_lookup)
End Function

1 Ответ

1 голос
/ 26 апреля 2020

Это должно сделать работу. Пожалуйста, попробуйте.

Function myCountIfSheet1(Rng As Range, _
                         Clm1 As Long, _
                         Crit1 As Variant, _
                         Clm2 As Long, _
                         Crit2 As Variant) As Long
    ' 011

    Dim Fun As Long                         ' function return value
    Dim Ws As Worksheet

    For Each Ws In ThisWorkbook.Worksheets
        With Ws
            If .Name Like "Sheet1*" Then
                Fun = Fun + WorksheetFunction.CountIfs( _
                            .Range(Rng.Columns(Clm1).Address), Crit1, _
                            .Range(Rng.Columns(Clm2).Address), Crit2)
            End If
        End With
    Next Ws

    myCountIfSheet1 = Fun
End Function

Для простоты вызова я структурировал вызов функции так, чтобы обеспечить только один диапазон адресов. В своих тестах я использовал A1: D30. Столбец (A) содержал один критерий, а столбец (D) - другой. Конечно, столбец (A) - это первый столбец - Столбцы (1) - диапазона, а столбец D - Столбцы (4) диапазона. Таким образом, следующий вызов функции будет искать «3» в столбце A и «красный» в столбце D.

Debug.Print myCountIfSheet1(Range("A1:D30"), 4, "red", 1, 3)

Последовательность критериев не имеет значения. Вы также можете добавить больше критериев, используя ту же структуру.

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