如何在同一个Sub

时间:2018-09-06 11:32:21

标签: excel vba excel-vba

我的桌子就像图片中的桌子一样(只有更大的)。 enter image description here

在A列中一些数字重复。我需要过滤A列并计算B列的总和。 就像第二张图片一样。

enter image description here

如果B列的总和大于90,则将其计为1。 我需要对A列中的每个唯一编号执行相同的操作。

简而言之:我需要知道有多少唯一的列A ID的列B之和大于90。

我想使用“ For Each Next”,但是由于我无法弄清楚如何使代码仅使用唯一值,因此我将整个A列复制到了不同的工作表中,删除了重复项并将其用作参考。

我也不知道如何使代码仅在公式中使用过滤后的单元格,因此我添加了对小计公式进行计数的单元格,然后尝试使用VBA代码来检查其值。

这是我到目前为止提出的:

Sub SkaiciuotiCB_Click()

Dim rng As Range
Set rng = Sheets("Sheet2").Range("A1:A229")

For Each Cell In rng
    Sheets("Sheet1").Range("A2:O2").AutoFilter Field = 8, Criteria1 = Cell.Value
    If Sheets("Sheet1").Range("I793").Value >= 90 Then
            Sheets("Sheet1").Range("C1").Value = Sheets("Sheet1").Range("C1").Value + 1
        End If
    Sheets("Sheet1").AutoFilterMode = False
    Next
End Sub

这时,我收到“运行时错误'1004':Range类的AutoFilter方法失败”

我的问题:

如何修复我的代码。

其他问题:

  1. 是否可以在没有帮助表的情况下做所有事情(仅遍历A列中的唯一值)。
  2. 如何直接在VBA中直接计算仅过滤的列B值的总和(不使用具有小计公式的辅助单元格)。

1 个答案:

答案 0 :(得分:0)

不确定这是您要的吗,以及数据的顺序是否重要,但是您可以尝试

Sub Macro1()

    Dim i As Long
    Dim currentCustomer As String
    Dim currentCustomerDays As Integer
    Dim totalCount As Integer

    totalCount = 0

    'Clear sorting rules
    Worksheets("Sheet1").Sort.SortFields.Clear

    'Sort by first column
    Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("A2:A25") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

    'Set sorting arguements and do sort
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:B25")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With


    'run through list
    For i = 2 To 25

        If currentCustomer = Worksheets("Sheet1").Cells(i, "A").Value Then

            currentCustomerDays = currentCustomerDays + Worksheets("Sheet1").Cells(i, "B").Value

        Else

            If currentCustomerDays > 90 Then totalCount = totalCount + 1

            currentCustomer = Worksheets("Sheet1").Cells(i, "A").Value

            currentCustomerDays = Worksheets("Sheet1").Cells(i, "B").Value

        End If

    Next i

    If currentCustomerDays > 90 Then totalCount = totalCount + 1

    Debug.Print totalCount

End Sub

此示例将遍历工作表1上的表格(A1:B25)。