我有一个每周评分电子表格,在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
我是社区的新手,所以如果还有什么我需要澄清的话,请告诉我。
非常感谢您提供的任何帮助。
答案 0 :(得分:0)
不知道你的其余代码是什么样的,并假设你需要帮助的部分是上面发布的内容:
试试这个让你的计数工作。
关于您的代码的一些注意事项:
示例:
Function mycountif(args1, arg2, arg3, arg4) As Long
示例:强>
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 =那么''
您可以访问答案 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