【问题标题】:Countif across multiple sheets with criteria/parameters使用标准/参数跨多个工作表进行计数
【发布时间】:2015-03-03 07:49:24
【问题描述】:

我有一个每周评分电子表格,在 b、e、h、k 和 n 列中有 5 个不同的类别,我每周在其中创建原始表格的新副本,并为该周输入“是”或“否”。我想在汇总表上编译所有这些成绩,以便表 1 计算每个相应列中表“sheet2”到“last”中“y”的数量。然后我可以除以该范围内的工作表数量,以获得在每列 b、e 等中输入的 y 的百分比。我对创建函数和使用 vba 非常陌生,所以我真的很挣扎。

最棘手的部分是我希望函数能够接受以下参数/参数:从哪张纸开始计数,从哪张纸停止计数,要计数的内容(在本例中为 y,但可以更改我的下一个工作簿,或者如果我添加一个新类别),要从哪个单元格开始计数,因为我想在每张纸上计算一个单元格,以便 b7 是工作表范围内仅 b7 的汇编。

这是我微弱的尝试:

Function mycountif(start As Variant, last As Variant, Cell As Variant, criteria As Variant) 'define name and parameters

Dim count As Integer

count = 0

For Each Worksheet In Worksheet.range(start, last)
count = count + Application.WorksheetFunction.CountIf(range(Cell), criteria)

Next Worksheet

mycountif = count

End Function

我是社区的新手,如果还有什么需要澄清的,请告诉我。

非常感谢您提供的任何帮助。

【问题讨论】:

  • 你能贴一张示例表的截图吗?

标签: excel vba countif


【解决方案1】:

不知道你的代码的其余部分是什么样的,并假设你需要帮助的部分是上面发布的:

试试这个,让你的 ws 计数正常工作。

关于您的代码的几点说明:

  • 您有一个函数,但它没有设置为返回任何内容。您需要在参数之后说明它返回的内容。

示例:

Function mycountif(args1, arg2, arg3, arg4) As Long  
  • Lo​​ng 类型比整数更适合计数。
  • 要遍历工作表,您需要将正在使用的变量 ws 声明为 Worksheet,然后遍历 Worksheet,并使用 IF 语句有选择地使用它们,而不是仅遍历满足标准,循环所有然后测试每个。
  • 我必须假设您将有效变量传递给它,并且知道您为什么以及如何使用它们。

示例:

Function mycountif(start As Variant, last As Variant, Cell As Variant, criteria As Variant) As Long

'define name and parameters
Dim ws As Worksheet
Dim count As Long

    count = 0

    For Each ws In Worksheets
        If ws.Index >= start And ws.Index <= last Then
            count = count + Application.WorksheetFunction.CountIf(Range(Cell), criteria)
        End If
    Next ws

    mycountif = count

End Function

您还可以测试工作表名称。例如,如果您有 sheet1、sheet2、sheet3。

'Convert the result of extracting the right character from the ws.Name into sheetNum As Long.
    sheetNum = CLng(Right(ws.name, 1))
'Then test the sheetNum

另一种选择是为您要使用的每个工作表添加一个标签,然后测试该标签。 '如果 ws.Tag = 某事然后'

Here is a link to all the available Worksheet Properties你可以访问。

【讨论】:

    【解决方案2】:

    您与for each 很接近,但不幸的是,您不能这样循环。
    通过循环浏览所有工作表,并在工作表之间打开(然后关闭)计数,您可以决定要计算哪些工作表。
    我们还需要对计数中包含的工作表进行计数,以便之后获得平均值。

    这是我想出的:

    Option Explicit
    
    Function MultiCountIf(criteria, CommonRange As String, StartSheet As String, EndSheet As String) As Variant
    Dim LoopVar As Long
    Dim Tot As Long
    Dim CountThis As Boolean
    Dim NumSheets As Long
    
    Tot = 0
    CountThis = False
    NumSheets = 0
    
    For LoopVar = 0 To Sheets.Count
        If Sheets(LoopVar).Name = StartSheet Then CountThis = Not CountThis
        If CountThis Then
            NumSheets = NumSheets + 1
            Tot = Tot + WorksheetFunction.CountIf(Sheets(LoopVar).Range(CommonRange), criteria)
        End If
        If Sheets(LoopVar).Name = EndSheet Then CountThis = Not CountThis
    Next LoopVar
    
    If NumSheets = 0 Then
        MultiCountIf = CVErr(xlErrDiv0)
    Else
        MultiCountIf = Tot / NumSheets
    End If
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2013-04-02
      相关资源
      最近更新 更多