使用for循环在Excel中创建运行总计

时间:2019-02-20 02:36:54

标签: excel vba

我正在尝试编写代码来计算数据库中一起出现某个日期和一个特定字符串的实例的数量。我编写了以下For Loop。但是,“ JanHousekeeping”的输出返回值为15。

我正在使用的示例数据集如下。

enter image description here

我有3个“客房整理和其他危险”实例,但是循环返回的值为15。为什么这样做,又该如何解决呢?预先感谢您的帮助!

aws s3 cp "s3://my-bucket/testaws/data/E:\Home\temp\test-1_20180101.csv" test.csv

2 个答案:

答案 0 :(得分:1)

尽管我会选择数据透视表解决方案,但我认为这是您的意思,因为数据透视表本质上是动态的,从长远来看是好的。


  1. 您的问题暗示单行需要满足条件,但是您的循环正在将您的首次约会与其他所有行进行比较。我相信您只想一致地增加行数。最简单的方法是使用一个计数器(i)遍历行。
  2. 如果Housekeeping and Other Hazards是所有输入都必须满足的测试,则只需在循环外部进行测试。
  3. 如果正确声明了变量,则变量将默认为0,更重要的是,您将拥有更明确的代码
  4. Select Case在这里可以很好地工作,尽管数组解决方案会更好,而且可以将其压缩为循环更短的代码

Sub Test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Jan")
Dim i As Long

Dim Jan As Long, Feb As Long, Mar As Long, Apr As Long, May As Long, Jun As Long, _
    Jul As Long, Aug As Long, Sep As Long, Oct As Long, Nov As Long, Dec As Long

For i = 5 To 20
    If ws.Range("I" & i) = "Housekeeping and Other Hazards" Then
        Select Case Month(ws.Range("D" & i))
            Case 1
                Jan = Jan + 1
            Case 2
                Feb = Feb + 1
            Case 3
                Mar = Mar + 1
            Case 4
                Apr = Apr + 1
            Case 5
                May = May + 1
            Case 6
                Jun = Jun + 1
            Case 7
                Jul = Jul + 1
            Case 8
                Aug = Aug + 1
            Case 9
                Sep = Sep + 1
            Case 10
                Oct = Oct + 1
            Case 11
                Nov = Nov + 1
            Case 12
                Dec = Dec + 1
        End Select
    End If
Next i

End Sub

数据透视表解决方案如下图所示。如果交换行字段,甚至可以按类型进行过滤(当前视图允许您按日期进行过滤)。您可以使用GETPIVOTDATA来将单元格设置为等于数据透视表的某些条件,就像宏要在最后执行的操作一样

enter image description here

答案 1 :(得分:0)

您正在遍历 j ,但是使用 i 将日期检索到 DateCheckLoop 中。

您没有提供 i 的指示,因此无法确定Worksheets("Jan").Cells(i, 4)处的值。我可以提供1到31之间的月份为1。

由于永不更改 i ,因此每个循环都会重复一次。