1

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

我有一个工作簿,里面有几个工作表。为简单起见,我们假设我有两个工作表。一份包含大量原始数据材料,一份格式精美,将成为接收表。

原始数据表如下所示:我有 8 列,我需要检查每行(B 列和 E 列)中的两个条件并将 H 列中的值相加。B 列包含不同的名称,E 列包含工作状态,例如准备好或说话。我确实有大约 3.000 行和一组大约 20 个具有不同状态的不同名称。所以总的来说,我有 100 行,名称为“Smith”,状态为“talking”,没有特定的顺序。我现在需要总结每一行中的所有数字(H 列),其中包含名称“Smith”和状态“谈话”。之后,我想要名称(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
4

4 回答 4

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")
于 2013-10-30T20:21:35.620 回答
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 Column 的值放入正确的列的相应单元格中,以便在以后的过程中求和。那么,有什么办法可以让它更优雅呢?

于 2013-11-01T11:36:53.383 回答
0

当然是波特兰赛跑者!我的逻辑很简单。我已经为每个具有特定状态的名称记录了活动列表。例如“Smith”(B 栏)和“Talking”(C 栏)和一个数字(H 栏)。我需要为条件名称和状态相等的每一行总结 H 列中的数字。假设我有 10k 行。其中 2k 的名称为“Smith”。但其中只有 500 个名字为“Smith”,状态为“Talking”。所以我需要找出一种更简单的方法来总结这些数字。也有名称为“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 行代表“Smith”和“Ready”。第 7 行和第 9 行是“Jones”和“Talking”等。

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

于 2013-11-01T13:52:11.820 回答
0

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

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


C. 为数组中的每一项设置名称数组的外循环

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

C. 当状态匹配时,另一个嵌套循环添加时间并放置在称为总时间的新列中。

于 2016-10-06T14:21:50.133 回答