Vba 如何在同一个子系统中进行过滤、计数和循环

Vba 如何在同一个子系统中进行过滤、计数和循环,vba,excel,Vba,Excel,我有一张像图中一样的桌子(只大一点) A列中有些数字重复。我需要过滤A列并计算B列的和。 就像第二张照片 若B列之和大于90,则将其计为一。 我需要对A列中的每个唯一编号执行相同的步骤 简而言之:我需要知道有多少唯一的列A ID的列B的和大于90。 我想使用“For Each Next”,但因为我不知道如何使代码只使用唯一的值,所以我将整个列复制到不同的工作表中,删除重复项并将其用作参考 另外,我不知道如何使代码只使用公式中的过滤单元格,所以我添加了计算小计公式的单元格,并尝试使用VBA代码检

我有一张像图中一样的桌子(只大一点)

A列中有些数字重复。我需要过滤A列并计算B列的和。 就像第二张照片

若B列之和大于90,则将其计为一。 我需要对A列中的每个唯一编号执行相同的步骤

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

我想使用“For Each Next”,但因为我不知道如何使代码只使用唯一的值,所以我将整个列复制到不同的工作表中,删除重复项并将其用作参考

另外,我不知道如何使代码只使用公式中的过滤单元格,所以我添加了计算小计公式的单元格,并尝试使用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类的自动筛选方法失败”

我的问题是:

如何修复我的代码

其他问题:

  • 是否可以在没有辅助表的情况下执行所有操作(仅循环A列中的唯一值)
  • 如何在VBA中直接计算仅过滤的B列值之和(不使用辅助单元格和小计公式)

  • 不确定这是否是您想要的,数据的顺序是否重要,但您可以尝试一下

    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 arguments 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)。根据需要编辑。

    为什么不试试透视表呢?这将自动为您提供a中唯一项的列表及其对应的B总和。感谢代码工作得非常完美(只是做了一些小的修改,而不是i=2到25用于i=2到范围(“表1”).Rows.Count)。自从我尝试学习VBA以来,我就试图理解代码的工作原理。我对第二行“如果currentCustomerDays>90,那么totalCount=totalCount+1(在下一个I之后)”感到困惑,为什么它是必要的?循环结束后不保存循环中的结果?这是为了捕获客户ID的最后一次出现。否则它将永远看不到最终客户。另一种选择是循环直到客户之后的第一个空白单元格,从而确保捕获最后一个客户。