Excel 如何循环使用VBA中的所有过滤器选项?

Excel 如何循环使用VBA中的所有过滤器选项?,excel,vba,autofilter,Excel,Vba,Autofilter,我想使用一个循环遍历过滤器中的每个条件,然后计算并输出平均值。下面的代码计算平均值并将其输出到第二张工作表的下一个空行,但不幸的是,这只适用于第一个过滤器选择。在循环的每个新迭代之后,什么都不会发生。有人能帮忙吗 宏中几乎没有更改。请注意,新添加的数组用于过滤条件的唯一值,循环从每个单元格更改为数组lastrow和RowCount变量替换为lastrow1和lastrow2 Sub avg() Dim wb As Workbook Set wb = ThisWorkbook Dim ws1

我想使用一个循环遍历过滤器中的每个条件,然后计算并输出平均值。下面的代码计算平均值并将其输出到第二张工作表的下一个空行,但不幸的是,这只适用于第一个过滤器选择。在循环的每个新迭代之后,什么都不会发生。有人能帮忙吗


宏中几乎没有更改。请注意,新添加的数组用于过滤条件的唯一值,循环从每个单元格更改为数组
lastrow
RowCount
变量替换为
lastrow1
lastrow2

Sub avg()
Dim wb As Workbook
Set wb = ThisWorkbook

Dim ws1 As Worksheet, ws2 As Worksheet
Dim cell As Range, rng1 As Range, rng1Crt As Range
Dim lastrow1 As Long, lastrow2 As Long, arr As Variant

Set ws1 = wb.Worksheets("Sheet1")
Set ws2 = wb.Worksheets("Sheet2")
lastrow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
Set rng1 = ws1.Range("G1:G" & lastrow1)

rng1.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Set rng1Crt = rng1.Cells.SpecialCells(xlCellTypeVisible)

'Populating array with filter criteria values
ReDim arr(0 To rng1Crt.Cells.Count - 1)
i = 0
For Each cell In rng1Crt.Cells
arr(i) = cell.Value
i = i + 1
Next

ws1.ShowAllData
rng1.AutoFilter

