如何解决Count 和 CountIf 混淆 VBA
我有一个 for 循环,它遍历工作簿中的每个工作表。对于大多数用途,每张纸都是相同的。我正在我的工作簿中制作一个概览表,以表达其他工作表(相同的工作表)中数据的结果。
有 11 辆车,每辆车都有自己的工作表,其中包含每天的测试数据。在任何一天都可以没有测试,或者一直到 30,000 次测试。第 47 行中每列的标题以“06/01/2021 ... 06/30/2021”格式说明日期。每次测试迭代的数据将粘贴在正确日期的列中,从第 49 行开始。
所以我的概览页面需要显示的是前一天的数据。在我的概览中的一个单元格中,有一个公式可以获取一个月中的第几天,例如 20 或 1 等。使用这个数字,天数与前一天数据的列索引相同在方便。因此,在我的 for 循环中,我想要一个表,其中包含 B 列中每个工作表的名称,CI 列中要显示当天完成的测试总数(不是所有数据的总和),DI 列中需要结果为 0 的测试次数,EI 列需要结果高于公差上限的测试次数,FI 列需要结果低于公差下限的测试次数减去列中的结果D.
我一直在使用 Application.WorksheetFunction.Count 和 CountIf 函数,但我一直为每个单元格获取 0。我为上下公差值制作了两个数组,它们分别是 Longs 类型,分别称为 UTol 和 LTol。 TabList 是一个公共数组,其中包含以字符串形式存储的车辆的每个工作表名称。 finddate 是一个整数,它读取今天的天数,即昨天的列索引。我已经包含了一张有问题的表格的图片和我的 for 循环代码:
finddate = Worksheets("Overview").Range("A18").Value
For TabNRow = 1 To 11
startcol = 3
Worksheets(TabList(TabNRow)).Activate
Debug.Print (TabList(TabNRow))
'Total number of tests done that day
Worksheets("Overview").Cells(startrow,startcol).Value = Application.WorksheetFunction.Count(Range(Cells(49,finddate),Cells(30000,finddate)))
startcol = 4
'Total number of 0 results,this used to get the number of 0's from each sheet but that row has since been deleted
Worksheets("Overview").Cells(startrow,startcol).Value = Worksheets(TabList(TabNRow)).Cells(48,finddate).Value
startcol = 5
'Total number of results above tolerance
Worksheets("Overview").Cells(startrow,startcol).Value = Application.WorksheetFunction.CountIf(Range(Cells(49,finddate)),">" & UTol(TabNRow))
startcol = 6
'Total number of results below tolerance
Worksheets("Overview").Cells(startrow,"<" & LTol(TabNRow))
startrow = startrow + 1
Next TabNRow
```
解决方法
在引用工作表时无需选择/激活工作表。请参阅:How to avoid using Select in Excel VBA
这样的事情应该可以工作:
Dim wsOv As Worksheet,wsData As Worksheet,rngData As Range
Set wsOv = ThisWorkbook.Worksheets("Overview")
finddate = wsOv.Range("A18").Value
For TabNRow = 1 To 11
Set wsData = ThisWorkbook.Worksheets(TabList(TabNRow))
Set rngData = wsData.Range(wsData.Cells(49,finddate),_
wsData.Cells(Rows.Count,finddate).End(xlUp))
Debug.Print wsData.Name,rngData.Address 'edited
With wsOv.Rows(2 + TabNRow)
.Columns("C").Value = Application.Count(rngData)
.Columns("D").Value = Application.CountIf(rngData,0)
.Columns("E").Value = Application.CountIf(rngData,">" & UTol(TabNRow))
.Columns("F").Value = Application.CountIf(rngData,"<" & LTol(TabNRow)) _
- .Columns("D").Value
End With
Next TabNRow
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。