根据第一张

时间:2017-03-15 00:51:34

标签: excel vba excel-vba autofilter

我正在尝试在excel中创建一个动态自动过滤器,它可以根据用户在第一张纸中选择的过滤器应用于excel中的所有纸张(总数:5)。

例如:我在Excel中有5张不同的列和1个“主键”列。 Sheet1 =标题 - PK,Col1,Col2 ...... Sheet2 =标题 - PK,Col6,Col7 ...... 。 。 Sheet5 =标题 - PK,Col20,Col21 ......

过滤器的工作方式应该是,用户通过选择标题然后在Home>创建一个过滤器在sheet1上的列标题上。排序&过滤。一旦我们在标题上有过滤器,用户就可以在第一列(PK)上选择多个值(复选框),现在希望该过滤器应用于PK列的所有表格。

我能够创建一个自动过滤器,但它实际上是静态的,并且不会根据用户输入而改变。

版本:MS OFFice Excel 2010

VB Macro:

Sub apply_autofilter_across_worksheets()
Dim xWs As Worksheet
On Error Resume Next
For Each xWs In Worksheets
    xWs.Range("A1").AutoFilter 1, "=Sheet1!$A$1"
Next
End Sub

我对excel相对较新。在这种情况下,我在第一张纸上过滤的列是一个数字,所以我在条件中尝试使用的数组似乎是一个文本。

1 个答案:

答案 0 :(得分:0)

不完全是我正在寻找的解决方案但我认为我可以让最终用户使用此设置。我最终创建了一个单独的工作表,它将用作参考过滤器。要填充此工作表中的数据,用户可以从sheet1复制他需要的任何数据,例如 - 他想要过滤的前5个记录。

  1. 使用他需要过滤的数据填充REFERENCE表。
  2. 预先创建的动态命名范围。在这种情况下 - Critlist
  3. 运行下面的宏并过滤所有工作表。
  4. 注意:在这种情况下,我通常使用REFERENCE表中的第二列($ B)创建此动态列表,因为我的过滤器将循环遍历所有工作表并过滤第一列。一旦它到达参考表,就不会找到第一列,因此可以干净地退出。

    我使用下面的参考资料来帮助解决这个问题。几个经验教训 - 1.链接中使用的数组是myarray,它根据示例文件适用于它们的用例,但是当我循环时我不得不使用myarray(i,1) - 参考#3。不知道为什么它需要二维数组才能工作。 2.在参考文献#1中创建的数组是值范围 - sheet.Range("")。值虽然在我的情况下我创建了一个数组作为sheet.Range("" )即没有价值。

    VB宏:

    Option Explicit
    
    Public Sub apply_autofilter_across_worksheets()
    Dim myarray As Variant, xWs As Worksheet, wsL As Worksheet, i As Long
        Set wsL = Worksheets("REFERENCE")
        myarray = wsL.Range("CritList")
        For i = LBound(myarray, 1) To UBound(myarray, 1)
            myarray(i, 1) = CStr(myarray(i, 1))
        Next
        For Each xWs In Worksheets
            xWs.Range("$A$1").AutoFilter _
            Field:=1, _
            Criteria1:=Application.WorksheetFunction.Transpose(myarray), _
            Operator:=xlFilterValues
        Next
    End Sub
    

    修改

    我认为即使没有创建额外的工作表(我希望理想的方式),我也找到了更好的方法。创建相同列表的概念相同,但在这种情况下,我不是单独创建它,而是在第一张纸上创建它,我想从中驱动选择/过滤。然后通过使用 .SpecialCells(xlCellTypeVisible).EntireRow ,我们只能选择工作表上可见的内容,即过滤后的标准,然后将其应用于循环中的剩余工作表。在这种情况下,即使它覆盖了第一张纸,它也不应该是一个问题,因为它已经按我们想要的方式过滤了。这也应该是可重复的,因为每次引用列表更改时,它都应该通过运行宏来动态更新其余的过滤器。

    VB代码:

    Option Explicit
    
    Public Sub Filter_RFX()
    Dim myarray As Variant, xWs As Worksheet, wsL As Worksheet, i As Long
        Set wsL = Worksheets("Sheet1")
        myarray = wsL.Range("CritList").SpecialCells(xlCellTypeVisible).EntireRow
        For i = LBound(myarray, 1) To UBound(myarray, 1)
            myarray(i, 1) = CStr(myarray(i, 1))
        Next
        For Each xWs In Worksheets
            xWs.Range("$A$1").AutoFilter _
            Field:=1, _
            Criteria1:=Application.WorksheetFunction.Transpose(myarray), _
            Operator:=xlFilterValues
        Next
    End Sub
    

    参考: 1. http://www.contextures.com/xlNames01.html#videodynamic

    1. http://blog.contextures.com/archives/2010/12/15/excel-autofilter-with-criteria-in-a-range/

    2. http://www.java2s.com/Code/VBA-Excel-Access-Word/Data-Type/UseLBoundandUBoundinforstatement.htm