Функция Excel vba с динамическим столбцом таблицы в качестве параметра - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь сделать Excel, который подсчитывает количество раз, когда определенная буква появляется в столбце таблицы.

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

Пример, подсчитать количество «сдвигов» в «столбце» (:

Function sumColumnShifts(column As Integer, shift As range) As Integer
    sumColumnShifts = sumDayShifts(ActiveSheet.ListObjects("foo").ListColumns(column).range.Select, shift)
End Function

Public Function sumDayShifts(ByVal Target As range, shift As range) As Variant
    Dim res As Integer
    res = 0
    For Each cell In Target    
        If shift.cells(1, 1).Value = cell.Value Then
            res = res + 1
        End If
    Next
    sumDayShifts = res
End Function

Проблема в том, что функция не может найти таблицу, но таблица существует. Что я делаю не так? Это ActiveSheet.ListObjects ("foo"). ListColumns(колонка) .range.Select ? Это не диапазон? Я не могу получить к нему доступ в функции?

Спасибо.

1 Ответ

0 голосов
/ 10 ноября 2018

Разве вы не можете просто использовать

=COUNTIF(foo[[#All],[Column1]],"A")

В противном случае,

Я бы передавал имя ListObject и заголовок столбца для поиска вместе со значением поиска и использовал функцию Countif в функции для возврата счетчика. Вы также можете изменить функцию, чтобы передать лист в качестве аргумента функции, чтобы сделать его более гибким.

Option Explicit   
Public Sub Test()

    Const SEARCH_HEADER As String = "Column1"
    Const SEARCH_VALUE As String = "A"
    Const TABLE_NAME As String = "foo"

    Debug.Print GetCount("foo", SEARCH_HEADER, SEARCH_VALUE)
End Sub

Public Function GetCount(ByVal tableName As String, ByVal searchHeader As String, ByVal searchValue As String) As Variant
    Dim ws As Worksheet, table As ListObject
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    On Error Resume Next
    Set table = ws.ListObjects("foo")
    On Error GoTo 0
    If table Is Nothing Or IsError(Application.Match(table.HeaderRowRange, searchHeader, 0)) Then
        GetCount = CVErr(xlErrNA)
        Exit Function
    End If

    GetCount = Application.WorksheetFunction.CountIf(table.ListColumns(searchHeader).DataBodyRange, searchValue)
End Function

Данные:

image

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