VBA:循环遍历行,如果满足条件,则总结某些行

在学习VBA的过程中,我已经使用了几个星期的论坛。 但现在我被卡住了,需要帮助。 所以这是我的问题:

我有一个工作簿,其中有几个工作表。 为了简单起见,我们假设我有两个工作表。 一个有很多的原始数据资料和一个很好的格式,将成为接收表。

原始数据表如下所示:我有8列,我需要检查每行(列B和E)中的两个条件,并将列H中的值相加。列B包含不同的名称,列E包含工作状态,例如准备好或说话。 我确实有大约3.000行和一组大约20个不同的地名。 所以总的来说,我们假设名字为“Smith”的100行和状态“talking”的顺序不是特别的。 我现在需要总结所有的名字“史密斯”和状态“谈话”的行中的所有数字(列H)。之后,我想要有名字(B列),状态(列E)和总和(列H),写入同一工作簿的单元格中的dynamic范围,从I3:K3开始。 我不得不承认,在这个黑暗中,我总是很沉默。我真的希望你们能够帮我一些代码和/或指向正确的方向。 最重要的是,我希望你也可以解释你的代码的function,所以我可以正确地理解它并学习。 在此先感谢你们!

这是我的代码到目前为止:

Private Sub SumNumbers() Dim tbl As Worksheet Dim x As Integer Dim lrow As Long Dim lastname As String Dim astatus As String Dim number As Integer Dim counter As Integer Set wb = ThisWorkbook Set tbl = wb.Sheets("Sheet1") lrow = tbl.Cells(Rows.Count, "B").End(xlUp).Row lastname = tbl.Cells("C2:C" & lrow).Text astatus = tbl.Cells("E2:E" & lrow).Text number = tbl.Cells("H2:H" & lrow) For x = 2 To lrow If lastname = "Smith" And astatus = "Talking" Then counter = counter + number End If Next x End Sub 

你很接近,但是你需要在你的循环中单独testing每个单元。 像这样的东西:

 Sub Macro1() Dim tbl As Worksheet Dim x As Integer Dim lrow As Long Dim lastname As String Dim astatus As String Dim number As Integer Dim counter As Integer: counter = 3 Set wb = ThisWorkbook Set tbl = wb.Sheets("Sheet1") lrow = tbl.Cells(Rows.Count, "B").End(xlUp).Row For x = 2 To lrow If tbl.Range("C" & x) = "Smith" And tbl.Range("E" & x) = "Talking" Then Range("I" & counter).Value = Range("C" & x) Range("J" & counter).Value = Range("E" & x) Range("K" & counter).Value = Range("H" & x) counter = counter + 1 End If Next x End Sub 

通过@Tim评论,您可以使用SumIfs返回符合多个条件的“H”列的总数,如下所示:

 =SUMIFS(H:H,C:C,"=Smith",E:E,"=Talking") 

到目前为止,我find了一个能够为我工作的方法,但是这看起来相当麻烦,因为我必须手动为每个案例执行此操作。 所以现在我正在寻找一个更简单,更优雅的方式来做到这一点。 如果你能给我提供一些代码或者指引我正确的方向,我将非常感激。

这是我的代码到目前为止:

 For Each cell In Range("H2:H" & lrow) cell.Offset(0, 1).Value = cell.Value + cell.Offset(-1, 1).Value If cell.Offset(0, -6).Value = "Smith" And cell.Offset(0, -3).Value = "Talking" Then cell.Offset(0, 2).Value = cell.Value End If If cell.Offset(0, -6).Value = "Smith" And cell.Offset(0, -3).Value = "Ready" Then cell.Offset(0, 3).Value = cell.Value End If If cell.Offset(0, -6).Value = "Smith" And cell.Offset(0, -3).Value = "Not Ready" Then cell.Offset(0, 4).Value = cell.Value End If Next 

如前所述,这是一个解决方法,我想不得不简化。 它查找条件“Smith”和状态“Talking”,“Ready”和“Not Ready”,并将H列的值放入列的各个单元格中,以便在后面的过程中进行求和。 那么,有没有办法让这个更优雅呢?

当然,波特兰亚军! 我的逻辑很简单。 我有一些logging的活动,每个名称都有一定的状态。 例如“Smith”(B栏)和“Talking”(C栏)和一个数字(H栏)。 对于条件名称和状态相同的每一行,我需要总结H列中的数字。 比方说,我有10K行。 他们中有2k的名字叫“史密斯”。 但其中只有500人有“史密斯”的名字和“谈话”状态。 所以我需要找出一个简单的方法来总结这些数字。 也有行的名字是“史密斯”,但状态是“准备好”。 这里的困难在于,这些行基本上是随机的。

所以桌子看起来像这样:

 Row Name Status Number 2 Smith Talking 105 3 Smith Talking 67 4 Smith Ready 75 5 Smith Talking 94 6 Jones Ready 89 7 Jones Talking 224 8 Jones Not Ready 75 9 Jones Talking 99 

因此,在这种情况下,行号1将被阻止用于标题,并且数据将从行号2开始。对于“史密斯”和“谈话”,代码将需要总结第2,3和5行的条数,史密斯“和”谈话“。 第4行“史密斯”和“准备”。 第7和第9行为“琼斯”和“说话”等。

我可以做的是创build一个新的工作表,并将列A中的所有名称的列表和列B中的所有状态列出并参考它。 这将节省我在代码中使用确切的名称和状态的麻烦,但不会解决我的问题。

A.获取所有唯一的名称并放置在一个新的列中:这将是您的数组用于search每一行。

B.为Status设置另一个数组,因为你知道状态是什么。

C.为Name Array设置外部循环
对于数组中的每个项目

D.嵌套循环查看每一行并search每个状态

C.状态匹配时,另一个嵌套循环添加时间和地点在一个新的名为总时间。