【问题标题】:COUNTIFS function working across multiple sheetsCOUNTIFS 函数跨多个工作表工作
【发布时间】:2020-04-26 10:46:49
【问题描述】:

如何在我当前的代码集中包含一个 vlookup,以对所有类似工作表中的所有 vlookup 结果进行计数。我所拥有的代码将尝试对列或行中的一个指定单元格整个数据范围跨工作表执行countif。相反,我希望下面的函数能够计算跨相似名称工作表的列中的 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

【问题讨论】:

  • 不清楚。 VLookup 返回一个单元格值。 CountIf 返回一个计数。函数返回一个值。您希望该值是多少?
  • 嘿@Variatus,我实际上希望当前的代码集能够计算类似工作表中的vlookup结果的数量;希望它不会让您感到困惑。因此,例如(根据屏幕截图),如果我想找出 C 列中 3 重复了多少 Orange,该函数应该能够告诉我有 3;并汇总所有相似的工作表名称。

标签: excel vba vlookup countif


【解决方案1】:

这应该可以完成工作。请尝试一下。

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)。因此,以下函数调用将在 A 列中查找“3”,在 D 列中查找“red”。

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

标准的顺序无关紧要。您还可以使用相同的结构添加更多条件。

【讨论】:

  • 嘿@variatus!感谢您的快速回复。使用您的代码,我能够计算所有相似名称表中 orange 的数量!但是,我希望它能够仅计算 A 列中的 3orange。截图是一个不好的例子,应该更清楚。让我更新屏幕截图和另一组代码,我有一段时间用于 vlookup;看看它是否有帮助。非常感谢!
  • 伟大的变种人!它有效:) 非常感谢!我要继续下去,把这个勾掉。真的帮了大忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多