使用标准/参数在多个工作表上进行Countif

时间:2015-01-05 18:02:54

标签: excel vba countif

我有一个每周评分电子表格,在b,e,h,k和&列中有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

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

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

2 个答案:

答案 0 :(得分:0)

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

试试这个让你的计数工作。

关于您的代码的一些注意事项:

  • 你有一个功能,但它没有设置为返回任何东西。你需要说明它在参数后返回的内容。

示例:

Function mycountif(args1, arg2, arg3, arg4) As Long  
  • Long Type对于count而不是整数更好。
  • 要遍历工作表,您需要声明您正在使用的变量,ws,作为工作表,然后遍历工作表,并使用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

答案 1 :(得分:0)

你离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