For i = 1 To UBound(arr)
    lastrow2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
    rng1.AutoFilter Field:=1, Criteria1:=arr(i)

    With ws1.AutoFilter.Range
    ws2.Range("A" & lastrow2 + 1) = ws1.Range("B" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Value2
    ws2.Range("B" & lastrow2 + 1) = ws1.Range("F" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Value2
    End With

    ws2.Range("C" & lastrow2 + 1) = Application.WorksheetFunction.Average(ws1.Range("Y2:Y" & lastrow1 & ",Z2:Z" & lastrow1 & ",AA2:AA" & lastrow1 _
    & ",AD2:AD" & lastrow1 & ",AE2:AE" & lastrow1 & ",AI2:AI" & lastrow1 & ",AK2:AK" & lastrow1 & ",AL2:AL" & lastrow1).SpecialCells(xlCellTypeVisible))

    ws2.Range("D" & lastrow2 + 1) = Application.WorksheetFunction.Average(ws1.Range("AF2:AF" & lastrow1 & ",AM2:AM" & lastrow1 & ",AP2:AP" & lastrow1 _
    & ",AQ2:AQ" & lastrow1 & ",AR2:AR" & lastrow1 & ",AS2:AS" & lastrow1 & ",AT2:AT" & lastrow1 & ",AU2:AU" & lastrow1).SpecialCells(xlCellTypeVisible))

    ws2.Range("E" & lastrow2 + 1) = Application.WorksheetFunction.Average(ws1.Range("AW2:AW" & lastrow1 & ",AX2:AX" & lastrow1 & ",AY2:AY" & lastrow1).SpecialCells(xlCellTypeVisible))

Next

End Sub

宏中几乎没有更改。请注意,新添加的数组用于过滤条件的唯一值,循环从每个单元格更改为数组
lastrow
RowCount
变量替换为
lastrow1
lastrow2

Sub avg()
Dim wb As Workbook
Set wb = ThisWorkbook

Dim ws1 As Worksheet, ws2 As Worksheet
Dim cell As Range, rng1 As Range, rng1Crt As Range
Dim lastrow1 As Long, lastrow2 As Long, arr As Variant

Set ws1 = wb.Worksheets("Sheet1")
Set ws2 = wb.Worksheets("Sheet2")
lastrow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
Set rng1 = ws1.Range("G1:G" & lastrow1)

rng1.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Set rng1Crt = rng1.Cells.SpecialCells(xlCellTypeVisible)

'Populating array with filter criteria values
ReDim arr(0 To rng1Crt.Cells.Count - 1)
i = 0
For Each cell In rng1Crt.Cells
arr(i) = cell.Value
i = i + 1
Next

ws1.ShowAllData
rng1.AutoFilter

For i = 1 To UBound(arr)
    lastrow2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
    rng1.AutoFilter Field:=1, Criteria1:=arr(i)

    With ws1.AutoFilter.Range
    ws2.Range("A" & lastrow2 + 1) = ws1.Range("B" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Value2
    ws2.Range("B" & lastrow2 + 1) = ws1.Range("F" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Value2
    End With

    ws2.Range("C" & lastrow2 + 1) = Application.WorksheetFunction.Average(ws1.Range("Y2:Y" & lastrow1 & ",Z2:Z" & lastrow1 & ",AA2:AA" & lastrow1 _
    & ",AD2:AD" & lastrow1 & ",AE2:AE" & lastrow1 & ",AI2:AI" & lastrow1 & ",AK2:AK" & lastrow1 & ",AL2:AL" & lastrow1).SpecialCells(xlCellTypeVisible))

    ws2.Range("D" & lastrow2 + 1) = Application.WorksheetFunction.Average(ws1.Range("AF2:AF" & lastrow1 & ",AM2:AM" & lastrow1 & ",AP2:AP" & lastrow1 _
    & ",AQ2:AQ" & lastrow1 & ",AR2:AR" & lastrow1 & ",AS2:AS" & lastrow1 & ",AT2:AT" & lastrow1 & ",AU2:AU" & lastrow1).SpecialCells(xlCellTypeVisible))

    ws2.Range("E" & lastrow2 + 1) = Application.WorksheetFunction.Average(ws1.Range("AW2:AW" & lastrow1 & ",AX2:AX" & lastrow1 & ",AY2:AY" & lastrow1).SpecialCells(xlCellTypeVisible))

Next

End Sub

嗨,欢迎来到苏。如果你需要每个标准的平均值,你能改用Pivot吗?@NareshBhople不,平均值是跨行的columns@NareshBhople我只是想确定一下,但在Pivot中似乎不可能更好地理解,我建议您提交一份示例数据或excel屏幕截图,并附上列,行号和工作表名称。@nareshbople链接到上面帖子中添加的图像。第二幅图显示代码在第一个SiteDate中有效,但是循环的下一次迭代没有任何作用,欢迎使用。如果你需要每个标准的平均值,你能改用Pivot吗?@NareshBhople不,平均值是跨行的columns@NareshBhople我只是想确定一下,但在Pivot中似乎不可能更好地理解,我建议您提交一份示例数据或excel屏幕截图,并附上列,行号和工作表名称。@nareshbople链接到上面帖子中添加的图像。第二幅图显示,代码适用于第一个SiteDate,但循环的下一次迭代对此没有多大影响——看起来好多了。我想我缺少的是阵列。然而,对我来说,它只输出47行的第一个过滤器选择(JVLWCA)。不确定为什么会这样?答案已编辑。。在循环中添加了行
rng1.AutoFilter字段:=7,准则1:=arr(i)
。。设置rng1更改为G1谢谢,希望是最后一个问题。。。现在,这给了我一个不同的选择(数组中的最后一个),但仍然对所有rowsgreat重复!那么现在您知道如何让它输出所有的过滤器选择,而不仅仅是一个吗?编辑:没关系,我这边有打字错误!一切都解决了。非常感谢你的帮助!!!非常感谢你,看起来好多了。我想我缺少的是阵列。然而,对我来说,它只输出47行的第一个过滤器选择(JVLWCA)。不确定为什么会这样?答案已编辑。。在循环中添加了行
rng1.AutoFilter字段:=7,准则1:=arr(i)
。。设置rng1更改为G1谢谢,希望是最后一个问题。。。现在,这给了我一个不同的选择(数组中的最后一个),但仍然对所有rowsgreat重复!那么现在您知道如何让它输出所有的过滤器选择,而不仅仅是一个吗?编辑:没关系,我这边有打字错误!一切都解决了。非常感谢你的帮助!!!