2013-10-30 37 views
1

我在学习VBA的过程中已经使用了几个星期的论坛。但现在我陷入困境并需要帮助。所以这里是我的问题:VBA:循环遍历行,如果条件符合,则总结某些行

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

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

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

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 
+2

如果你不需要VBA –

回答

2

你靠近,但你需要单独测试循环中的每个细胞。事情是这样的:

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") 
+0

+1,那么你可以使用'SUMIFS()'来解决这个问题 – tigeravatar

+0

感谢你的回答!不幸的是它不起作用。我明白你的代码应该做什么,在发布我的问题之前,我有点像相同的代码。 我认为我需要澄清我的问题。 “史密斯”和“谈话”的例子只是一个例子。然而,我确实有一个列表,其中有大约20个不同的名字和5种不同的状态可以组合。我正在寻找的是一个解决方案,其中20个名称中的每一个都与5个状态中的每一个相匹配,并且如果可能的话,我不必键入所有这些情况。因为那意味着100个案例。 – DEFCON123

0

我发现了一个方式,目前为止我已经完成了这项工作,但这看起来很麻烦,因为我必须手动为每个案例做好准备。所以现在我正在寻找一个更简单更优雅的方式来做到这一点。如果你能给我提供一些代码或者让我指向正确的方向,我会非常感激。

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

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列的值放入列的相应单元格中,以便在后面的过程中进行求和。那么,有什么办法可以让它更优雅吗?

+0

使用不同名称时会发生什么变化?即如果姓氏是“琼斯”,你的逻辑有什么不同?你能复制上面的代码的第二个条件,所以我可以看到变化?谢谢 –

0

当然是波特兰亚军!我的逻辑很简单。我已经列出了每个具有特定状态名称的记录活动。例如“Smith”(B栏)和“Talking”(C栏)和一个数字(H栏)。我需要在条件名称和状态相等的每一行中总结H列中的数字。假设我有10k行。他们中有2k的名字叫“史密斯”。但其中只有500人有“史密斯”的名字和“谈话”状态。所以我需要找出一个简单的方法来总结这些数字。还有一些行的名字是“Smith”,但状态是“Ready”。这里的困难在于,这些线基本上是随机排列的。

所以该表是这样的:

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.开始对“史密斯”和“潜夫论”该代码需要将条件“Smith”和“Talking”的行数2,3和5相加。第4行为“史密斯”和“准备好”。第7和第9行为“琼斯”和“谈话”等。

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

+0

有人能帮忙吗? – DEFCON123

0

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

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

C.设立名称阵列
外环对于每个项目在阵列

D.嵌套循环看每一行和每一状态

C.搜索当状态然后另一个嵌套循环匹配将时间和地点添加到称为总时间的新列中。