以动态表列为参数的 Excel vba 函数

恩利欧

我正在尝试做一个 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(column).range.Select吗?这不是一个范围?我无法在函数中访问它?

谢谢。

哈尔

你不能只用

=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

数据:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章