【问题标题】:How do I loop through criteria in Advanced Filter?如何遍历高级筛选器中的条件?
【发布时间】:2019-10-12 19:09:58
【问题描述】:

我正在尝试根据条件过滤表格并将结果复制并粘贴到不同的工作表中。

基本上我在一张表(“部门 ERP”)中存储了大量数据,我需要根据标准过滤列(“GLO_MASS_LINE”),然后将每个结果复制并粘贴到不同的表中。

由于自动筛选和后续的复制粘贴选项太慢,我决定使用高级筛选。我准备了大量的工作表(从工作表 11 到 38),我想在其中放置特定成本的详细信息(例如,我想过滤存储在“部门 ERP”中的表)用于员工教育并将结果复制并粘贴到工作表中("EDUC") = 工作表编号。 11),然后我想过滤“事件/关系营销”并将结果复制并粘贴到工作表(“ERMA”)等...)

Sub GetData2()
Dim wbData As Range

Dim wbCriteria As Range

Dim wbExtract As Range

Dim i As Integer

Dim GLO2 As Integer

GLO2 = 21

i = 11
Set wbData = Worksheets("Department ERP").Range("A:P")

For GLO2 = 21 To 48
Set wbCriteria = Worksheets("Inputs").Range(Cells(4, GLO2), Cells(5, GLO2))
Worksheets(i).Activate
         wbData.CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=wbCriteria, CopyToRange:=Worksheets(i).Range("A2"), Unique:=False

 i = i + 1

  Next GLO2

End Sub

我现在面临的问题是代码循环遍历工作表并过滤数据,但仅适用于第一个条件(条件仍然是第一个“员工教育”)。

你能帮我找出问题所在吗?任何帮助将不胜感激。

【问题讨论】:

    标签: excel vba loops advanced-filter


    【解决方案1】:

    我想这就是你想要的。

    Sub Copy_With_AutoFilter1()
    'Note: This macro use the function LastRow
        Dim My_Range As Range
        Dim CalcMode As Long
        Dim ViewMode As Long
        Dim FilterCriteria As String
        Dim CCount As Long
        Dim WSNew As Worksheet
        Dim sheetName As String
        Dim rng As Range
    
        'Set filter range on ActiveSheet: A1 is the top left cell of your filter range
        'and the header of the first column, D is the last column in the filter range.
        'You can also add the sheet name to the code like this :
        'Worksheets("Sheet1").Range("A1:D" & LastRow(Worksheets("Sheet1")))
        'No need that the sheet is active then when you run the macro when you use this.
        Set My_Range = Range("A1:D" & LastRow(ActiveSheet))
        My_Range.Parent.Select
    
        If ActiveWorkbook.ProtectStructure = True Or _
           My_Range.Parent.ProtectContents = True Then
            MsgBox "Sorry, not working when the workbook or worksheet is protected", _
                   vbOKOnly, "Copy to new worksheet"
            Exit Sub
        End If
    
        'Change ScreenUpdating, Calculation, EnableEvents, ....
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
        ViewMode = ActiveWindow.View
        ActiveWindow.View = xlNormalView
        ActiveSheet.DisplayPageBreaks = False
    
        'Firstly, remove the AutoFilter
        My_Range.Parent.AutoFilterMode = False
    
        'Filter and set the filter field and the filter criteria :
        'This example filter on the first column in the range (change the field if needed)
        'In this case the range starts in A so Field 1 is column A, 2 = column B, ......
        'Use "<>Netherlands" as criteria if you want the opposite
        My_Range.AutoFilter Field:=1, Criteria1:="=Netherlands"
    
        'If you want to filter on a cell value you can use this, use "<>" for the opposite
        'This example uses the activecell value
        'My_Range.AutoFilter Field:=1, Criteria1:="=" & ActiveCell.Value
    
        'This will use the cell value from A2 as criteria
        'My_Range.AutoFilter Field:=1, Criteria1:="=" & Range("A2").Value
    
        ''If you want to filter on a Inputbox value use this
        'FilterCriteria = InputBox("What text do you want to filter on?", _
         '                              "Enter the filter item.")
        'My_Range.AutoFilter Field:=1, Criteria1:="=" & FilterCriteria
    
        'Check if there are not more then 8192 areas(limit of areas that Excel can copy)
        CCount = 0
        On Error Resume Next
        CCount = My_Range.Columns(1).SpecialCells(xlCellTypeVisible).Areas(1).Cells.Count
        On Error GoTo 0
        If CCount = 0 Then
            MsgBox "There are more than 8192 areas:" _
                 & vbNewLine & "It is not possible to copy the visible data." _
                 & vbNewLine & "Tip: Sort your data before you use this macro.", _
                   vbOKOnly, "Copy to worksheet"
        Else
            'Add a new Worksheet
            Set WSNew = Worksheets.Add(After:=Sheets(ActiveSheet.Index))
    
            'Ask for the Worksheet name
            sheetName = InputBox("What is the name of the new worksheet?", _
                                 "Name the New Sheet")
    
            On Error Resume Next
            WSNew.Name = sheetName
            If Err.Number > 0 Then
                MsgBox "Change the name of sheet : " & WSNew.Name & _
                     " manually after the macro is ready. The sheet name" & _
                     " you fill in already exists or you use characters" & _
                     " that are not allowed in a sheet name."
                Err.Clear
            End If
            On Error GoTo 0
    
            'Copy/paste the visible data to the new worksheet
            My_Range.Parent.AutoFilter.Range.Copy
            With WSNew.Range("A1")
                ' Paste:=8 will copy the columnwidth in Excel 2000 and higher
                ' Remove this line if you use Excel 97
                .PasteSpecial Paste:=8
                .PasteSpecial xlPasteValues
                .PasteSpecial xlPasteFormats
                Application.CutCopyMode = False
                .Select
            End With
    
            ' If you want to delete the rows that you copy, also use this
            ' With My_Range.Parent.AutoFilter.Range
            '     On Error Resume Next
            '     Set rng = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) _
            '               .SpecialCells(xlCellTypeVisible)
            '     On Error GoTo 0
            '     If Not rng Is Nothing Then rng.EntireRow.Delete
            ' End With
    
        End If
    
        'Close AutoFilter
        My_Range.Parent.AutoFilterMode = False
    
        'Restore ScreenUpdating, Calculation, EnableEvents, ....
        My_Range.Parent.Select
        ActiveWindow.View = ViewMode
        If Not WSNew Is Nothing Then WSNew.Select
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    
    End Sub
    
    
    Function LastRow(sh As Worksheet)
        On Error Resume Next
        LastRow = sh.Cells.Find(What:="*", _
                                After:=sh.Range("A1"), _
                                Lookat:=xlPart, _
                                LookIn:=xlValues, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlPrevious, _
                                MatchCase:=False).Row
        On Error GoTo 0
    End Function
    

    有关其他想法,请参阅下面的链接。

    https://www.rondebruin.nl/win/s3/win006.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      相关资源
      最近更新 更多