如何在同一个Sub中过滤,计算sum和loop

问题描述 投票:0回答:1

我在图片中有一张桌子(只有更大)。 enter image description here

在A列中,有些数字重复。我需要过滤列A并计算列B的总和。如第二张图片所示。

enter image description here

如果列B的总和大于90,则将其计为一。我需要对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值的总和(不使用带小计公式的辅助单元格)。
excel vba excel-vba
1个回答
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)运行。根据需要进行编辑。

© www.soinside.com 2019 - 2024. All rights reserved.