微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Count 和 CountIf 混淆 VBA

如何解决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 循环代码

Table In Question

    
    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 举报,一经查实,本站将立刻删除。