嵌套For循环和过滤后的数据

时间:2016-04-21 18:18:08

标签: excel vba excel-vba for-loop autofilter

问候人们。

寻找有人指出我正确的方向,以帮助我继续搜索信息...我认为我正在接近问题,这可能是我的术语或我正在寻找的东西。

我正在使用一组vba代码来计算数据转储中的特定值,并使用它来填充“跟踪器”表单上的网格/表格(基于过滤器和条件)。

我已经能够使用以下代码获得正确匹配值的数量:

LastRow = Sheets("Colums").Range("AC" & Rows.Count).End(xlUp).Row: vD14 = 0
For Each c1 In Sheets("Colums").Range("AC1:AC" & LastRow)
    If c1.Value = "Wired" Then
      vD14 = vD14 + 1
    End If
Next c1
    Sheets("Tracker-Import Data").Range("D14").Value = vD14  ‘paste the count value into D14 of this sheet

但我很难找到一种方法来“嵌套”多个条件并计算重新精炼的过滤数据。作为一个例子,我尝试使用一些嵌套来调整上面的代码,使用它进一步向下钻取(这不起作用)。编辑编辑 - 澄清 - 过滤数据在多列上。所以'有线'在AC列中,In-Progress可能在E。

'    LastRow = Sheets("Colum").Range("E" & Rows.Count).End(xlUp).Row: vF13 =     0 'count items in col E
'    For Each c1 In Sheets("Colum,").Range("E1:E" & LastRow)
'        If c1.Value = "In-Progress" Then
'            For Each c2 In Sheets("Colum,").Range("AC1:AC" & LastRow)
'                If c2.Value = "Wired" Then
'                vF13 = vF13 + 1
'                End If
'            Next c2
'        End If
'    Next c1
'    Sheets("Tracker-Import and Data").Range("F13").Value = vF13

在代码的单独部分中,我已经可以提取高级/自动过滤数据并将该数据粘贴到新工作表中。我使用下面的这一位来过滤并将行粘贴到新的/空白工作表上,这也适用于:

With Sheets("Colums")
.Rows(1).Insert 'temporary "header" row to allow for subsequent Autofilter operations

 Set dataRng = Range(.Cells(1, 1), .Cells(2, 1).CurrentRegion)
    With dataRng
    .Rows(1).Value = "temp header" ' assign temporary headers. no matter they actual value, since autofilter will use columns index
    .AutoFilter Field:=6, Criteria1:="aaaa", Operator:=xlOr, Criteria2:="bbb"
    .AutoFilter Field:=5, Criteria1:="ccc" 
    .AutoFilter Field:=29, Criteria1:="Wired"

     If Application.WorksheetFunction.Subtotal(103, .Columns("A")) > 1 Then    .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Copy Destination:=Worksheets(newTab1).Range("A2")
    .AutoFilter 'remove filters
     End With
    .Rows(1).Delete 'remove temporary "header" row
    Sheets("Colums").Range("A1").EntireRow.Copy Destination:=Sheets(newTab1).Range("A1")  

我现在基本上有两段代码......并希望保持这种方式:一个用于填充'Tracker'表单上的表值,另一个用于将行/列数据填充到子调用创建的NEW表单上。

将值发送到新工作表的代码工作正常,但由于需要“嵌套”过滤器,我只能在特定“跟踪器”工作表上填充表值方面取得部分成功。如何向第一位添加更高级的过滤以计算精炼值。

我在网上发现的唯一接近这种情况的是这条线,但我不确定如何正确地将它与我所拥有的(或者如果它是正确的解决方案)合并:     Rowz = ws.AutoFilter.Range.Columns(5).SpecialCells(xlCellTypeVisible).Cells.Count - 1

如何修改第一个代码块以具有多个嵌套条件并COUNT这些值?我想我必须在上面的第一个代码块中使用这样的东西,但我不确定如何添加类似自动过滤器代码的东西以获得更好的For循环?

3 个答案:

答案 0 :(得分:1)

我不确定我是否完全正确地提出了这个问题,但这里有一些评论:

要遍历某个范围并检查多个条件,我会在行上循环,而不是每个使用

Sub test()

vF13 = 0
With Sheets("colums")
    LastRow = .Range("AC" & .Rows.Count).End(xlUp).Row
    For i = LastRow To 2 Step -1
        If .Range("E" & i).Value = "In Progress" And .Range("AC" & i).Value = "Wired" Then
        vF13 = vF13 + 1
        End If
    Next
End With
Sheets("Tracker-Import and Data").Range("F13").Value = vF13
End Sub

对于自动过滤器,您可以使用自动过滤器,然后使用上面列出的计数功能

Sub autofilter()
'clear autofilters from sheet
Sheets("sheet2").AutoFilterMode = False

With Sheets("sheet2")
    LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    With .Range("A1:C" & LastRow)
    'add 1 autofilter
    .autofilter field:=1, Criteria1:="1"
    'add another autofulter
    .autofilter field:=2, Criteria1:=">=3"
    'count rows
    visibleRows = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
    End With
End With

End Sub

答案 1 :(得分:0)

我可能会离开这里,但似乎你可以在最后一组嵌套中使用带有计数器的If语句。

答案 2 :(得分:0)

对于你遇到的具体问题,我认为你可以在没有第二个循环的情况下解决它,只需使用Offset方法。 (我用手指 - E到AC是24对吗?)

dataset.table00
dataset.table01
dataset.table02
...
dataset.table99